diff options
Diffstat (limited to 'compiler/utils')
27 files changed, 164 insertions, 90 deletions
diff --git a/compiler/utils/arm/assembler_arm_vixl.h b/compiler/utils/arm/assembler_arm_vixl.h index 9c11fd3222..0e73e6bf9e 100644 --- a/compiler/utils/arm/assembler_arm_vixl.h +++ b/compiler/utils/arm/assembler_arm_vixl.h @@ -151,8 +151,8 @@ class ArmVIXLAssembler FINAL : public Assembler { private: class ArmException; public: - explicit ArmVIXLAssembler(ArenaAllocator* arena) - : Assembler(arena) { + explicit ArmVIXLAssembler(ArenaAllocator* allocator) + : Assembler(allocator) { // Use Thumb2 instruction set. vixl_masm_.UseT32(); } diff --git a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc index ed57ca68e2..0bae4d4b69 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc +++ b/compiler/utils/arm/jni_macro_assembler_arm_vixl.cc @@ -117,7 +117,8 @@ void ArmVIXLJNIMacroAssembler::BuildFrame(size_t frame_size, } void ArmVIXLJNIMacroAssembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> callee_save_regs) { + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) { CHECK_ALIGNED(frame_size, kStackAlignment); cfi().RememberState(); @@ -152,9 +153,33 @@ void ArmVIXLJNIMacroAssembler::RemoveFrame(size_t frame_size, ___ Pop(RegisterList(core_spill_mask)); if (kEmitCompilerReadBarrier && kUseBakerReadBarrier) { - // Refresh Mark Register. - // TODO: Refresh MR only if suspend is taken. - ___ Ldr(mr, MemOperand(tr, Thread::IsGcMarkingOffset<kArmPointerSize>().Int32Value())); + if (may_suspend) { + // The method may be suspended; refresh the Marking Register. + ___ Ldr(mr, MemOperand(tr, Thread::IsGcMarkingOffset<kArmPointerSize>().Int32Value())); + } else { + // The method shall not be suspended; no need to refresh the Marking Register. + + // Check that the Marking Register is a callee-save register, + // and thus has been preserved by native code following the + // AAPCS calling convention. + DCHECK_NE(core_spill_mask & (1 << MR), 0) + << "core_spill_mask should contain Marking Register R" << MR; + + // The following condition is a compile-time one, so it does not have a run-time cost. + if (kIsDebugBuild) { + // The following condition is a run-time one; it is executed after the + // previous compile-time test, to avoid penalizing non-debug builds. + if (emit_run_time_checks_in_debug_mode_) { + // Emit a run-time check verifying that the Marking Register is up-to-date. + UseScratchRegisterScope temps(asm_.GetVIXLAssembler()); + vixl32::Register temp = temps.Acquire(); + // Ensure we are not clobbering a callee-save register that was restored before. + DCHECK_EQ(core_spill_mask & (1 << temp.GetCode()), 0) + << "core_spill_mask hould not contain scratch register R" << temp.GetCode(); + asm_.GenerateMarkingRegisterCheck(temp); + } + } + } } // Return to LR. diff --git a/compiler/utils/arm/jni_macro_assembler_arm_vixl.h b/compiler/utils/arm/jni_macro_assembler_arm_vixl.h index f3baf1f062..e239004506 100644 --- a/compiler/utils/arm/jni_macro_assembler_arm_vixl.h +++ b/compiler/utils/arm/jni_macro_assembler_arm_vixl.h @@ -35,9 +35,9 @@ class ArmVIXLJNIMacroAssembler FINAL private: class ArmException; public: - explicit ArmVIXLJNIMacroAssembler(ArenaAllocator* arena) - : JNIMacroAssemblerFwd(arena), - exception_blocks_(arena->Adapter(kArenaAllocAssembler)) {} + explicit ArmVIXLJNIMacroAssembler(ArenaAllocator* allocator) + : JNIMacroAssemblerFwd(allocator), + exception_blocks_(allocator->Adapter(kArenaAllocAssembler)) {} virtual ~ArmVIXLJNIMacroAssembler() {} void FinalizeCode() OVERRIDE; @@ -54,7 +54,8 @@ class ArmVIXLJNIMacroAssembler FINAL // Emit code that will remove an activation from the stack. void RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> callee_save_regs) OVERRIDE; + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; diff --git a/compiler/utils/arm64/assembler_arm64.h b/compiler/utils/arm64/assembler_arm64.h index 6b28363a8f..e5ec24add0 100644 --- a/compiler/utils/arm64/assembler_arm64.h +++ b/compiler/utils/arm64/assembler_arm64.h @@ -61,7 +61,7 @@ enum StoreOperandType { class Arm64Assembler FINAL : public Assembler { public: - explicit Arm64Assembler(ArenaAllocator* arena) : Assembler(arena) {} + explicit Arm64Assembler(ArenaAllocator* allocator) : Assembler(allocator) {} virtual ~Arm64Assembler() {} diff --git a/compiler/utils/arm64/jni_macro_assembler_arm64.cc b/compiler/utils/arm64/jni_macro_assembler_arm64.cc index 9732b765a1..573bb6d4be 100644 --- a/compiler/utils/arm64/jni_macro_assembler_arm64.cc +++ b/compiler/utils/arm64/jni_macro_assembler_arm64.cc @@ -743,7 +743,8 @@ void Arm64JNIMacroAssembler::BuildFrame(size_t frame_size, } void Arm64JNIMacroAssembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> callee_save_regs) { + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) { // Setup VIXL CPURegList for callee-saves. CPURegList core_reg_list(CPURegister::kRegister, kXRegSize, 0); CPURegList fp_reg_list(CPURegister::kFPRegister, kDRegSize, 0); @@ -773,10 +774,36 @@ void Arm64JNIMacroAssembler::RemoveFrame(size_t frame_size, asm_.UnspillRegisters(fp_reg_list, frame_size - core_reg_size - fp_reg_size); if (kEmitCompilerReadBarrier && kUseBakerReadBarrier) { - // Refresh Mark Register. - // TODO: Refresh MR only if suspend is taken. - ___ Ldr(reg_w(MR), - MemOperand(reg_x(TR), Thread::IsGcMarkingOffset<kArm64PointerSize>().Int32Value())); + vixl::aarch64::Register mr = reg_x(MR); // Marking Register. + vixl::aarch64::Register tr = reg_x(TR); // Thread Register. + + if (may_suspend) { + // The method may be suspended; refresh the Marking Register. + ___ Ldr(mr.W(), MemOperand(tr, Thread::IsGcMarkingOffset<kArm64PointerSize>().Int32Value())); + } else { + // The method shall not be suspended; no need to refresh the Marking Register. + + // Check that the Marking Register is a callee-save register, + // and thus has been preserved by native code following the + // AAPCS64 calling convention. + DCHECK(core_reg_list.IncludesAliasOf(mr)) + << "core_reg_list should contain Marking Register X" << mr.GetCode(); + + // The following condition is a compile-time one, so it does not have a run-time cost. + if (kIsDebugBuild) { + // The following condition is a run-time one; it is executed after the + // previous compile-time test, to avoid penalizing non-debug builds. + if (emit_run_time_checks_in_debug_mode_) { + // Emit a run-time check verifying that the Marking Register is up-to-date. + UseScratchRegisterScope temps(asm_.GetVIXLAssembler()); + Register temp = temps.AcquireW(); + // Ensure we are not clobbering a callee-save register that was restored before. + DCHECK(!core_reg_list.IncludesAliasOf(temp.X())) + << "core_reg_list should not contain scratch register X" << temp.GetCode(); + asm_.GenerateMarkingRegisterCheck(temp); + } + } + } } // Decrease frame size to start of callee saved regs. diff --git a/compiler/utils/arm64/jni_macro_assembler_arm64.h b/compiler/utils/arm64/jni_macro_assembler_arm64.h index baf0434de0..fda87aa573 100644 --- a/compiler/utils/arm64/jni_macro_assembler_arm64.h +++ b/compiler/utils/arm64/jni_macro_assembler_arm64.h @@ -40,9 +40,9 @@ namespace arm64 { class Arm64JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<Arm64Assembler, PointerSize::k64> { public: - explicit Arm64JNIMacroAssembler(ArenaAllocator* arena) - : JNIMacroAssemblerFwd(arena), - exception_blocks_(arena->Adapter(kArenaAllocAssembler)) {} + explicit Arm64JNIMacroAssembler(ArenaAllocator* allocator) + : JNIMacroAssemblerFwd(allocator), + exception_blocks_(allocator->Adapter(kArenaAllocAssembler)) {} ~Arm64JNIMacroAssembler(); @@ -56,8 +56,9 @@ class Arm64JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<Arm64Assembler, const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; // Emit code that will remove an activation from the stack. - void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) - OVERRIDE; + void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; diff --git a/compiler/utils/assembler.cc b/compiler/utils/assembler.cc index 25eca23af6..944c64b591 100644 --- a/compiler/utils/assembler.cc +++ b/compiler/utils/assembler.cc @@ -25,10 +25,10 @@ namespace art { -AssemblerBuffer::AssemblerBuffer(ArenaAllocator* arena) - : arena_(arena) { +AssemblerBuffer::AssemblerBuffer(ArenaAllocator* allocator) + : allocator_(allocator) { static const size_t kInitialBufferCapacity = 4 * KB; - contents_ = arena_->AllocArray<uint8_t>(kInitialBufferCapacity, kArenaAllocAssembler); + contents_ = allocator_->AllocArray<uint8_t>(kInitialBufferCapacity, kArenaAllocAssembler); cursor_ = contents_; limit_ = ComputeLimit(contents_, kInitialBufferCapacity); fixup_ = nullptr; @@ -45,8 +45,8 @@ AssemblerBuffer::AssemblerBuffer(ArenaAllocator* arena) AssemblerBuffer::~AssemblerBuffer() { - if (arena_->IsRunningOnMemoryTool()) { - arena_->MakeInaccessible(contents_, Capacity()); + if (allocator_->IsRunningOnMemoryTool()) { + allocator_->MakeInaccessible(contents_, Capacity()); } } @@ -81,7 +81,7 @@ void AssemblerBuffer::ExtendCapacity(size_t min_capacity) { // Allocate the new data area and copy contents of the old one to it. contents_ = reinterpret_cast<uint8_t*>( - arena_->Realloc(contents_, old_capacity, new_capacity, kArenaAllocAssembler)); + allocator_->Realloc(contents_, old_capacity, new_capacity, kArenaAllocAssembler)); // Update the cursor and recompute the limit. cursor_ = contents_ + old_size; diff --git a/compiler/utils/assembler.h b/compiler/utils/assembler.h index 314ff8cf7a..dbd35abfcf 100644 --- a/compiler/utils/assembler.h +++ b/compiler/utils/assembler.h @@ -89,11 +89,11 @@ class SlowPath : public DeletableArenaObject<kArenaAllocAssembler> { class AssemblerBuffer { public: - explicit AssemblerBuffer(ArenaAllocator* arena); + explicit AssemblerBuffer(ArenaAllocator* allocator); ~AssemblerBuffer(); - ArenaAllocator* GetArena() { - return arena_; + ArenaAllocator* GetAllocator() { + return allocator_; } // Basic support for emitting, loading, and storing. @@ -252,7 +252,7 @@ class AssemblerBuffer { // for a single, fast space check per instruction. static const int kMinimumGap = 32; - ArenaAllocator* arena_; + ArenaAllocator* allocator_; uint8_t* contents_; uint8_t* cursor_; uint8_t* limit_; @@ -392,8 +392,8 @@ class Assembler : public DeletableArenaObject<kArenaAllocAssembler> { */ DebugFrameOpCodeWriterForAssembler& cfi() { return cfi_; } - ArenaAllocator* GetArena() { - return buffer_.GetArena(); + ArenaAllocator* GetAllocator() { + return buffer_.GetAllocator(); } AssemblerBuffer* GetBuffer() { @@ -401,7 +401,7 @@ class Assembler : public DeletableArenaObject<kArenaAllocAssembler> { } protected: - explicit Assembler(ArenaAllocator* arena) : buffer_(arena), cfi_(this) {} + explicit Assembler(ArenaAllocator* allocator) : buffer_(allocator), cfi_(this) {} AssemblerBuffer buffer_; diff --git a/compiler/utils/assembler_test.h b/compiler/utils/assembler_test.h index 227954e21b..11a9b91600 100644 --- a/compiler/utils/assembler_test.h +++ b/compiler/utils/assembler_test.h @@ -741,8 +741,8 @@ class AssemblerTest : public testing::Test { } // Override this to set up any architecture-specific things, e.g., CPU revision. - virtual Ass* CreateAssembler(ArenaAllocator* arena) { - return new (arena) Ass(arena); + virtual Ass* CreateAssembler(ArenaAllocator* allocator) { + return new (allocator) Ass(allocator); } // Override this to set up any architecture-specific things, e.g., register vectors. diff --git a/compiler/utils/assembler_thumb_test.cc b/compiler/utils/assembler_thumb_test.cc index 4dbe71b8c7..5622f89529 100644 --- a/compiler/utils/assembler_thumb_test.cc +++ b/compiler/utils/assembler_thumb_test.cc @@ -285,7 +285,7 @@ TEST_F(ArmVIXLAssemblerTest, VixlJniHelpers) { __ DecreaseFrameSize(4096); __ DecreaseFrameSize(32); - __ RemoveFrame(frame_size, callee_save_regs); + __ RemoveFrame(frame_size, callee_save_regs, /* may_suspend */ true); EmitAndCheck(&assembler, "VixlJniHelpers"); } diff --git a/compiler/utils/jni_macro_assembler.cc b/compiler/utils/jni_macro_assembler.cc index 3ac6c3ca7a..0616b35a39 100644 --- a/compiler/utils/jni_macro_assembler.cc +++ b/compiler/utils/jni_macro_assembler.cc @@ -47,7 +47,7 @@ using MacroAsm32UniquePtr = std::unique_ptr<JNIMacroAssembler<PointerSize::k32>> template <> MacroAsm32UniquePtr JNIMacroAssembler<PointerSize::k32>::Create( - ArenaAllocator* arena, + ArenaAllocator* allocator, InstructionSet instruction_set, const InstructionSetFeatures* instruction_set_features) { #ifndef ART_ENABLE_CODEGEN_mips @@ -58,19 +58,19 @@ MacroAsm32UniquePtr JNIMacroAssembler<PointerSize::k32>::Create( #ifdef ART_ENABLE_CODEGEN_arm case kArm: case kThumb2: - return MacroAsm32UniquePtr(new (arena) arm::ArmVIXLJNIMacroAssembler(arena)); + return MacroAsm32UniquePtr(new (allocator) arm::ArmVIXLJNIMacroAssembler(allocator)); #endif #ifdef ART_ENABLE_CODEGEN_mips case kMips: - return MacroAsm32UniquePtr(new (arena) mips::MipsAssembler( - arena, + return MacroAsm32UniquePtr(new (allocator) mips::MipsAssembler( + allocator, instruction_set_features != nullptr ? instruction_set_features->AsMipsInstructionSetFeatures() : nullptr)); #endif #ifdef ART_ENABLE_CODEGEN_x86 case kX86: - return MacroAsm32UniquePtr(new (arena) x86::X86JNIMacroAssembler(arena)); + return MacroAsm32UniquePtr(new (allocator) x86::X86JNIMacroAssembler(allocator)); #endif default: LOG(FATAL) << "Unknown/unsupported 4B InstructionSet: " << instruction_set; @@ -82,7 +82,7 @@ using MacroAsm64UniquePtr = std::unique_ptr<JNIMacroAssembler<PointerSize::k64>> template <> MacroAsm64UniquePtr JNIMacroAssembler<PointerSize::k64>::Create( - ArenaAllocator* arena, + ArenaAllocator* allocator, InstructionSet instruction_set, const InstructionSetFeatures* instruction_set_features) { #ifndef ART_ENABLE_CODEGEN_mips64 @@ -92,22 +92,22 @@ MacroAsm64UniquePtr JNIMacroAssembler<PointerSize::k64>::Create( switch (instruction_set) { #ifdef ART_ENABLE_CODEGEN_arm64 case kArm64: - return MacroAsm64UniquePtr(new (arena) arm64::Arm64JNIMacroAssembler(arena)); + return MacroAsm64UniquePtr(new (allocator) arm64::Arm64JNIMacroAssembler(allocator)); #endif #ifdef ART_ENABLE_CODEGEN_mips64 case kMips64: - return MacroAsm64UniquePtr(new (arena) mips64::Mips64Assembler( - arena, + return MacroAsm64UniquePtr(new (allocator) mips64::Mips64Assembler( + allocator, instruction_set_features != nullptr ? instruction_set_features->AsMips64InstructionSetFeatures() : nullptr)); #endif #ifdef ART_ENABLE_CODEGEN_x86_64 case kX86_64: - return MacroAsm64UniquePtr(new (arena) x86_64::X86_64JNIMacroAssembler(arena)); + return MacroAsm64UniquePtr(new (allocator) x86_64::X86_64JNIMacroAssembler(allocator)); #endif default: - UNUSED(arena); + UNUSED(allocator); LOG(FATAL) << "Unknown/unsupported 8B InstructionSet: " << instruction_set; UNREACHABLE(); } diff --git a/compiler/utils/jni_macro_assembler.h b/compiler/utils/jni_macro_assembler.h index a8ca1119e5..0fc1353bf5 100644 --- a/compiler/utils/jni_macro_assembler.h +++ b/compiler/utils/jni_macro_assembler.h @@ -46,7 +46,7 @@ template <PointerSize kPointerSize> class JNIMacroAssembler : public DeletableArenaObject<kArenaAllocAssembler> { public: static std::unique_ptr<JNIMacroAssembler<kPointerSize>> Create( - ArenaAllocator* arena, + ArenaAllocator* allocator, InstructionSet instruction_set, const InstructionSetFeatures* instruction_set_features = nullptr); @@ -66,7 +66,13 @@ class JNIMacroAssembler : public DeletableArenaObject<kArenaAllocAssembler> { const ManagedRegisterEntrySpills& entry_spills) = 0; // Emit code that will remove an activation from the stack - virtual void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) = 0; + // + // Argument `may_suspend` must be `true` if the compiled method may be + // suspended during its execution (otherwise `false`, if it is impossible + // to suspend during its execution). + virtual void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) = 0; virtual void IncreaseFrameSize(size_t adjust) = 0; virtual void DecreaseFrameSize(size_t adjust) = 0; @@ -269,7 +275,7 @@ class JNIMacroAssemblerFwd : public JNIMacroAssembler<kPointerSize> { } protected: - explicit JNIMacroAssemblerFwd(ArenaAllocator* arena) : asm_(arena) {} + explicit JNIMacroAssemblerFwd(ArenaAllocator* allocator) : asm_(allocator) {} T asm_; }; diff --git a/compiler/utils/jni_macro_assembler_test.h b/compiler/utils/jni_macro_assembler_test.h index 61296802f8..ba95e212bb 100644 --- a/compiler/utils/jni_macro_assembler_test.h +++ b/compiler/utils/jni_macro_assembler_test.h @@ -80,8 +80,8 @@ class JNIMacroAssemblerTest : public testing::Test { } // Override this to set up any architecture-specific things, e.g., CPU revision. - virtual Ass* CreateAssembler(ArenaAllocator* arena) { - return new (arena) Ass(arena); + virtual Ass* CreateAssembler(ArenaAllocator* allocator) { + return new (allocator) Ass(allocator); } // Override this to set up any architecture-specific things, e.g., register vectors. diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc index b300cc597f..b83e3f5471 100644 --- a/compiler/utils/mips/assembler_mips.cc +++ b/compiler/utils/mips/assembler_mips.cc @@ -5016,7 +5016,8 @@ void MipsAssembler::BuildFrame(size_t frame_size, } void MipsAssembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> callee_save_regs) { + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend ATTRIBUTE_UNUSED) { CHECK_ALIGNED(frame_size, kStackAlignment); DCHECK(!overwriting_); cfi_.RememberState(); diff --git a/compiler/utils/mips/assembler_mips.h b/compiler/utils/mips/assembler_mips.h index 0b4eb9ca55..57b3edd03a 100644 --- a/compiler/utils/mips/assembler_mips.h +++ b/compiler/utils/mips/assembler_mips.h @@ -192,16 +192,16 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi public: using JNIBase = JNIMacroAssembler<PointerSize::k32>; - explicit MipsAssembler(ArenaAllocator* arena, + explicit MipsAssembler(ArenaAllocator* allocator, const MipsInstructionSetFeatures* instruction_set_features = nullptr) - : Assembler(arena), + : Assembler(allocator), overwriting_(false), overwrite_location_(0), reordering_(true), ds_fsm_state_(kExpectingLabel), ds_fsm_target_pc_(0), - literals_(arena->Adapter(kArenaAllocAssembler)), - jump_tables_(arena->Adapter(kArenaAllocAssembler)), + literals_(allocator->Adapter(kArenaAllocAssembler)), + jump_tables_(allocator->Adapter(kArenaAllocAssembler)), last_position_adjustment_(0), last_old_position_(0), last_branch_id_(0), @@ -1090,8 +1090,9 @@ class MipsAssembler FINAL : public Assembler, public JNIMacroAssembler<PointerSi const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; // Emit code that will remove an activation from the stack. - void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) - OVERRIDE; + void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; diff --git a/compiler/utils/mips/assembler_mips32r5_test.cc b/compiler/utils/mips/assembler_mips32r5_test.cc index a3662db935..9a69ffd3dd 100644 --- a/compiler/utils/mips/assembler_mips32r5_test.cc +++ b/compiler/utils/mips/assembler_mips32r5_test.cc @@ -72,8 +72,8 @@ class AssemblerMIPS32r5Test : public AssemblerTest<mips::MipsAssembler, return " -D -bbinary -mmips:isa32r5"; } - mips::MipsAssembler* CreateAssembler(ArenaAllocator* arena) OVERRIDE { - return new (arena) mips::MipsAssembler(arena, instruction_set_features_.get()); + mips::MipsAssembler* CreateAssembler(ArenaAllocator* allocator) OVERRIDE { + return new (allocator) mips::MipsAssembler(allocator, instruction_set_features_.get()); } void SetUpHelpers() OVERRIDE { diff --git a/compiler/utils/mips/assembler_mips32r6_test.cc b/compiler/utils/mips/assembler_mips32r6_test.cc index b6cb30a6f0..b12b6b651c 100644 --- a/compiler/utils/mips/assembler_mips32r6_test.cc +++ b/compiler/utils/mips/assembler_mips32r6_test.cc @@ -85,8 +85,8 @@ class AssemblerMIPS32r6Test : public AssemblerTest<mips::MipsAssembler, return " -D -bbinary -mmips:isa32r6"; } - mips::MipsAssembler* CreateAssembler(ArenaAllocator* arena) OVERRIDE { - return new (arena) mips::MipsAssembler(arena, instruction_set_features_.get()); + mips::MipsAssembler* CreateAssembler(ArenaAllocator* allocator) OVERRIDE { + return new (allocator) mips::MipsAssembler(allocator, instruction_set_features_.get()); } void SetUpHelpers() OVERRIDE { diff --git a/compiler/utils/mips64/assembler_mips64.cc b/compiler/utils/mips64/assembler_mips64.cc index 183b5e507b..606d4c39d0 100644 --- a/compiler/utils/mips64/assembler_mips64.cc +++ b/compiler/utils/mips64/assembler_mips64.cc @@ -3406,7 +3406,8 @@ void Mips64Assembler::BuildFrame(size_t frame_size, } void Mips64Assembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> callee_save_regs) { + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend ATTRIBUTE_UNUSED) { CHECK_ALIGNED(frame_size, kStackAlignment); DCHECK(!overwriting_); cfi_.RememberState(); diff --git a/compiler/utils/mips64/assembler_mips64.h b/compiler/utils/mips64/assembler_mips64.h index bb54382811..a3787ac6ae 100644 --- a/compiler/utils/mips64/assembler_mips64.h +++ b/compiler/utils/mips64/assembler_mips64.h @@ -418,14 +418,14 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer public: using JNIBase = JNIMacroAssembler<PointerSize::k64>; - explicit Mips64Assembler(ArenaAllocator* arena, + explicit Mips64Assembler(ArenaAllocator* allocator, const Mips64InstructionSetFeatures* instruction_set_features = nullptr) - : Assembler(arena), + : Assembler(allocator), overwriting_(false), overwrite_location_(0), - literals_(arena->Adapter(kArenaAllocAssembler)), - long_literals_(arena->Adapter(kArenaAllocAssembler)), - jump_tables_(arena->Adapter(kArenaAllocAssembler)), + literals_(allocator->Adapter(kArenaAllocAssembler)), + long_literals_(allocator->Adapter(kArenaAllocAssembler)), + jump_tables_(allocator->Adapter(kArenaAllocAssembler)), last_position_adjustment_(0), last_old_position_(0), last_branch_id_(0), @@ -1278,7 +1278,9 @@ class Mips64Assembler FINAL : public Assembler, public JNIMacroAssembler<Pointer const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; // Emit code that will remove an activation from the stack. - void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) OVERRIDE; + void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; diff --git a/compiler/utils/mips64/assembler_mips64_test.cc b/compiler/utils/mips64/assembler_mips64_test.cc index 16a36f9069..bf0326de87 100644 --- a/compiler/utils/mips64/assembler_mips64_test.cc +++ b/compiler/utils/mips64/assembler_mips64_test.cc @@ -83,8 +83,8 @@ class AssemblerMIPS64Test : public AssemblerTest<mips64::Mips64Assembler, return " -D -bbinary -mmips:isa64r6"; } - mips64::Mips64Assembler* CreateAssembler(ArenaAllocator* arena) OVERRIDE { - return new (arena) mips64::Mips64Assembler(arena, instruction_set_features_.get()); + mips64::Mips64Assembler* CreateAssembler(ArenaAllocator* allocator) OVERRIDE { + return new (allocator) mips64::Mips64Assembler(allocator, instruction_set_features_.get()); } void SetUpHelpers() OVERRIDE { diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h index dce3ad228c..f3b516cb7e 100644 --- a/compiler/utils/x86/assembler_x86.h +++ b/compiler/utils/x86/assembler_x86.h @@ -266,7 +266,8 @@ class NearLabel : private Label { */ class ConstantArea { public: - explicit ConstantArea(ArenaAllocator* arena) : buffer_(arena->Adapter(kArenaAllocAssembler)) {} + explicit ConstantArea(ArenaAllocator* allocator) + : buffer_(allocator->Adapter(kArenaAllocAssembler)) {} // Add a double to the constant area, returning the offset into // the constant area where the literal resides. @@ -307,7 +308,8 @@ class ConstantArea { class X86Assembler FINAL : public Assembler { public: - explicit X86Assembler(ArenaAllocator* arena) : Assembler(arena), constant_area_(arena) {} + explicit X86Assembler(ArenaAllocator* allocator) + : Assembler(allocator), constant_area_(allocator) {} virtual ~X86Assembler() {} /* diff --git a/compiler/utils/x86/jni_macro_assembler_x86.cc b/compiler/utils/x86/jni_macro_assembler_x86.cc index e074346e01..7e29c4aa26 100644 --- a/compiler/utils/x86/jni_macro_assembler_x86.cc +++ b/compiler/utils/x86/jni_macro_assembler_x86.cc @@ -85,7 +85,8 @@ void X86JNIMacroAssembler::BuildFrame(size_t frame_size, } void X86JNIMacroAssembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> spill_regs) { + ArrayRef<const ManagedRegister> spill_regs, + bool may_suspend ATTRIBUTE_UNUSED) { CHECK_ALIGNED(frame_size, kStackAlignment); cfi().RememberState(); // -kFramePointerSize for ArtMethod*. @@ -517,7 +518,7 @@ void X86JNIMacroAssembler::GetCurrentThread(FrameOffset offset, } void X86JNIMacroAssembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { - X86ExceptionSlowPath* slow = new (__ GetArena()) X86ExceptionSlowPath(stack_adjust); + X86ExceptionSlowPath* slow = new (__ GetAllocator()) X86ExceptionSlowPath(stack_adjust); __ GetBuffer()->EnqueueSlowPath(slow); __ fs()->cmpl(Address::Absolute(Thread::ExceptionOffset<kX86PointerSize>()), Immediate(0)); __ j(kNotEqual, slow->Entry()); diff --git a/compiler/utils/x86/jni_macro_assembler_x86.h b/compiler/utils/x86/jni_macro_assembler_x86.h index 8ffda6425e..56eaf1951e 100644 --- a/compiler/utils/x86/jni_macro_assembler_x86.h +++ b/compiler/utils/x86/jni_macro_assembler_x86.h @@ -34,7 +34,7 @@ class X86JNIMacroLabel; class X86JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<X86Assembler, PointerSize::k32> { public: - explicit X86JNIMacroAssembler(ArenaAllocator* arena) : JNIMacroAssemblerFwd(arena) {} + explicit X86JNIMacroAssembler(ArenaAllocator* allocator) : JNIMacroAssemblerFwd(allocator) {} virtual ~X86JNIMacroAssembler() {} // @@ -48,8 +48,9 @@ class X86JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<X86Assembler, Poi const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; // Emit code that will remove an activation from the stack - void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) - OVERRIDE; + void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h index 11304443e0..0d24a751c0 100644 --- a/compiler/utils/x86_64/assembler_x86_64.h +++ b/compiler/utils/x86_64/assembler_x86_64.h @@ -290,7 +290,8 @@ std::ostream& operator<<(std::ostream& os, const Address& addr); */ class ConstantArea { public: - explicit ConstantArea(ArenaAllocator* arena) : buffer_(arena->Adapter(kArenaAllocAssembler)) {} + explicit ConstantArea(ArenaAllocator* allocator) + : buffer_(allocator->Adapter(kArenaAllocAssembler)) {} // Add a double to the constant area, returning the offset into // the constant area where the literal resides. @@ -352,7 +353,8 @@ class NearLabel : private Label { class X86_64Assembler FINAL : public Assembler { public: - explicit X86_64Assembler(ArenaAllocator* arena) : Assembler(arena), constant_area_(arena) {} + explicit X86_64Assembler(ArenaAllocator* allocator) + : Assembler(allocator), constant_area_(allocator) {} virtual ~X86_64Assembler() {} /* diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc index aff8871025..b08ba4a03a 100644 --- a/compiler/utils/x86_64/assembler_x86_64_test.cc +++ b/compiler/utils/x86_64/assembler_x86_64_test.cc @@ -2043,7 +2043,7 @@ std::string removeframe_test_fn(JNIMacroAssemblerX86_64Test::Base* assembler_tes ArrayRef<const ManagedRegister> spill_regs(raw_spill_regs); size_t frame_size = 10 * kStackAlignment; - assembler->RemoveFrame(frame_size, spill_regs); + assembler->RemoveFrame(frame_size, spill_regs, /* may_suspend */ true); // Construct assembly text counterpart. std::ostringstream str; diff --git a/compiler/utils/x86_64/jni_macro_assembler_x86_64.cc b/compiler/utils/x86_64/jni_macro_assembler_x86_64.cc index ec86254cfc..5766f9d44b 100644 --- a/compiler/utils/x86_64/jni_macro_assembler_x86_64.cc +++ b/compiler/utils/x86_64/jni_macro_assembler_x86_64.cc @@ -100,7 +100,8 @@ void X86_64JNIMacroAssembler::BuildFrame(size_t frame_size, } void X86_64JNIMacroAssembler::RemoveFrame(size_t frame_size, - ArrayRef<const ManagedRegister> spill_regs) { + ArrayRef<const ManagedRegister> spill_regs, + bool may_suspend ATTRIBUTE_UNUSED) { CHECK_ALIGNED(frame_size, kStackAlignment); cfi().RememberState(); int gpr_count = 0; @@ -583,9 +584,10 @@ class X86_64ExceptionSlowPath FINAL : public SlowPath { }; void X86_64JNIMacroAssembler::ExceptionPoll(ManagedRegister /*scratch*/, size_t stack_adjust) { - X86_64ExceptionSlowPath* slow = new (__ GetArena()) X86_64ExceptionSlowPath(stack_adjust); + X86_64ExceptionSlowPath* slow = new (__ GetAllocator()) X86_64ExceptionSlowPath(stack_adjust); __ GetBuffer()->EnqueueSlowPath(slow); - __ gs()->cmpl(Address::Absolute(Thread::ExceptionOffset<kX86_64PointerSize>(), true), Immediate(0)); + __ gs()->cmpl(Address::Absolute(Thread::ExceptionOffset<kX86_64PointerSize>(), true), + Immediate(0)); __ j(kNotEqual, slow->Entry()); } diff --git a/compiler/utils/x86_64/jni_macro_assembler_x86_64.h b/compiler/utils/x86_64/jni_macro_assembler_x86_64.h index aa058f7454..d1a3032a56 100644 --- a/compiler/utils/x86_64/jni_macro_assembler_x86_64.h +++ b/compiler/utils/x86_64/jni_macro_assembler_x86_64.h @@ -34,8 +34,8 @@ namespace x86_64 { class X86_64JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<X86_64Assembler, PointerSize::k64> { public: - explicit X86_64JNIMacroAssembler(ArenaAllocator* arena) - : JNIMacroAssemblerFwd<X86_64Assembler, PointerSize::k64>(arena) {} + explicit X86_64JNIMacroAssembler(ArenaAllocator* allocator) + : JNIMacroAssemblerFwd<X86_64Assembler, PointerSize::k64>(allocator) {} virtual ~X86_64JNIMacroAssembler() {} // @@ -49,8 +49,9 @@ class X86_64JNIMacroAssembler FINAL : public JNIMacroAssemblerFwd<X86_64Assemble const ManagedRegisterEntrySpills& entry_spills) OVERRIDE; // Emit code that will remove an activation from the stack - void RemoveFrame(size_t frame_size, ArrayRef<const ManagedRegister> callee_save_regs) - OVERRIDE; + void RemoveFrame(size_t frame_size, + ArrayRef<const ManagedRegister> callee_save_regs, + bool may_suspend) OVERRIDE; void IncreaseFrameSize(size_t adjust) OVERRIDE; void DecreaseFrameSize(size_t adjust) OVERRIDE; |