| Index: src/arm/regexp-macro-assembler-arm.cc
|
| diff --git a/src/arm/regexp-macro-assembler-arm.cc b/src/arm/regexp-macro-assembler-arm.cc
|
| index 94da04240d6127e3b08c7abbf43dd74c19c3c5ad..1f6ed6712d5bbe03f4ea55309512612a8104e0e1 100644
|
| --- a/src/arm/regexp-macro-assembler-arm.cc
|
| +++ b/src/arm/regexp-macro-assembler-arm.cc
|
| @@ -57,48 +57,57 @@ namespace internal {
|
| * - r13/sp : points to tip of C stack.
|
| *
|
| * The remaining registers are free for computations.
|
| - *
|
| * Each call to a public method should retain this convention.
|
| + *
|
| * The stack will have the following structure:
|
| - * - direct_call (if 1, direct call from JavaScript code, if 0 call
|
| - * through the runtime system)
|
| - * - stack_area_base (High end of the memory area to use as
|
| - * backtracking stack)
|
| - * - int* capture_array (int[num_saved_registers_], for output).
|
| - * --- sp when called ---
|
| - * - link address
|
| - * - backup of registers r4..r11
|
| - * - end of input (Address of end of string)
|
| - * - start of input (Address of first character in string)
|
| - * - start index (character index of start)
|
| - * --- frame pointer ----
|
| - * - void* input_string (location of a handle containing the string)
|
| - * - Offset of location before start of input (effectively character
|
| - * position -1). Used to initialize capture registers to a non-position.
|
| - * - At start (if 1, we are starting at the start of the
|
| - * string, otherwise 0)
|
| - * - register 0 (Only positions must be stored in the first
|
| - * - register 1 num_saved_registers_ registers)
|
| - * - ...
|
| - * - register num_registers-1
|
| - * --- sp ---
|
| + * - fp[48] direct_call (if 1, direct call from JavaScript code,
|
| + * if 0, call through the runtime system).
|
| + * - fp[44] stack_area_base (High end of the memory area to use as
|
| + * backtracking stack).
|
| + * - fp[40] int* capture_array (int[num_saved_registers_], for output).
|
| + * - fp[36] secondary link/return address used by native call.
|
| + * --- sp when called ---
|
| + * - fp[32] return address (lr).
|
| + * - fp[28] old frame pointer (r11).
|
| + * - fp[0..24] backup of registers r4..r10.
|
| + * --- frame pointer ----
|
| + * - fp[-4] end of input (Address of end of string).
|
| + * - fp[-8] start of input (Address of first character in string).
|
| + * - fp[-12] start index (character index of start).
|
| + * - fp[-16] void* input_string (location of a handle containing the string).
|
| + * - fp[-20] Offset of location before start of input (effectively character
|
| + * position -1). Used to initialize capture registers to a
|
| + * non-position.
|
| + * - fp[-24] At start (if 1, we are starting at the start of the
|
| + * string, otherwise 0)
|
| + * - fp[-28] register 0 (Only positions must be stored in the first
|
| + * - register 1 num_saved_registers_ registers)
|
| + * - ...
|
| + * - register num_registers-1
|
| + * --- sp ---
|
| *
|
| * The first num_saved_registers_ registers are initialized to point to
|
| * "character -1" in the string (i.e., char_size() bytes before the first
|
| * character of the string). The remaining registers start out as garbage.
|
| *
|
| * The data up to the return address must be placed there by the calling
|
| - * code, by calling the code entry as cast to a function with the signature:
|
| + * code and the remaining arguments are passed in registers, e.g. by calling the
|
| + * code entry as cast to a function with the signature:
|
| * int (*match)(String* input_string,
|
| * int start_index,
|
| * Address start,
|
| * Address end,
|
| + * Address secondary_return_address, // Only used by native call.
|
| * int* capture_output_array,
|
| - * bool at_start,
|
| * byte* stack_area_base,
|
| - * bool direct_call)
|
| + * bool direct_call = false)
|
| * The call is performed by NativeRegExpMacroAssembler::Execute()
|
| - * (in regexp-macro-assembler.cc).
|
| + * (in regexp-macro-assembler.cc) via the CALL_GENERATED_REGEXP_CODE macro
|
| + * in arm/simulator-arm.h.
|
| + * When calling as a non-direct call (i.e., from C++ code), the return address
|
| + * area is overwritten with the LR register by the RegExp code. When doing a
|
| + * direct call from generated code, the return address is placed there by
|
| + * the calling code, as in a normal exit frame.
|
| */
|
|
|
| #define __ ACCESS_MASM(masm_)
|
| @@ -598,16 +607,17 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
|
|
|
| // Entry code:
|
| __ bind(&entry_label_);
|
| - // Push Link register.
|
| // Push arguments
|
| // Save callee-save registers.
|
| // Start new stack frame.
|
| + // Store link register in existing stack-cell.
|
| // Order here should correspond to order of offset constants in header file.
|
| RegList registers_to_retain = r4.bit() | r5.bit() | r6.bit() |
|
| r7.bit() | r8.bit() | r9.bit() | r10.bit() | fp.bit();
|
| RegList argument_registers = r0.bit() | r1.bit() | r2.bit() | r3.bit();
|
| __ stm(db_w, sp, argument_registers | registers_to_retain | lr.bit());
|
| - // Set frame pointer just above the arguments.
|
| + // Set frame pointer in space for it if this is not a direct call
|
| + // from generated code.
|
| __ add(frame_pointer(), sp, Operand(4 * kPointerSize));
|
| __ push(r0); // Make room for "position - 1" constant (value is irrelevant).
|
| __ push(r0); // Make room for "at start" constant (value is irrelevant).
|
| @@ -764,10 +774,9 @@ Handle<Object> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
|
| if (stack_overflow_label_.is_linked()) {
|
| SafeCallTarget(&stack_overflow_label_);
|
| // Reached if the backtrack-stack limit has been hit.
|
| -
|
| Label grow_failed;
|
|
|
| - // Call GrowStack(backtrack_stackpointer())
|
| + // Call GrowStack(backtrack_stackpointer(), &stack_base)
|
| static const int num_arguments = 2;
|
| __ PrepareCallCFunction(num_arguments, r0);
|
| __ mov(r0, backtrack_stackpointer());
|
|
|