OSDN Git Service

Move 'ret' instruction generation inside GenerateFrameExit.
authorDavid Srbecky <dsrbecky@google.com>
Sun, 12 Apr 2015 08:27:43 +0000 (09:27 +0100)
committerDavid Srbecky <dsrbecky@google.com>
Sun, 12 Apr 2015 08:30:57 +0000 (09:30 +0100)
Change-Id: I0c594d9a2356a006a5ce8dfd41d307cf7c3704ba

compiler/optimizing/code_generator_arm.cc
compiler/optimizing/code_generator_arm64.cc
compiler/optimizing/code_generator_x86.cc
compiler/optimizing/code_generator_x86_64.cc
compiler/optimizing/optimizing_cfi_test.cc

index a799a51..e434e9e 100644 (file)
@@ -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) {
index 5fe8adc..33eacba 100644 (file)
@@ -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) {
index 48445d7..637064d 100644 (file)
@@ -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<int>(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<int>(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) {
index 01b24ea..0cb35d2 100644 (file)
@@ -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<int>(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<int>(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) {
index 6d986ba..b2c13ad 100644 (file)
@@ -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);