diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 64 | 
1 files changed, 63 insertions, 1 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 97e7dbdf868..937dad41026 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -507,6 +507,12 @@ namespace {        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 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,    }  } +/// 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 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,    MCContext &context = streamer.getContext();    const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();    const MCSection §ion = isEH ? -    *asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection(); +    *asmInfo.getEHFrameSection() : +    *asmInfo.getDwarfFrameSection();    streamer.SwitchSection(§ion);    MCSymbol *SectionStart = context.CreateTempSymbol();    streamer.EmitLabel(SectionStart); @@ -861,11 +917,17 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,      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);    }  | 

