| Index: src/arm/assembler-arm.h
|
| diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h
|
| index ccb5104206883e9891fce042208538cd8dab2613..04089d378e04b186eeae1945a39e03b94818e3b4 100644
|
| --- a/src/arm/assembler-arm.h
|
| +++ b/src/arm/assembler-arm.h
|
| @@ -780,9 +780,27 @@ class Assembler : public AssemblerBase {
|
| // the branch/call instruction at pc, or the object in a mov.
|
| INLINE(static Address target_pointer_address_at(Address pc));
|
|
|
| + // Return the address in the constant pool of the code target address used by
|
| + // the branch/call instruction at pc, or the object in a mov.
|
| + INLINE(static Address target_constant_pool_address_at(
|
| + Address pc, ConstantPoolArray* constant_pool));
|
| +
|
| // Read/Modify the code target address in the branch/call instruction at pc.
|
| - INLINE(static Address target_address_at(Address pc));
|
| - INLINE(static void set_target_address_at(Address pc, Address target));
|
| + INLINE(static Address target_address_at(Address pc,
|
| + ConstantPoolArray* constant_pool));
|
| + INLINE(static void set_target_address_at(Address pc,
|
| + ConstantPoolArray* constant_pool,
|
| + Address target));
|
| + INLINE(static Address target_address_at(Address pc, Code* code)) {
|
| + ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL;
|
| + return target_address_at(pc, constant_pool);
|
| + }
|
| + INLINE(static void set_target_address_at(Address pc,
|
| + Code* code,
|
| + Address target)) {
|
| + ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL;
|
| + set_target_address_at(pc, constant_pool, target);
|
| + }
|
|
|
| // Return the code target address at a call site from the return address
|
| // of that call in the instruction stream.
|
| @@ -795,7 +813,7 @@ class Assembler : public AssemblerBase {
|
| // This sets the branch destination (which is in the constant pool on ARM).
|
| // This is for calls and branches within generated code.
|
| inline static void deserialization_set_special_target_at(
|
| - Address constant_pool_entry, Address target);
|
| + Address constant_pool_entry, Code* code, Address target);
|
|
|
| // Here we are patching the address in the constant pool, not the actual call
|
| // instruction. The address in the constant pool is the same size as a
|
| @@ -1292,12 +1310,6 @@ class Assembler : public AssemblerBase {
|
| // Jump unconditionally to given label.
|
| void jmp(Label* L) { b(L, al); }
|
|
|
| - static bool use_immediate_embedded_pointer_loads(
|
| - const Assembler* assembler) {
|
| - return CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) &&
|
| - (assembler == NULL || !assembler->predictable_code_size());
|
| - }
|
| -
|
| // Check the code size generated from label to here.
|
| int SizeOfCodeGeneratedSince(Label* label) {
|
| return pc_offset() - label->pos();
|
| @@ -1446,6 +1458,14 @@ class Assembler : public AssemblerBase {
|
| // Check if is time to emit a constant pool.
|
| void CheckConstPool(bool force_emit, bool require_jump);
|
|
|
| + bool can_use_constant_pool() const {
|
| + return is_constant_pool_available() && !constant_pool_full_;
|
| + }
|
| +
|
| + void set_constant_pool_full() {
|
| + constant_pool_full_ = true;
|
| + }
|
| +
|
| protected:
|
| // Relocation for a type-recording IC has the AST id added to it. This
|
| // member variable is a way to pass the information from the call site to
|
| @@ -1499,6 +1519,14 @@ class Assembler : public AssemblerBase {
|
| (pc_offset() < no_const_pool_before_);
|
| }
|
|
|
| + bool is_constant_pool_available() const {
|
| + return constant_pool_available_;
|
| + }
|
| +
|
| + void set_constant_pool_available(bool available) {
|
| + constant_pool_available_ = available;
|
| + }
|
| +
|
| private:
|
| int next_buffer_check_; // pc offset of next buffer check
|
|
|
| @@ -1559,16 +1587,22 @@ class Assembler : public AssemblerBase {
|
| // The bound position, before this we cannot do instruction elimination.
|
| int last_bound_pos_;
|
|
|
| + // Indicates whether the constant pool can be accessed, which is only possible
|
| + // if the pp register points to the current code object's constant pool.
|
| + bool constant_pool_available_;
|
| + // Indicates whether the constant pool is too full to accept new entries due
|
| + // to the ldr instruction's limitted immediate offset range.
|
| + bool constant_pool_full_;
|
| +
|
| // Code emission
|
| inline void CheckBuffer();
|
| void GrowBuffer();
|
| inline void emit(Instr x);
|
|
|
| // 32-bit immediate values
|
| - void move_32_bit_immediate(Condition cond,
|
| - Register rd,
|
| - SBit s,
|
| - const Operand& x);
|
| + void move_32_bit_immediate(Register rd,
|
| + const Operand& x,
|
| + Condition cond = al);
|
|
|
| // Instruction generation
|
| void addrmod1(Instr instr, Register rn, Register rd, const Operand& x);
|
| @@ -1596,6 +1630,8 @@ class Assembler : public AssemblerBase {
|
| friend class RelocInfo;
|
| friend class CodePatcher;
|
| friend class BlockConstPoolScope;
|
| + friend class FrameAndConstantPoolScope;
|
| + friend class ConstantPoolUnavailableScope;
|
|
|
| PositionsRecorder positions_recorder_;
|
| friend class PositionsRecorder;
|
|
|