Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: src/compiler/arm64/code-generator-arm64.cc

Issue 2785723002: [wasm][arm64] Add an additional stack check for functions with big frames (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/arm64/assembler-arm64-inl.h" 7 #include "src/arm64/assembler-arm64-inl.h"
8 #include "src/arm64/frames-arm64.h" 8 #include "src/arm64/frames-arm64.h"
9 #include "src/arm64/macro-assembler-arm64-inl.h" 9 #include "src/arm64/macro-assembler-arm64-inl.h"
10 #include "src/compilation-info.h" 10 #include "src/compilation-info.h"
(...skipping 1939 matching lines...) Expand 10 before | Expand all | Expand 10 after
1950 // unoptimized 1950 // unoptimized
1951 // frame is still on the stack. Optimized code uses OSR values directly 1951 // frame is still on the stack. Optimized code uses OSR values directly
1952 // from 1952 // from
1953 // the unoptimized frame. Thus, all that needs to be done is to allocate 1953 // the unoptimized frame. Thus, all that needs to be done is to allocate
1954 // the 1954 // the
1955 // remaining stack slots. 1955 // remaining stack slots.
1956 if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --"); 1956 if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --");
1957 osr_pc_offset_ = __ pc_offset(); 1957 osr_pc_offset_ = __ pc_offset();
1958 shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); 1958 shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots();
1959 } 1959 }
1960
1961 if (info()->IsWasm() && shrink_slots > 128) {
1962 // For WebAssembly functions with big frames we have to do the stack
1963 // overflow check before we construct the frame. Otherwise we may not
1964 // have enough space on the stack to call the runtime for the stack
1965 // overflow.
1966 Label done;
1967 // If the frame is bigger than the stack, we throw the stack overflow
1968 // exception unconditionally. Thereby we can avoid the integer overflow
1969 // check in the condition code.
1970 if (shrink_slots * kPointerSize < FLAG_stack_size * 1024) {
1971 UseScratchRegisterScope scope(masm());
1972 Register scratch = scope.AcquireX();
1973 __ Mov(
1974 scratch,
1975 Operand(ExternalReference::address_of_real_stack_limit(isolate())));
1976 __ Ldr(scratch, MemOperand(scratch));
1977 __ Add(scratch, scratch, Operand(shrink_slots * kPointerSize));
1978 __ Cmp(__ StackPointer(), scratch);
1979 __ B(cs, &done);
1980 }
1981
1982 if (!frame_access_state()->has_frame()) {
1983 __ set_has_frame(true);
1984 // There is no need to leave the frame, we will not return from the
1985 // runtime call.
1986 __ EnterFrame(StackFrame::WASM_COMPILED);
1987 }
1988 // Initialize the jssp because it is required for the runtime call.
1989 __ Mov(jssp, csp);
Rodolph Perfetta 2017/04/05 15:13:35 You also need to set jssp as the stack pointer for
ahaas 2017/04/10 09:51:21 Done. I set the stack pointer to the jssp now, and
1990 __ Move(cp, Smi::kZero);
1991 __ CallRuntime(Runtime::kThrowWasmStackOverflow);
1992 // We come from WebAssembly, there are no references for the GC.
1993 ReferenceMap* reference_map = new (zone()) ReferenceMap(zone());
1994 RecordSafepoint(reference_map, Safepoint::kSimple, 0,
1995 Safepoint::kNoLazyDeopt);
1996 if (FLAG_debug_code) {
1997 __ Brk(0);
1998 }
1999
2000 __ bind(&done);
2001 }
2002
1960 // Build remainder of frame, including accounting for and filling-in 2003 // Build remainder of frame, including accounting for and filling-in
1961 // frame-specific header information, e.g. claiming the extra slot that 2004 // frame-specific header information, e.g. claiming the extra slot that
1962 // other platforms explicitly push for STUB frames and frames recording 2005 // other platforms explicitly push for STUB frames and frames recording
1963 // their argument count. 2006 // their argument count.
1964 __ Claim(shrink_slots + (fixed_frame_size & 1)); 2007 __ Claim(shrink_slots + (fixed_frame_size & 1));
1965 if (descriptor->PushArgumentCount()) { 2008 if (descriptor->PushArgumentCount()) {
1966 __ Str(kJavaScriptCallArgCountRegister, 2009 __ Str(kJavaScriptCallArgCountRegister,
1967 MemOperand(fp, OptimizedBuiltinFrameConstants::kArgCOffset)); 2010 MemOperand(fp, OptimizedBuiltinFrameConstants::kArgCOffset));
1968 } 2011 }
1969 bool is_stub_frame = 2012 bool is_stub_frame =
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
2245 padding_size -= kInstructionSize; 2288 padding_size -= kInstructionSize;
2246 } 2289 }
2247 } 2290 }
2248 } 2291 }
2249 2292
2250 #undef __ 2293 #undef __
2251 2294
2252 } // namespace compiler 2295 } // namespace compiler
2253 } // namespace internal 2296 } // namespace internal
2254 } // namespace v8 2297 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698