From c34dc9362b9ec624b3bdd97d36b6b2098814cd73 Mon Sep 17 00:00:00 2001 From: David Srbecky Date: Sun, 12 Apr 2015 09:27:43 +0100 Subject: [PATCH] Move 'ret' instruction generation inside GenerateFrameExit. Change-Id: I0c594d9a2356a006a5ce8dfd41d307cf7c3704ba --- compiler/optimizing/code_generator_arm.cc | 9 ++--- compiler/optimizing/code_generator_arm64.cc | 12 +++---- compiler/optimizing/code_generator_x86.cc | 38 +++++++++------------ compiler/optimizing/code_generator_x86_64.cc | 51 +++++++++++++--------------- compiler/optimizing/optimizing_cfi_test.cc | 2 +- 5 files changed, 47 insertions(+), 65 deletions(-) diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index a799a519c..e434e9e7e 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -560,6 +560,7 @@ void CodeGeneratorARM::GenerateFrameExit() { __ bx(LR); return; } + __ cfi().RememberState(); int adjust = GetFrameSize() - FrameEntrySpillSize(); __ AddConstant(SP, adjust); __ cfi().AdjustCFAOffset(-adjust); @@ -570,6 +571,8 @@ void CodeGeneratorARM::GenerateFrameExit() { __ cfi().RestoreMany(DWARFReg(SRegister(0)), fpu_spill_mask_); } __ PopList(core_spill_mask_); + __ cfi().RestoreState(); + __ cfi().DefCFAOffset(GetFrameSize()); } void CodeGeneratorARM::Bind(HBasicBlock* block) { @@ -1209,10 +1212,7 @@ void LocationsBuilderARM::VisitReturnVoid(HReturnVoid* ret) { void InstructionCodeGeneratorARM::VisitReturnVoid(HReturnVoid* ret) { UNUSED(ret); - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderARM::VisitReturn(HReturn* ret) { @@ -1223,10 +1223,7 @@ void LocationsBuilderARM::VisitReturn(HReturn* ret) { void InstructionCodeGeneratorARM::VisitReturn(HReturn* ret) { UNUSED(ret); - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderARM::VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) { diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 5fe8adc86..33eacbaf0 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -472,6 +472,7 @@ void CodeGeneratorARM64::GenerateFrameEntry() { } void CodeGeneratorARM64::GenerateFrameExit() { + GetAssembler()->cfi().RememberState(); if (!HasEmptyFrame()) { int frame_size = GetFrameSize(); UnspillRegisters(GetFramePreservedFPRegisters(), frame_size - FrameEntrySpillSize()); @@ -479,6 +480,9 @@ void CodeGeneratorARM64::GenerateFrameExit() { __ Drop(frame_size); GetAssembler()->cfi().AdjustCFAOffset(-frame_size); } + __ Ret(); + GetAssembler()->cfi().RestoreState(); + GetAssembler()->cfi().DefCFAOffset(GetFrameSize()); } static inline dwarf::Reg DWARFReg(CPURegister reg) { @@ -2465,11 +2469,7 @@ void LocationsBuilderARM64::VisitReturn(HReturn* instruction) { void InstructionCodeGeneratorARM64::VisitReturn(HReturn* instruction) { UNUSED(instruction); - GetAssembler()->cfi().RememberState(); codegen_->GenerateFrameExit(); - __ Ret(); - GetAssembler()->cfi().RestoreState(); - GetAssembler()->cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderARM64::VisitReturnVoid(HReturnVoid* instruction) { @@ -2478,11 +2478,7 @@ void LocationsBuilderARM64::VisitReturnVoid(HReturnVoid* instruction) { void InstructionCodeGeneratorARM64::VisitReturnVoid(HReturnVoid* instruction) { UNUSED(instruction); - GetAssembler()->cfi().RememberState(); codegen_->GenerateFrameExit(); - __ Ret(); - GetAssembler()->cfi().RestoreState(); - GetAssembler()->cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderARM64::VisitShl(HShl* shl) { diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index 48445d79d..637064d10 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -496,22 +496,24 @@ void CodeGeneratorX86::GenerateFrameEntry() { } void CodeGeneratorX86::GenerateFrameExit() { - if (HasEmptyFrame()) { - return; - } - - int adjust = GetFrameSize() - FrameEntrySpillSize(); - __ addl(ESP, Immediate(adjust)); - __ cfi().AdjustCFAOffset(-adjust); - - for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) { - Register reg = kCoreCalleeSaves[i]; - if (allocated_registers_.ContainsCoreRegister(reg)) { - __ popl(reg); - __ cfi().AdjustCFAOffset(-static_cast(kX86WordSize)); - __ cfi().Restore(DWARFReg(reg)); + __ cfi().RememberState(); + if (!HasEmptyFrame()) { + int adjust = GetFrameSize() - FrameEntrySpillSize(); + __ addl(ESP, Immediate(adjust)); + __ cfi().AdjustCFAOffset(-adjust); + + for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) { + Register reg = kCoreCalleeSaves[i]; + if (allocated_registers_.ContainsCoreRegister(reg)) { + __ popl(reg); + __ cfi().AdjustCFAOffset(-static_cast(kX86WordSize)); + __ cfi().Restore(DWARFReg(reg)); + } } } + __ ret(); + __ cfi().RestoreState(); + __ cfi().DefCFAOffset(GetFrameSize()); } void CodeGeneratorX86::Bind(HBasicBlock* block) { @@ -1116,11 +1118,7 @@ void LocationsBuilderX86::VisitReturnVoid(HReturnVoid* ret) { void InstructionCodeGeneratorX86::VisitReturnVoid(HReturnVoid* ret) { UNUSED(ret); - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ ret(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderX86::VisitReturn(HReturn* ret) { @@ -1178,11 +1176,7 @@ void InstructionCodeGeneratorX86::VisitReturn(HReturn* ret) { LOG(FATAL) << "Unknown return type " << ret->InputAt(0)->GetType(); } } - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ ret(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderX86::VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) { diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index 01b24ea33..0cb35d2b8 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -534,31 +534,34 @@ void CodeGeneratorX86_64::GenerateFrameEntry() { } void CodeGeneratorX86_64::GenerateFrameExit() { - if (HasEmptyFrame()) { - return; - } - uint32_t xmm_spill_location = GetFpuSpillStart(); - size_t xmm_spill_slot_size = GetFloatingPointSpillSlotSize(); - for (size_t i = 0; i < arraysize(kFpuCalleeSaves); ++i) { - if (allocated_registers_.ContainsFloatingPointRegister(kFpuCalleeSaves[i])) { - int offset = xmm_spill_location + (xmm_spill_slot_size * i); - __ movsd(XmmRegister(kFpuCalleeSaves[i]), Address(CpuRegister(RSP), offset)); - __ cfi().Restore(DWARFReg(kFpuCalleeSaves[i])); + __ cfi().RememberState(); + if (!HasEmptyFrame()) { + uint32_t xmm_spill_location = GetFpuSpillStart(); + size_t xmm_spill_slot_size = GetFloatingPointSpillSlotSize(); + for (size_t i = 0; i < arraysize(kFpuCalleeSaves); ++i) { + if (allocated_registers_.ContainsFloatingPointRegister(kFpuCalleeSaves[i])) { + int offset = xmm_spill_location + (xmm_spill_slot_size * i); + __ movsd(XmmRegister(kFpuCalleeSaves[i]), Address(CpuRegister(RSP), offset)); + __ cfi().Restore(DWARFReg(kFpuCalleeSaves[i])); + } } - } - int adjust = GetFrameSize() - GetCoreSpillSize(); - __ addq(CpuRegister(RSP), Immediate(adjust)); - __ cfi().AdjustCFAOffset(-adjust); + int adjust = GetFrameSize() - GetCoreSpillSize(); + __ addq(CpuRegister(RSP), Immediate(adjust)); + __ cfi().AdjustCFAOffset(-adjust); - for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) { - Register reg = kCoreCalleeSaves[i]; - if (allocated_registers_.ContainsCoreRegister(reg)) { - __ popq(CpuRegister(reg)); - __ cfi().AdjustCFAOffset(-static_cast(kX86_64WordSize)); - __ cfi().Restore(DWARFReg(reg)); + for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) { + Register reg = kCoreCalleeSaves[i]; + if (allocated_registers_.ContainsCoreRegister(reg)) { + __ popq(CpuRegister(reg)); + __ cfi().AdjustCFAOffset(-static_cast(kX86_64WordSize)); + __ cfi().Restore(DWARFReg(reg)); + } } } + __ ret(); + __ cfi().RestoreState(); + __ cfi().DefCFAOffset(GetFrameSize()); } void CodeGeneratorX86_64::Bind(HBasicBlock* block) { @@ -1143,11 +1146,7 @@ void LocationsBuilderX86_64::VisitReturnVoid(HReturnVoid* ret) { void InstructionCodeGeneratorX86_64::VisitReturnVoid(HReturnVoid* ret) { UNUSED(ret); - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ ret(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } void LocationsBuilderX86_64::VisitReturn(HReturn* ret) { @@ -1198,11 +1197,7 @@ void InstructionCodeGeneratorX86_64::VisitReturn(HReturn* ret) { LOG(FATAL) << "Unexpected return type " << ret->InputAt(0)->GetType(); } } - __ cfi().RememberState(); codegen_->GenerateFrameExit(); - __ ret(); - __ cfi().RestoreState(); - __ cfi().DefCFAOffset(codegen_->GetFrameSize()); } Location InvokeDexCallingConventionVisitor::GetNextLocation(Primitive::Type type) { diff --git a/compiler/optimizing/optimizing_cfi_test.cc b/compiler/optimizing/optimizing_cfi_test.cc index 6d986ba7d..b2c13adf3 100644 --- a/compiler/optimizing/optimizing_cfi_test.cc +++ b/compiler/optimizing/optimizing_cfi_test.cc @@ -73,7 +73,7 @@ class OptimizingCFITest : public CFITest { code_gen->ComputeSpillMask(); code_gen->SetFrameSize(frame_size); code_gen->GenerateFrameEntry(); - code_gen->GetInstructionVisitor()->VisitReturnVoid(new (&allocator) HReturnVoid()); + code_gen->GenerateFrameExit(); // Get the outputs. InternalCodeAllocator code_allocator; code_gen->Finalize(&code_allocator); -- 2.11.0