[llvm-dev] [Darwin] Change compact unwind encoding generation to support CFI instructions in epilogue

Violeta Vukobrat via llvm-dev llvm-dev at lists.llvm.org
Fri Mar 18 08:09:01 PDT 2016


Hi all,

I have a question concerning compact unwind encoding generation. I am 
working on adding support for providing unwind info in function epilogue 
for X86: http://reviews.llvm.org/D18046, which means I am adding CFI 
instructions to a function. The instructions important to mention here 
are cfi_def_cfa_offset and cfi_def_cfa being added to the epilogue. 
During testing I found that these newly added instructions change the 
generated compact unwind encoding, more specifically, I located the 
source of the problem to be in generateCompactUnwindEncodingImpl() 
function. These are the changes that I made:


diff --git a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp 
b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
index def1b94..8076946 100644
--- a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
+++ b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
@@ -542,9 +542,12 @@ protected:
          //  L0:
          //     .cfi_def_cfa_offset 80
          //
-        PrevStackSize = StackSize;
-        StackSize = std::abs(Inst.getOffset()) / StackDivide;
-        ++NumDefCFAOffsets;
+        // Find the maximum def_cfa_offset that is set in a function
+        if ((std::abs(Inst.getOffset()) / StackDivide) > StackSize) {
+          PrevStackSize = StackSize;
+          StackSize = std::abs(Inst.getOffset()) / StackDivide;
+          ++NumDefCFAOffsets;
+        }
          break;
        }
        case MCCFIInstruction::OpOffset: {
@@ -571,6 +574,9 @@ protected:
          InstrOffset += PushInstrSize(Reg);
          break;
        }
+      case MCCFIInstruction::OpDefCfa: {
+        break;
+      }
        }
      }

The first change is for the OpDefCfaOffset instruction type, where I 
changed the code to have the StackSize variable set to the highest 
offset that is found (it was set to be the last one found, which, in 
case when there are only CFI instructions in prologue, also was the one 
with the highest offset, but, when CFI instructions are added in 
epilogue, that is not the case anymore (because the offset decreases in 
epilogue)).
The second change is for the OpDefCfa instruction type. What I wanted 
here was to prevent the return from the function in case of OpDefCfa, 
however, I wasn't sure how or if that should impact the encoding generation.
My question is: do these changes make sense? If not, what is the right 
way to handle this?

-- 
Violeta Vukobrat
Software Engineer
RT-RK Computer Based Systems LLC
www.rt-rk.com



More information about the llvm-dev mailing list