[llvm-commits] [llvm] r133676 - /llvm/trunk/lib/MC/MCDwarf.cpp

Bill Wendling isanbard at gmail.com
Wed Jun 22 18:06:23 PDT 2011


Author: void
Date: Wed Jun 22 20:06:23 2011
New Revision: 133676

URL: http://llvm.org/viewvc/llvm-project?rev=133676&view=rev
Log:
Some skeleton code to emit the compact unwind. If the information is unable to
be emitted in a compact way, we then default to emitting a CIE and FDE.

Modified:
    llvm/trunk/lib/MC/MCDwarf.cpp

Modified: llvm/trunk/lib/MC/MCDwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=133676&r1=133675&r2=133676&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDwarf.cpp (original)
+++ llvm/trunk/lib/MC/MCDwarf.cpp Wed Jun 22 20:06:23 2011
@@ -507,6 +507,12 @@
       SectionStart(sectionStart) {
     }
 
+    /// EmitCompactUnwind - Emit the unwind information in a compact way. If
+    /// we're successful, return 'true'. Otherwise, return 'false' and it will
+    /// emit the normal CIE and FDE.
+    bool EmitCompactUnwind(MCStreamer &streamer,
+                           const MCDwarfFrameInfo &frame);
+
     const MCSymbol &EmitCIE(MCStreamer &streamer,
                             const MCSymbol *personality,
                             unsigned personalityEncoding,
@@ -620,6 +626,55 @@
   }
 }
 
+/// EmitCompactUnwind - Emit the unwind information in a compact way. If we're
+/// successful, return 'true'. Otherwise, return 'false' and it will emit the
+/// normal CIE and FDE.
+bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
+                                         const MCDwarfFrameInfo &Frame) {
+#if 1
+  return false;
+#else
+  MCContext &Context = Streamer.getContext();
+  const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
+  Streamer.SwitchSection(TAI.getCompactUnwindSection());
+
+  unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
+  unsigned Size = getSizeForEncoding(Streamer, FDEEncoding);
+
+  // range-start range-length  compact-unwind-enc personality-func   lsda
+  //  _foo       LfooEnd-_foo  0x00000023          0                 0
+  //  _bar       LbarEnd-_bar  0x00000025         __gxx_personality  except_tab1
+  //
+  //   .section __LD,__compact_unwind,regular,debug
+  //
+  //   # compact unwind for _foo
+  //   .quad _foo
+  //   .set L1,LfooEnd-_foo
+  //   .long L1
+  //   .long 0x01010001
+  //   .quad 0
+  //   .quad 0
+  //
+  //   # compact unwind for _bar
+  //   .quad _bar
+  //   .set L2,LbarEnd-_bar
+  //   .long L2
+  //   .long 0x01020011
+  //   .quad __gxx_personality
+  //   .quad except_tab1
+
+  // Range Start
+  EmitSymbol(Streamer, *Frame.Begin, FDEEncoding);
+
+  // Range Length
+  const MCExpr *Range = MakeStartMinusEndExpr(Streamer, *Frame.Begin,
+                                              *Frame.End, 0);
+  Streamer.EmitAbsValue(Range, Size);
+
+  return true;
+#endif
+}
+
 const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
                                           const MCSymbol *personality,
                                           unsigned personalityEncoding,
@@ -846,7 +901,8 @@
   MCContext &context = streamer.getContext();
   const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
   const MCSection &section = isEH ?
-    *asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
+    *asmInfo.getEHFrameSection() :
+    *asmInfo.getDwarfFrameSection();
   streamer.SwitchSection(&section);
   MCSymbol *SectionStart = context.CreateTempSymbol();
   streamer.EmitLabel(SectionStart);
@@ -861,11 +917,17 @@
     CIEKey key(frame.Personality, frame.PersonalityEncoding,
                frame.LsdaEncoding);
     const MCSymbol *&cieStart = isEH ? CIEStarts[key] : DummyDebugKey;
+    if (isEH && asmInfo.getSupportsCompactUnwindInfo() &&
+        Emitter.EmitCompactUnwind(streamer, frame))
+      continue;
+
     if (!cieStart)
       cieStart = &Emitter.EmitCIE(streamer, frame.Personality,
                                   frame.PersonalityEncoding, frame.Lsda,
                                   frame.LsdaEncoding);
+
     fdeEnd = Emitter.EmitFDE(streamer, *cieStart, frame);
+
     if (i != n - 1)
       streamer.EmitLabel(fdeEnd);
   }





More information about the llvm-commits mailing list