[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