[PATCH] D42720: [CodeGen] Switch non-SJLJ EH encoding to uleb128

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 7 09:49:37 PST 2018


With this change AsmPrinter::EmitPaddedULEB128 is dead, please delete
it.

Cheers,
Rafael

Ryan Prichard via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:

> rprichard updated this revision to Diff 133131.
> rprichard added a comment.
>
> Split this patch into two parts:
>
> - a patch that uses assembler directives to lay out the LSDA
> - a patch that switches the CST encoding to uleb128 and omits TTBase for empty type tables
>
>
> Repository:
>   rL LLVM
>
> https://reviews.llvm.org/D42720
>
> Files:
>   include/llvm/CodeGen/AsmPrinter.h
>   include/llvm/MC/MCObjectStreamer.h
>   include/llvm/MC/MCStreamer.h
>   lib/CodeGen/AsmPrinter/ARMException.cpp
>   lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
>   lib/CodeGen/AsmPrinter/DwarfException.h
>   lib/CodeGen/AsmPrinter/EHStreamer.cpp
>   lib/CodeGen/AsmPrinter/EHStreamer.h
>   lib/MC/MCAsmStreamer.cpp
>   lib/MC/MCObjectStreamer.cpp
>   lib/MC/MCStreamer.cpp
>   test/CodeGen/ARM/ehabi-handlerdata-nounwind.ll
>   test/CodeGen/ARM/ehabi-handlerdata.ll
>   test/CodeGen/X86/eh-unknown.ll
>   test/CodeGen/X86/patchpoint-invoke.ll
>   test/CodeGen/XCore/exception.ll
>
> Index: test/CodeGen/XCore/exception.ll
> ===================================================================
> --- test/CodeGen/XCore/exception.ll
> +++ test/CodeGen/XCore/exception.ll
> @@ -105,21 +105,27 @@
>  ; CHECK: [[LSDA]]:
>  ; CHECK: .byte  255
>  ; CHECK: .byte  0
> -; CHECK: .asciiz
> +; CHECK: .uleb128 [[TTBASE:.Lttbase[0-9]+]]-[[TTBASEREF:.Lttbaseref[0-9]+]]
> +; CHECK: [[TTBASEREF]]:
>  ; CHECK: .byte  3
> -; CHECK: .byte  26
> +; CHECK: .uleb128 [[CST_END:.Lcst_end[0-9]+]]-[[CST_BEGIN:.Lcst_begin[0-9]+]]
> +; CHECK: [[CST_BEGIN]]:
>  ; CHECK: .long [[PRE_G]]-[[START]]
>  ; CHECK: .long [[POST_G]]-[[PRE_G]]
>  ; CHECK: .long [[LANDING]]-[[START]]
>  ; CHECK: .byte 5
>  ; CHECK: .long [[POST_G]]-[[START]]
>  ; CHECK: .long [[END]]-[[POST_G]]
>  ; CHECK: .long 0
>  ; CHECK: .byte 0
> +; CHECK: [[CST_END]]:
> +; CHECK: .byte 0
>  ; CHECK: .byte 0
>  ; CHECK: .byte 1
>  ; CHECK: .byte 125
>  ; CHECK: .byte 2
>  ; CHECK: .byte 125
> +; CHECK: .p2align 2
>  ; CHECK: .long _ZTIi
>  ; CHECK: .long _ZTId
> +; CHECK: [[TTBASE]]:
> Index: test/CodeGen/X86/patchpoint-invoke.ll
> ===================================================================
> --- test/CodeGen/X86/patchpoint-invoke.ll
> +++ test/CodeGen/X86/patchpoint-invoke.ll
> @@ -34,9 +34,11 @@
>  ; CHECK:      [[EXCEPTION_LABEL]]:
>  ; CHECK-NEXT: .byte 255
>  ; CHECK-NEXT: .byte 3
> -; CHECK-NEXT: .byte 21
> +; CHECK-NEXT: .uleb128 .Lttbase{{[0-9]+}}-[[TTBASEREF:.Lttbaseref[0-9]+]]
> +; CHECK-NEXT: [[TTBASEREF]]:
>  ; CHECK-NEXT: .byte 3
> -; CHECK-NEXT: .byte 13
> +; CHECK-NEXT: .uleb128 .Lcst_end{{[0-9]+}}-[[CST_BEGIN:.Lcst_begin[0-9]+]]
> +; CHECK-NEXT: [[CST_BEGIN]]:
>  ; Verify that the unwind data covers the entire patchpoint region:
>  ; CHECK-NEXT: .long .Ltmp0-[[FUNC_BEGIN]]
>  ; CHECK-NEXT: .long [[PP_END]]-.Ltmp0
> Index: test/CodeGen/X86/eh-unknown.ll
> ===================================================================
> --- test/CodeGen/X86/eh-unknown.ll
> +++ test/CodeGen/X86/eh-unknown.ll
> @@ -23,10 +23,13 @@
>  ; CHECK: .Lexception0:
>  ; CHECK:  .byte   255                     # @LPStart Encoding = omit
>  ; CHECK:  .byte   0                       # @TType Encoding = absptr
> -; CHECK:  .asciz  "\217\200"              # @TType base offset
> +; CHECK:  .uleb128 .Lttbase0-.Lttbaseref0
> +; CHECK:  .Lttbaseref0:
>  ; CHECK:  .byte   3                       # Call site Encoding = udata4
> -; CHECK:  .byte   13                      # Call site table length
> -; CHECK:  .long   .Lfunc_begin0-.Lfunc_begin0 # >> Call Site 1 <<
> -; CHECK:  .long   .Lfunc_end0-.Lfunc_begin0 #   Call between .Lfunc_begin0 and .Lfunc_end0
> +; CHECK:  .uleb128 .Lcst_end0-.Lcst_begin0
> +; CHECK:  .Lcst_begin0:
> +; CHECK:  .long .Lfunc_begin0-.Lfunc_begin0 # >> Call Site 1 <<
> +; CHECK:  .long .Lfunc_end0-.Lfunc_begin0 #   Call between .Lfunc_begin0 and .Lfunc_end0
>  ; CHECK:  .long   0                       #     has no landing pad
>  ; CHECK:  .byte   0                       #   On action: cleanup
> +; CHECK:  .Lcst_end0:
> Index: test/CodeGen/ARM/ehabi-handlerdata.ll
> ===================================================================
> --- test/CodeGen/ARM/ehabi-handlerdata.ll
> +++ test/CodeGen/ARM/ehabi-handlerdata.ll
> @@ -51,8 +51,9 @@
>  ; CHECK-LABEL: .Lexception0:
>  ; CHECK:   .byte 255                     @ @LPStart Encoding = omit
>  ; CHECK:   .byte 0                       @ @TType Encoding = absptr
> -; CHECK:   .asciz
> +; CHECK:   .uleb128 .Lttbase
>  ; CHECK:   .byte 3                       @ Call site Encoding = udata4
> +; CHECK:   .uleb128 .Lcst_end
>  ; CHECK:   .long
>  ; CHECK:   .long
>  ; CHECK:   .long
> Index: test/CodeGen/ARM/ehabi-handlerdata-nounwind.ll
> ===================================================================
> --- test/CodeGen/ARM/ehabi-handlerdata-nounwind.ll
> +++ test/CodeGen/ARM/ehabi-handlerdata-nounwind.ll
> @@ -56,6 +56,6 @@
>  ; CHECK-LABEL: .Lexception0:
>  ; CHECK:   .byte 255                     @ @LPStart Encoding = omit
>  ; CHECK:   .byte 0                       @ @TType Encoding = absptr
> -; CHECK:   .asciz
> +; CHECK:   .uleb128 .Lttbase
>  ; CHECK:   .byte 3                       @ Call site Encoding = udata4
>  ; CHECK:   .fnend
> Index: lib/MC/MCStreamer.cpp
> ===================================================================
> --- lib/MC/MCStreamer.cpp
> +++ lib/MC/MCStreamer.cpp
> @@ -902,6 +902,16 @@
>    EmitSymbolValue(SetLabel, Size);
>  }
>  
> +void MCStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
> +                                                 const MCSymbol *Lo) {
> +  // Get the Hi-Lo expression.
> +  const MCExpr *Diff =
> +      MCBinaryExpr::createSub(MCSymbolRefExpr::create(Hi, Context),
> +                              MCSymbolRefExpr::create(Lo, Context), Context);
> +
> +  EmitULEB128Value(Diff);
> +}
> +
>  void MCStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {}
>  void MCStreamer::EmitThumbFunc(MCSymbol *Func) {}
>  void MCStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
> Index: lib/MC/MCObjectStreamer.cpp
> ===================================================================
> --- lib/MC/MCObjectStreamer.cpp
> +++ lib/MC/MCObjectStreamer.cpp
> @@ -51,17 +51,34 @@
>    PendingLabels.clear();
>  }
>  
> +// As a compile-time optimization, avoid allocating and evaluating an MCExpr
> +// tree for (Hi - Lo) when Hi and Lo are offsets into the same fragment.
> +static Optional<uint64_t> absoluteSymbolDiff(const MCSymbol *Hi,
> +                                             const MCSymbol *Lo) {
> +  if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment() ||
> +      Hi->isVariable() || Lo->isVariable())
> +    return None;
> +
> +  return Hi->getOffset() - Lo->getOffset();
> +}
> +
>  void MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi,
>                                                const MCSymbol *Lo,
>                                                unsigned Size) {
> -  // If not assigned to the same (valid) fragment, fallback.
> -  if (!Hi->getFragment() || Hi->getFragment() != Lo->getFragment() ||
> -      Hi->isVariable() || Lo->isVariable()) {
> -    MCStreamer::emitAbsoluteSymbolDiff(Hi, Lo, Size);
> +  if (Optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo)) {
> +    EmitIntValue(*Diff, Size);
>      return;
>    }
> +  MCStreamer::emitAbsoluteSymbolDiff(Hi, Lo, Size);
> +}
>  
> -  EmitIntValue(Hi->getOffset() - Lo->getOffset(), Size);
> +void MCObjectStreamer::emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
> +                                                       const MCSymbol *Lo) {
> +  if (Optional<uint64_t> Diff = absoluteSymbolDiff(Hi, Lo)) {
> +    EmitULEB128IntValue(*Diff);
> +    return;
> +  }
> +  MCStreamer::emitAbsoluteSymbolDiffAsULEB128(Hi, Lo);
>  }
>  
>  void MCObjectStreamer::reset() {
> Index: lib/MC/MCAsmStreamer.cpp
> ===================================================================
> --- lib/MC/MCAsmStreamer.cpp
> +++ lib/MC/MCAsmStreamer.cpp
> @@ -910,7 +910,7 @@
>      EmitULEB128IntValue(IntValue);
>      return;
>    }
> -  OS << ".uleb128 ";
> +  OS << "\t.uleb128 ";
>    Value->print(OS, MAI);
>    EmitEOL();
>  }
> @@ -921,7 +921,7 @@
>      EmitSLEB128IntValue(IntValue);
>      return;
>    }
> -  OS << ".sleb128 ";
> +  OS << "\t.sleb128 ";
>    Value->print(OS, MAI);
>    EmitEOL();
>  }
> Index: lib/CodeGen/AsmPrinter/EHStreamer.h
> ===================================================================
> --- lib/CodeGen/AsmPrinter/EHStreamer.h
> +++ lib/CodeGen/AsmPrinter/EHStreamer.h
> @@ -72,9 +72,9 @@
>  
>    /// Compute the actions table and gather the first action index for each
>    /// landing pad site.
> -  unsigned computeActionsTable(const SmallVectorImpl<const LandingPadInfo*>&LPs,
> -                               SmallVectorImpl<ActionEntry> &Actions,
> -                               SmallVectorImpl<unsigned> &FirstActions);
> +  void computeActionsTable(const SmallVectorImpl<const LandingPadInfo*> &LPs,
> +                           SmallVectorImpl<ActionEntry> &Actions,
> +                           SmallVectorImpl<unsigned> &FirstActions);
>  
>    void computePadMap(const SmallVectorImpl<const LandingPadInfo *> &LandingPads,
>                       RangeMapType &PadMap);
> @@ -110,7 +110,7 @@
>    ///     catches in the function.  This tables is reversed indexed base 1.
>    void emitExceptionTable();
>  
> -  virtual void emitTypeInfos(unsigned TTypeEncoding);
> +  virtual void emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel);
>  
>    // Helpers for identifying what kind of clause an EH typeid or selector
>    // corresponds to. Negative selectors are for filter clauses, the zero
> Index: lib/CodeGen/AsmPrinter/EHStreamer.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/EHStreamer.cpp
> +++ lib/CodeGen/AsmPrinter/EHStreamer.cpp
> @@ -58,7 +58,7 @@
>  
>  /// Compute the actions table and gather the first action index for each landing
>  /// pad site.
> -unsigned EHStreamer::
> +void EHStreamer::
>  computeActionsTable(const SmallVectorImpl<const LandingPadInfo*> &LandingPads,
>                      SmallVectorImpl<ActionEntry> &Actions,
>                      SmallVectorImpl<unsigned> &FirstActions) {
> @@ -161,8 +161,6 @@
>  
>      PrevLPI = LPI;
>    }
> -
> -  return SizeActions;
>  }
>  
>  /// Return `true' if this is a call to a function marked `nounwind'. Return
> @@ -369,47 +367,23 @@
>    // landing pad site.
>    SmallVector<ActionEntry, 32> Actions;
>    SmallVector<unsigned, 64> FirstActions;
> -  unsigned SizeActions =
> -    computeActionsTable(LandingPads, Actions, FirstActions);
> +  computeActionsTable(LandingPads, Actions, FirstActions);
>  
>    // Compute the call-site table.
>    SmallVector<CallSiteEntry, 64> CallSites;
>    computeCallSiteTable(CallSites, LandingPads, FirstActions);
>  
> -  // Final tallies.
> -
> -  // Call sites.
>    bool IsSJLJ = Asm->MAI->getExceptionHandlingType() == ExceptionHandling::SjLj;
>    bool HaveTTData = IsSJLJ ? (!TypeInfos.empty() || !FilterIds.empty()) : true;
>  
> -  unsigned CallSiteTableLength;
> -  if (IsSJLJ)
> -    CallSiteTableLength = 0;
> -  else {
> -    unsigned SiteStartSize  = 4; // dwarf::DW_EH_PE_udata4
> -    unsigned SiteLengthSize = 4; // dwarf::DW_EH_PE_udata4
> -    unsigned LandingPadSize = 4; // dwarf::DW_EH_PE_udata4
> -    CallSiteTableLength =
> -      CallSites.size() * (SiteStartSize + SiteLengthSize + LandingPadSize);
> -  }
> -
> -  for (unsigned i = 0, e = CallSites.size(); i < e; ++i) {
> -    CallSiteTableLength += getULEB128Size(CallSites[i].Action);
> -    if (IsSJLJ)
> -      CallSiteTableLength += getULEB128Size(i);
> -  }
> -
>    // Type infos.
>    MCSection *LSDASection = Asm->getObjFileLowering().getLSDASection();
>    unsigned TTypeEncoding;
> -  unsigned TypeFormatSize;
>  
>    if (!HaveTTData) {
>      // For SjLj exceptions, if there is no TypeInfo, then we just explicitly say
>      // that we're omitting that bit.
>      TTypeEncoding = dwarf::DW_EH_PE_omit;
> -    // dwarf::DW_EH_PE_absptr
> -    TypeFormatSize = Asm->getDataLayout().getPointerSize();
>    } else {
>      // Okay, we have actual filters or typeinfos to emit.  As such, we need to
>      // pick a type encoding for them.  We're about to emit a list of pointers to
> @@ -439,7 +413,6 @@
>      // in target-independent code.
>      //
>      TTypeEncoding = Asm->getObjFileLowering().getTTypeEncoding();
> -    TypeFormatSize = Asm->GetSizeOfEncodedValue(TTypeEncoding);
>    }
>  
>    // Begin the exception table.
> @@ -460,64 +433,35 @@
>    Asm->EmitEncodingByte(dwarf::DW_EH_PE_omit, "@LPStart");
>    Asm->EmitEncodingByte(TTypeEncoding, "@TType");
>  
> -  // The type infos need to be aligned. GCC does this by inserting padding just
> -  // before the type infos. However, this changes the size of the exception
> -  // table, so you need to take this into account when you output the exception
> -  // table size. However, the size is output using a variable length encoding.
> -  // So by increasing the size by inserting padding, you may increase the number
> -  // of bytes used for writing the size. If it increases, say by one byte, then
> -  // you now need to output one less byte of padding to get the type infos
> -  // aligned. However this decreases the size of the exception table. This
> -  // changes the value you have to output for the exception table size. Due to
> -  // the variable length encoding, the number of bytes used for writing the
> -  // length may decrease. If so, you then have to increase the amount of
> -  // padding. And so on. If you look carefully at the GCC code you will see that
> -  // it indeed does this in a loop, going on and on until the values stabilize.
> -  // We chose another solution: don't output padding inside the table like GCC
> -  // does, instead output it before the table.
> -  unsigned SizeTypes = TypeInfos.size() * TypeFormatSize;
> -  unsigned CallSiteTableLengthSize = getULEB128Size(CallSiteTableLength);
> -  unsigned TTypeBaseOffset =
> -    sizeof(int8_t) +                            // Call site format
> -    CallSiteTableLengthSize +                   // Call site table length size
> -    CallSiteTableLength +                       // Call site table length
> -    SizeActions +                               // Actions size
> -    SizeTypes;
> -  unsigned TTypeBaseOffsetSize = getULEB128Size(TTypeBaseOffset);
> -  unsigned TotalSize =
> -    sizeof(int8_t) +                            // LPStart format
> -    sizeof(int8_t) +                            // TType format
> -    (HaveTTData ? TTypeBaseOffsetSize : 0) +    // TType base offset size
> -    TTypeBaseOffset;                            // TType base offset
> -  unsigned PadBytes = (4 - TotalSize) & 3;
> -
> +  MCSymbol *TTBaseLabel = nullptr;
>    if (HaveTTData) {
> -    // Account for any extra padding that will be added to the call site table
> -    // length.
> -    Asm->EmitPaddedULEB128(TTypeBaseOffset, TTypeBaseOffsetSize + PadBytes,
> -                           "@TType base offset");
> -    PadBytes = 0;
> +    // N.B.: There is a dependency loop between the size of the TTBase uleb128
> +    // here and the amount of padding before the aligned type table. The
> +    // assembler must sometimes pad this uleb128 or insert extra padding before
> +    // the type table. See PR35809 or GNU as bug 4029.
> +    MCSymbol *TTBaseRefLabel = Asm->createTempSymbol("ttbaseref");
> +    TTBaseLabel = Asm->createTempSymbol("ttbase");
> +    Asm->EmitLabelDifferenceAsULEB128(TTBaseLabel, TTBaseRefLabel);
> +    Asm->OutStreamer->EmitLabel(TTBaseRefLabel);
>    }
>  
>    bool VerboseAsm = Asm->OutStreamer->isVerboseAsm();
>  
> +  // Emit the landing pad call site table.
> +  MCSymbol *CstBeginLabel = Asm->createTempSymbol("cst_begin");
> +  MCSymbol *CstEndLabel = Asm->createTempSymbol("cst_end");
> +  Asm->EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
> +  Asm->EmitLabelDifferenceAsULEB128(CstEndLabel, CstBeginLabel);
> +  Asm->OutStreamer->EmitLabel(CstBeginLabel);
> +
>    // SjLj Exception handling
>    if (IsSJLJ) {
> -    Asm->EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
> -
> -    // Add extra padding if it wasn't added to the TType base offset.
> -    Asm->EmitPaddedULEB128(CallSiteTableLength,
> -                           CallSiteTableLengthSize + PadBytes,
> -                           "Call site table length");
> -
> -    // Emit the landing pad site information.
>      unsigned idx = 0;
>      for (SmallVectorImpl<CallSiteEntry>::const_iterator
>           I = CallSites.begin(), E = CallSites.end(); I != E; ++I, ++idx) {
>        const CallSiteEntry &S = *I;
>  
> -      // Offset of the landing pad, counted in 16-byte bundles relative to the
> -      // @LPStart address.
> +      // Index of the call site entry.
>        if (VerboseAsm) {
>          Asm->OutStreamer->AddComment(">> Call Site " + Twine(idx) + " <<");
>          Asm->OutStreamer->AddComment("  On exception at call site "+Twine(idx));
> @@ -557,14 +501,6 @@
>      // A missing entry in the call-site table indicates that a call is not
>      // supposed to throw.
>  
> -    // Emit the landing pad call site table.
> -    Asm->EmitEncodingByte(dwarf::DW_EH_PE_udata4, "Call site");
> -
> -    // Add extra padding if it wasn't added to the TType base offset.
> -    Asm->EmitPaddedULEB128(CallSiteTableLength,
> -                           CallSiteTableLengthSize + PadBytes,
> -                           "Call site table length");
> -
>      unsigned Entry = 0;
>      for (SmallVectorImpl<CallSiteEntry>::const_iterator
>           I = CallSites.begin(), E = CallSites.end(); I != E; ++I) {
> @@ -579,9 +515,7 @@
>        if (!EndLabel)
>          EndLabel = Asm->getFunctionEnd();
>  
> -      // Offset of the call site relative to the previous call site, counted in
> -      // number of 16-byte bundles. The first call site is counted relative to
> -      // the start of the procedure fragment.
> +      // Offset of the call site relative to the start of the procedure.
>        if (VerboseAsm)
>          Asm->OutStreamer->AddComment(">> Call Site " + Twine(++Entry) + " <<");
>        Asm->EmitLabelDifference(BeginLabel, EHFuncBeginSym, 4);
> @@ -591,8 +525,7 @@
>                                       EndLabel->getName());
>        Asm->EmitLabelDifference(EndLabel, BeginLabel, 4);
>  
> -      // Offset of the landing pad, counted in 16-byte bundles relative to the
> -      // @LPStart address.
> +      // Offset of the landing pad relative to the start of the procedure.
>        if (!S.LPad) {
>          if (VerboseAsm)
>            Asm->OutStreamer->AddComment("    has no landing pad");
> @@ -617,6 +550,7 @@
>        Asm->EmitULEB128(S.Action);
>      }
>    }
> +  Asm->OutStreamer->EmitLabel(CstEndLabel);
>  
>    // Emit the Action Table.
>    int Entry = 0;
> @@ -660,12 +594,15 @@
>      Asm->EmitSLEB128(Action.NextAction);
>    }
>  
> -  emitTypeInfos(TTypeEncoding);
> +  if (HaveTTData) {
> +    Asm->EmitAlignment(2);
> +    emitTypeInfos(TTypeEncoding, TTBaseLabel);
> +  }
>  
>    Asm->EmitAlignment(2);
>  }
>  
> -void EHStreamer::emitTypeInfos(unsigned TTypeEncoding) {
> +void EHStreamer::emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) {
>    const MachineFunction *MF = Asm->MF;
>    const std::vector<const GlobalValue *> &TypeInfos = MF->getTypeInfos();
>    const std::vector<unsigned> &FilterIds = MF->getFilterIds();
> @@ -687,6 +624,8 @@
>      Asm->EmitTTypeReference(GV, TTypeEncoding);
>    }
>  
> +  Asm->OutStreamer->EmitLabel(TTBaseLabel);
> +
>    // Emit the Exception Specifications.
>    if (VerboseAsm && !FilterIds.empty()) {
>      Asm->OutStreamer->AddComment(">> Filter TypeInfos <<");
> Index: lib/CodeGen/AsmPrinter/DwarfException.h
> ===================================================================
> --- lib/CodeGen/AsmPrinter/DwarfException.h
> +++ lib/CodeGen/AsmPrinter/DwarfException.h
> @@ -70,7 +70,7 @@
>  };
>  
>  class LLVM_LIBRARY_VISIBILITY ARMException : public DwarfCFIExceptionBase {
> -  void emitTypeInfos(unsigned TTypeEncoding) override;
> +  void emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) override;
>    ARMTargetStreamer &getTargetStreamer();
>  
>  public:
> Index: lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> +++ lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> @@ -59,14 +59,24 @@
>    OutStreamer->EmitULEB128IntValue(Value);
>  }
>  
> +/// Emit something like ".uleb128 Hi-Lo".
> +void AsmPrinter::EmitLabelDifferenceAsULEB128(const MCSymbol *Hi,
> +                                              const MCSymbol *Lo) const {
> +  OutStreamer->emitAbsoluteSymbolDiffAsULEB128(Hi, Lo);
> +}
> +
>  static const char *DecodeDWARFEncoding(unsigned Encoding) {
>    switch (Encoding) {
>    case dwarf::DW_EH_PE_absptr:
>      return "absptr";
>    case dwarf::DW_EH_PE_omit:
>      return "omit";
>    case dwarf::DW_EH_PE_pcrel:
>      return "pcrel";
> +  case dwarf::DW_EH_PE_uleb128:
> +    return "uleb128";
> +  case dwarf::DW_EH_PE_sleb128:
> +    return "sleb128";
>    case dwarf::DW_EH_PE_udata4:
>      return "udata4";
>    case dwarf::DW_EH_PE_udata8:
> Index: lib/CodeGen/AsmPrinter/ARMException.cpp
> ===================================================================
> --- lib/CodeGen/AsmPrinter/ARMException.cpp
> +++ lib/CodeGen/AsmPrinter/ARMException.cpp
> @@ -91,7 +91,7 @@
>      ATS.emitFnEnd();
>  }
>  
> -void ARMException::emitTypeInfos(unsigned TTypeEncoding) {
> +void ARMException::emitTypeInfos(unsigned TTypeEncoding, MCSymbol *TTBaseLabel) {
>    const MachineFunction *MF = Asm->MF;
>    const std::vector<const GlobalValue *> &TypeInfos = MF->getTypeInfos();
>    const std::vector<unsigned> &FilterIds = MF->getFilterIds();
> @@ -112,6 +112,8 @@
>      Asm->EmitTTypeReference(GV, TTypeEncoding);
>    }
>  
> +  Asm->OutStreamer->EmitLabel(TTBaseLabel);
> +
>    // Emit the Exception Specifications.
>    if (VerboseAsm && !FilterIds.empty()) {
>      Asm->OutStreamer->AddComment(">> Filter TypeInfos <<");
> Index: include/llvm/MC/MCStreamer.h
> ===================================================================
> --- include/llvm/MC/MCStreamer.h
> +++ include/llvm/MC/MCStreamer.h
> @@ -828,6 +828,10 @@
>    virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
>                                        unsigned Size);
>  
> +  /// Emit the absolute difference between two symbols encoded with ULEB128.
> +  virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
> +                                               const MCSymbol *Lo);
> +
>    virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);
>    virtual void EmitCFISections(bool EH, bool Debug);
>    void EmitCFIStartProc(bool IsSimple);
> Index: include/llvm/MC/MCObjectStreamer.h
> ===================================================================
> --- include/llvm/MC/MCObjectStreamer.h
> +++ include/llvm/MC/MCObjectStreamer.h
> @@ -179,6 +179,9 @@
>    void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,
>                                unsigned Size) override;
>  
> +  void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi,
> +                                       const MCSymbol *Lo) override;
> +
>    bool mayHaveInstructions(MCSection &Sec) const override;
>  };
>  
> Index: include/llvm/CodeGen/AsmPrinter.h
> ===================================================================
> --- include/llvm/CodeGen/AsmPrinter.h
> +++ include/llvm/CodeGen/AsmPrinter.h
> @@ -458,6 +458,10 @@
>    void EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
>                             unsigned Size) const;
>  
> +  /// Emit something like ".uleb128 Hi-Lo".
> +  void EmitLabelDifferenceAsULEB128(const MCSymbol *Hi,
> +                                    const MCSymbol *Lo) const;
> +
>    /// Emit something like ".long Label+Offset" where the size in bytes of the
>    /// directive is specified by Size and Label specifies the label.  This
>    /// implicitly uses .set if it is available.
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list