Move 'ret' instruction generation inside GenerateFrameExit.
Change-Id: I0c594d9a2356a006a5ce8dfd41d307cf7c3704ba
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc
index a799a51..e434e9e 100644
--- a/compiler/optimizing/code_generator_arm.cc
+++ b/compiler/optimizing/code_generator_arm.cc
@@ -560,6 +560,7 @@
__ bx(LR);
return;
}
+ __ cfi().RememberState();
int adjust = GetFrameSize() - FrameEntrySpillSize();
__ AddConstant(SP, adjust);
__ cfi().AdjustCFAOffset(-adjust);
@@ -570,6 +571,8 @@
__ 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 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 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 5fe8adc..33eacba 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -472,6 +472,7 @@
}
void CodeGeneratorARM64::GenerateFrameExit() {
+ GetAssembler()->cfi().RememberState();
if (!HasEmptyFrame()) {
int frame_size = GetFrameSize();
UnspillRegisters(GetFramePreservedFPRegisters(), frame_size - FrameEntrySpillSize());
@@ -479,6 +480,9 @@
__ 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 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 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 48445d7..637064d 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -496,22 +496,24 @@
}
void CodeGeneratorX86::GenerateFrameExit() {
- if (HasEmptyFrame()) {
- return;
- }
+ __ cfi().RememberState();
+ if (!HasEmptyFrame()) {
+ int adjust = GetFrameSize() - FrameEntrySpillSize();
+ __ addl(ESP, Immediate(adjust));
+ __ cfi().AdjustCFAOffset(-adjust);
- 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<int>(kX86WordSize));
- __ cfi().Restore(DWARFReg(reg));
+ for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) {
+ Register reg = kCoreCalleeSaves[i];
+ if (allocated_registers_.ContainsCoreRegister(reg)) {
+ __ popl(reg);
+ __ cfi().AdjustCFAOffset(-static_cast<int>(kX86WordSize));
+ __ cfi().Restore(DWARFReg(reg));
+ }
}
}
+ __ ret();
+ __ cfi().RestoreState();
+ __ cfi().DefCFAOffset(GetFrameSize());
}
void CodeGeneratorX86::Bind(HBasicBlock* block) {
@@ -1116,11 +1118,7 @@
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 @@
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 01b24ea..0cb35d2 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -534,31 +534,34 @@
}
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);
+
+ 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<int>(kX86_64WordSize));
+ __ cfi().Restore(DWARFReg(reg));
+ }
}
}
-
- 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<int>(kX86_64WordSize));
- __ cfi().Restore(DWARFReg(reg));
- }
- }
+ __ ret();
+ __ cfi().RestoreState();
+ __ cfi().DefCFAOffset(GetFrameSize());
}
void CodeGeneratorX86_64::Bind(HBasicBlock* block) {
@@ -1143,11 +1146,7 @@
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 @@
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 6d986ba..b2c13ad 100644
--- a/compiler/optimizing/optimizing_cfi_test.cc
+++ b/compiler/optimizing/optimizing_cfi_test.cc
@@ -73,7 +73,7 @@
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);