Index: include/llvm/CodeGen/TargetLoweringObjectFileImpl.h =================================================================== --- include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -132,6 +132,8 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { + mutable unsigned NextUniqueID = 1; + public: ~TargetLoweringObjectFileCOFF() override {} Index: include/llvm/MC/MCContext.h =================================================================== --- include/llvm/MC/MCContext.h +++ include/llvm/MC/MCContext.h @@ -87,6 +87,9 @@ /// other. DenseMap SectionSymbols; + unsigned NextTextSectionID = 1; + DenseMap TextSectionIDs; + /// A mapping from a local label number and an instance count to a symbol. /// For example, in the assembly /// 1: @@ -200,16 +203,19 @@ std::string SectionName; StringRef GroupName; int SelectionKey; + unsigned UniqueID; COFFSectionKey(StringRef SectionName, StringRef GroupName, - int SelectionKey) + int SelectionKey, unsigned UniqueID) : SectionName(SectionName), GroupName(GroupName), - SelectionKey(SelectionKey) {} + SelectionKey(SelectionKey), UniqueID(UniqueID) {} bool operator<(const COFFSectionKey &Other) const { if (SectionName != Other.SectionName) return SectionName < Other.SectionName; if (GroupName != Other.GroupName) return GroupName < Other.GroupName; - return SelectionKey < Other.SelectionKey; + if (SelectionKey != Other.SelectionKey) + return SelectionKey < Other.SelectionKey; + return UniqueID < Other.UniqueID; } }; @@ -381,7 +387,7 @@ MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics, SectionKind Kind, StringRef COMDATSymName, - int Selection, + int Selection, unsigned UniqueID, const char *BeginSymName = nullptr); MCSectionCOFF *getCOFFSection(StringRef Section, unsigned Characteristics, @@ -395,7 +401,16 @@ /// associated with an inline function, pass the normal debug info section /// as Sec and the function symbol as KeySym. MCSectionCOFF *getAssociativeCOFFSection(MCSectionCOFF *Sec, - const MCSymbol *KeySym); + const MCSymbol *KeySym, + unsigned UniqueID); + + /// Get the .pdata section used for the given section. Typically the given + /// section is either the main .text section or some other COMDAT .text + /// section, but it may be any section containing code. + MCSection *getPDataSectionForTextSection(const MCSection *TextSec); + + /// Get the .xdata section used for the given section. + MCSection *getXDataSectionForTextSection(const MCSection *TextSec); // Create and save a copy of STI and return a reference to the copy. MCSubtargetInfo &getSubtargetCopy(const MCSubtargetInfo &STI); Index: include/llvm/MC/MCWinEH.h =================================================================== --- include/llvm/MC/MCWinEH.h +++ include/llvm/MC/MCWinEH.h @@ -13,11 +13,9 @@ #include namespace llvm { -class MCContext; class MCSection; class MCStreamer; class MCSymbol; -class StringRef; namespace WinEH { struct Instruction { @@ -31,50 +29,35 @@ }; struct FrameInfo { - const MCSymbol *Begin; - const MCSymbol *End; - const MCSymbol *ExceptionHandler; - const MCSymbol *Function; - const MCSymbol *PrologEnd; - const MCSymbol *Symbol; + const MCSymbol *Begin = nullptr; + const MCSymbol *End = nullptr; + const MCSymbol *ExceptionHandler = nullptr; + const MCSymbol *Function = nullptr; + const MCSymbol *PrologEnd = nullptr; + const MCSymbol *Symbol = nullptr; + const MCSection *TextSection = nullptr; - bool HandlesUnwind; - bool HandlesExceptions; + bool HandlesUnwind = false; + bool HandlesExceptions = false; - int LastFrameInst; - const FrameInfo *ChainedParent; + int LastFrameInst = -1; + const FrameInfo *ChainedParent = nullptr; std::vector Instructions; - FrameInfo() - : Begin(nullptr), End(nullptr), ExceptionHandler(nullptr), - Function(nullptr), PrologEnd(nullptr), Symbol(nullptr), - HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), - ChainedParent(nullptr), Instructions() {} + FrameInfo() = default; FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel) - : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr), - Function(Function), PrologEnd(nullptr), Symbol(nullptr), - HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), - ChainedParent(nullptr), Instructions() {} + : Begin(BeginFuncEHLabel), Function(Function) {} FrameInfo(const MCSymbol *Function, const MCSymbol *BeginFuncEHLabel, const FrameInfo *ChainedParent) - : Begin(BeginFuncEHLabel), End(nullptr), ExceptionHandler(nullptr), - Function(Function), PrologEnd(nullptr), Symbol(nullptr), - HandlesUnwind(false), HandlesExceptions(false), LastFrameInst(-1), - ChainedParent(ChainedParent), Instructions() {} + : Begin(BeginFuncEHLabel), Function(Function), + ChainedParent(ChainedParent) {} }; class UnwindEmitter { public: - static MCSection *getPDataSection(const MCSymbol *Function, - MCContext &Context); - static MCSection *getXDataSection(const MCSymbol *Function, - MCContext &Context); + virtual ~UnwindEmitter(); - virtual ~UnwindEmitter() { } - - // - // This emits the unwind info sections (.pdata and .xdata in PE/COFF). - // + /// This emits the unwind info sections (.pdata and .xdata in PE/COFF). virtual void Emit(MCStreamer &Streamer) const = 0; virtual void EmitUnwindInfo(MCStreamer &Streamer, FrameInfo *FI) const = 0; }; Index: lib/CodeGen/AsmPrinter/WinException.cpp =================================================================== --- lib/CodeGen/AsmPrinter/WinException.cpp +++ lib/CodeGen/AsmPrinter/WinException.cpp @@ -124,10 +124,9 @@ if (shouldEmitPersonality || shouldEmitLSDA) { Asm->OutStreamer->PushSection(); - // Just switch sections to the right xdata section. This use of CurrentFnSym - // assumes that we only emit the LSDA when ending the parent function. - MCSection *XData = WinEH::UnwindEmitter::getXDataSection(Asm->CurrentFnSym, - Asm->OutContext); + // Just switch sections to the right xdata section. + MCSection *XData = Asm->OutContext.getXDataSectionForTextSection( + Asm->OutStreamer->getCurrentSectionOnly()); Asm->OutStreamer->SwitchSection(XData); // Emit the tables appropriate to the personality function in use. If we Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp =================================================================== --- lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -912,11 +912,13 @@ Selection = 0; } } - return getContext().getCOFFSection(Name, - Characteristics, - Kind, - COMDATSymName, - Selection); + + // Using a unique ID of zero ensures that all globals using this explicit + // section get the same object file section. + unsigned UniqueID = 0; + + return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName, + Selection, UniqueID); } static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) { @@ -956,16 +958,21 @@ else ComdatGV = GV; + // Zero is the generic id. + unsigned UniqueID = 0; + if (EmitUniquedSection) + UniqueID = NextUniqueID++; + if (!ComdatGV->hasPrivateLinkage()) { MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); StringRef COMDATSymName = Sym->getName(); return getContext().getCOFFSection(Name, Characteristics, Kind, - COMDATSymName, Selection); + COMDATSymName, Selection, UniqueID); } else { SmallString<256> TmpData; Mang.getNameWithPrefix(TmpData, GV, /*CannotUsePrivateLabel=*/true); return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData, - Selection); + Selection, UniqueID); } } @@ -1019,9 +1026,10 @@ const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); unsigned Characteristics = getCOFFSectionFlags(Kind); Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; + unsigned UniqueID = NextUniqueID++; return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName, - COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); + COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, UniqueID); } void TargetLoweringObjectFileCOFF:: @@ -1063,13 +1071,13 @@ MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection( unsigned Priority, const MCSymbol *KeySym) const { return getContext().getAssociativeCOFFSection( - cast(StaticCtorSection), KeySym); + cast(StaticCtorSection), KeySym, 0); } MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection( unsigned Priority, const MCSymbol *KeySym) const { return getContext().getAssociativeCOFFSection( - cast(StaticDtorSection), KeySym); + cast(StaticDtorSection), KeySym, 0); } void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal( Index: lib/MC/MCAsmStreamer.cpp =================================================================== --- lib/MC/MCAsmStreamer.cpp +++ lib/MC/MCAsmStreamer.cpp @@ -1288,8 +1288,8 @@ // We only do this so the section switch that terminates the handler // data block is visible. WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo(); - MCSection *XData = - WinEH::UnwindEmitter::getXDataSection(CurFrame->Function, getContext()); + MCSection *TextSec = &CurFrame->Function->getSection(); + MCSection *XData = getContext().getXDataSectionForTextSection(TextSec); SwitchSectionNoChange(XData); OS << "\t.seh_handlerdata"; Index: lib/MC/MCContext.cpp =================================================================== --- lib/MC/MCContext.cpp +++ lib/MC/MCContext.cpp @@ -372,6 +372,7 @@ unsigned Characteristics, SectionKind Kind, StringRef COMDATSymName, int Selection, + unsigned UniqueID, const char *BeginSymName) { MCSymbol *COMDATSymbol = nullptr; if (!COMDATSymName.empty()) { @@ -380,7 +381,7 @@ } // Do the lookup, if we have a hit, return it. - COFFSectionKey T{Section, COMDATSymName, Selection}; + COFFSectionKey T{Section, COMDATSymName, Selection, UniqueID}; auto IterBool = COFFUniquingMap.insert(std::make_pair(T, nullptr)); auto Iter = IterBool.first; if (!IterBool.second) @@ -402,11 +403,11 @@ unsigned Characteristics, SectionKind Kind, const char *BeginSymName) { - return getCOFFSection(Section, Characteristics, Kind, "", 0, BeginSymName); + return getCOFFSection(Section, Characteristics, Kind, "", 0, 0, BeginSymName); } MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) { - COFFSectionKey T{Section, "", 0}; + COFFSectionKey T{Section, "", 0, 0}; auto Iter = COFFUniquingMap.find(T); if (Iter == COFFUniquingMap.end()) return nullptr; @@ -414,18 +415,61 @@ } MCSectionCOFF *MCContext::getAssociativeCOFFSection(MCSectionCOFF *Sec, - const MCSymbol *KeySym) { - // Return the normal section if we don't have to be associative. - if (!KeySym) + const MCSymbol *KeySym, + unsigned UniqueID) { + // Return the normal section if we don't have to be associative or unique. + if (!KeySym && UniqueID == 0) return Sec; - // Make an associative section with the same name and kind as the normal - // section. - unsigned Characteristics = - Sec->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT; + // If we have a key symbol, make an associative section with the same name and + // kind as the normal section. + unsigned Characteristics = Sec->getCharacteristics(); + if (KeySym) { + Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; + return getCOFFSection(Sec->getSectionName(), Characteristics, + Sec->getKind(), KeySym->getName(), + COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, UniqueID); + } + return getCOFFSection(Sec->getSectionName(), Characteristics, Sec->getKind(), - KeySym->getName(), - COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); + "", 0, UniqueID); +} + +static MCSection * +getCOFFUnwindInfoSection(MCContext &Context, unsigned *NextUniqueID, + DenseMap &TextSectionIDs, + MCSection *UnwindSec, const MCSectionCOFF *TextSec) { + // If this is the main .text section, use the main unwind info section. + if (TextSec == Context.getObjectFileInfo()->getTextSection()) + return UnwindSec; + + // If this is not the main .text section, we need a unique unwind info section + // for it. Compute a unique id for the text section. + auto IP = TextSectionIDs.insert({TextSec, *NextUniqueID}); + if (IP.second) + (*NextUniqueID)++; + unsigned UniqueID = IP.first->second; + + // If this section is COMDAT, this unwind section should be COMDAT associative + // with its group. + const MCSymbol *KeySym = nullptr; + if (TextSec->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) + KeySym = TextSec->getCOMDATSymbol(); + + return Context.getAssociativeCOFFSection(cast(UnwindSec), + KeySym, UniqueID); +} + +MCSection *MCContext::getPDataSectionForTextSection(const MCSection *TextSec) { + return getCOFFUnwindInfoSection(*this, &NextTextSectionID, TextSectionIDs, + getObjectFileInfo()->getPDataSection(), + cast(TextSec)); +} + +MCSection *MCContext::getXDataSectionForTextSection(const MCSection *TextSec) { + return getCOFFUnwindInfoSection(*this, &NextTextSectionID, TextSectionIDs, + getObjectFileInfo()->getXDataSection(), + cast(TextSec)); } MCSubtargetInfo &MCContext::getSubtargetCopy(const MCSubtargetInfo &STI) { Index: lib/MC/MCParser/COFFAsmParser.cpp =================================================================== --- lib/MC/MCParser/COFFAsmParser.cpp +++ lib/MC/MCParser/COFFAsmParser.cpp @@ -305,8 +305,12 @@ return TokError("unexpected token in section switching directive"); Lex(); + // FIXME: Expose this functionality to the user through the .section directive + // similar to how ELF does it. + unsigned UniqueID = 0; + getStreamer().SwitchSection(getContext().getCOFFSection( - Section, Characteristics, Kind, COMDATSymName, Type)); + Section, Characteristics, Kind, COMDATSymName, Type, UniqueID)); return false; } Index: lib/MC/MCStreamer.cpp =================================================================== --- lib/MC/MCStreamer.cpp +++ lib/MC/MCStreamer.cpp @@ -446,6 +446,7 @@ WinFrameInfos.push_back(new WinEH::FrameInfo(Symbol, StartProc)); CurrentWinFrameInfo = WinFrameInfos.back(); + CurrentWinFrameInfo->TextSection = getCurrentSectionOnly(); } void MCStreamer::EmitWinCFIEndProc() { @@ -467,6 +468,7 @@ WinFrameInfos.push_back(new WinEH::FrameInfo(CurrentWinFrameInfo->Function, StartProc, CurrentWinFrameInfo)); CurrentWinFrameInfo = WinFrameInfos.back(); + CurrentWinFrameInfo->TextSection = getCurrentSectionOnly(); } void MCStreamer::EmitWinCFIEndChained() { Index: lib/MC/MCWin64EH.cpp =================================================================== --- lib/MC/MCWin64EH.cpp +++ lib/MC/MCWin64EH.cpp @@ -17,7 +17,7 @@ #include "llvm/MC/MCSymbol.h" #include "llvm/Support/Win64EH.h" -namespace llvm { +using namespace llvm; // NOTE: All relocations generated here are 4-byte image-relative. @@ -218,35 +218,32 @@ } } -namespace Win64EH { -void UnwindEmitter::Emit(MCStreamer &Streamer) const { +void llvm::Win64EH::UnwindEmitter::Emit(MCStreamer &Streamer) const { MCContext &Context = Streamer.getContext(); // Emit the unwind info structs first. - for (const auto &CFI : Streamer.getWinFrameInfos()) { - MCSection *XData = getXDataSection(CFI->Function, Context); + for (WinEH::FrameInfo *CFI : Streamer.getWinFrameInfos()) { + MCSection *XData = Context.getXDataSectionForTextSection(CFI->TextSection); Streamer.SwitchSection(XData); - EmitUnwindInfo(Streamer, CFI); + ::EmitUnwindInfo(Streamer, CFI); } // Now emit RUNTIME_FUNCTION entries. - for (const auto &CFI : Streamer.getWinFrameInfos()) { - MCSection *PData = getPDataSection(CFI->Function, Context); + for (WinEH::FrameInfo *CFI : Streamer.getWinFrameInfos()) { + MCSection *PData = Context.getPDataSectionForTextSection(CFI->TextSection); Streamer.SwitchSection(PData); EmitRuntimeFunction(Streamer, CFI); } } -void UnwindEmitter::EmitUnwindInfo(MCStreamer &Streamer, - WinEH::FrameInfo *info) const { +void llvm::Win64EH::UnwindEmitter::EmitUnwindInfo( + MCStreamer &Streamer, WinEH::FrameInfo *info) const { // Switch sections (the static function above is meant to be called from // here and from Emit(). - MCContext &context = Streamer.getContext(); - MCSection *xdataSect = getXDataSection(info->Function, context); - Streamer.SwitchSection(xdataSect); + MCContext &Context = Streamer.getContext(); + MCSection *XData = Context.getXDataSectionForTextSection(info->TextSection); + Streamer.SwitchSection(XData); - llvm::EmitUnwindInfo(Streamer, info); -} + ::EmitUnwindInfo(Streamer, info); } -} // End of namespace llvm Index: lib/MC/MCWinEH.cpp =================================================================== --- lib/MC/MCWinEH.cpp +++ lib/MC/MCWinEH.cpp @@ -19,60 +19,7 @@ namespace llvm { namespace WinEH { -/// We can't have one section for all .pdata or .xdata because the Microsoft -/// linker seems to want all code relocations to refer to the same object file -/// section. If the code described is comdat, create a new comdat section -/// associated with that comdat. If the code described is not in the main .text -/// section, make a new section for it. Otherwise use the main unwind info -/// section. -static MCSection *getUnwindInfoSection(StringRef SecName, - MCSectionCOFF *UnwindSec, - const MCSymbol *Function, - MCContext &Context) { - if (Function && Function->isInSection()) { - // If Function is in a COMDAT, get or create an unwind info section in that - // COMDAT group. - const MCSectionCOFF *FunctionSection = - cast(&Function->getSection()); - if (FunctionSection->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { - return Context.getAssociativeCOFFSection( - UnwindSec, FunctionSection->getCOMDATSymbol()); - } - - // If Function is in a section other than .text, create a new .pdata section. - // Otherwise use the plain .pdata section. - if (const auto *Section = dyn_cast(FunctionSection)) { - StringRef CodeSecName = Section->getSectionName(); - if (CodeSecName == ".text") - return UnwindSec; - - if (CodeSecName.startswith(".text$")) - CodeSecName = CodeSecName.substr(6); - - return Context.getCOFFSection((SecName + Twine('$') + CodeSecName).str(), - COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | - COFF::IMAGE_SCN_MEM_READ, - SectionKind::getData()); - } - } - - return UnwindSec; - -} - -MCSection *UnwindEmitter::getPDataSection(const MCSymbol *Function, - MCContext &Context) { - MCSectionCOFF *PData = - cast(Context.getObjectFileInfo()->getPDataSection()); - return getUnwindInfoSection(".pdata", PData, Function, Context); -} - -MCSection *UnwindEmitter::getXDataSection(const MCSymbol *Function, - MCContext &Context) { - MCSectionCOFF *XData = - cast(Context.getObjectFileInfo()->getXDataSection()); - return getUnwindInfoSection(".xdata", XData, Function, Context); -} +UnwindEmitter::~UnwindEmitter() {} } } Index: lib/Target/X86/X86TargetObjectFile.cpp =================================================================== --- lib/Target/X86/X86TargetObjectFile.cpp +++ lib/Target/X86/X86TargetObjectFile.cpp @@ -186,7 +186,7 @@ if (!COMDATSymName.empty()) return getContext().getCOFFSection(".rdata", Characteristics, Kind, COMDATSymName, - COFF::IMAGE_COMDAT_SELECT_ANY); + COFF::IMAGE_COMDAT_SELECT_ANY, 0); } return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C, Align); Index: test/MC/COFF/seh-section-2.s =================================================================== --- /dev/null +++ test/MC/COFF/seh-section-2.s @@ -0,0 +1,154 @@ +# RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | llvm-readobj -symbols | FileCheck %s + +# This assembly should make an object with two .text sections, two .xdata +# sections, and two .pdata sections. + + .def f; + .scl 2; + .type 32; + .endef + .section .text,"xr",discard,f + .globl f + .p2align 4, 0x90 +f: # @f +.Ltmp0: +.seh_proc f +# BB#0: + subq $40, %rsp +.Ltmp1: + .seh_stackalloc 40 +.Ltmp2: + .seh_endprologue + callq g + nop + addq $40, %rsp + retq + .seh_handlerdata + .section .text,"xr",discard,f +.Ltmp3: + .seh_endproc + + .def g; + .scl 3; + .type 32; + .endef + .section .text,"xr",associative,f + .p2align 4, 0x90 +g: # @g +.Ltmp4: +.seh_proc g +# BB#0: +.Ltmp5: + .seh_endprologue + retq + .seh_handlerdata + .section .text,"xr",associative,f +.Ltmp6: + .seh_endproc + + +# CHECK: Symbols [ +# CHECK: Symbol { +# CHECK: Name: .text +# CHECK: Section: .text (4) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 15 +# CHECK: RelocationCount: 1 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0xE17CBB7 +# CHECK: Number: 4 +# CHECK: Selection: Any (0x2) +# CHECK: } +# CHECK: } +# CHECK: Symbol { +# CHECK: Name: .xdata +# CHECK: Value: 0 +# CHECK: Section: .xdata (5) +# CHECK: BaseType: Null (0x0) +# CHECK: ComplexType: Null (0x0) +# CHECK: StorageClass: Static (0x3) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 8 +# CHECK: RelocationCount: 0 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0xFC539D1 +# CHECK: Number: 4 +# CHECK: Selection: Associative (0x5) +# CHECK: AssocSection: .text (4) +# CHECK: } +# CHECK: } +# CHECK: Symbol { +# CHECK: Name: .text +# CHECK: Value: 0 +# CHECK: Section: .text (6) +# CHECK: BaseType: Null (0x0) +# CHECK: ComplexType: Null (0x0) +# CHECK: StorageClass: Static (0x3) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 1 +# CHECK: RelocationCount: 0 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0x26D930A +# CHECK: Number: 4 +# CHECK: Selection: Associative (0x5) +# CHECK: AssocSection: .text (4) +# CHECK: } +# CHECK: } +# CHECK: Symbol { +# CHECK: Name: .xdata +# CHECK: Value: 0 +# CHECK: Section: .xdata (7) +# CHECK: BaseType: Null (0x0) +# CHECK: ComplexType: Null (0x0) +# CHECK: StorageClass: Static (0x3) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 8 +# CHECK: RelocationCount: 0 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0xCCAA009E +# CHECK: Number: 4 +# CHECK: Selection: Associative (0x5) +# CHECK: AssocSection: .text (4) +# CHECK: } +# CHECK: } +# CHECK: Symbol { +# CHECK: Name: .pdata +# CHECK: Value: 0 +# CHECK: Section: .pdata (8) +# CHECK: BaseType: Null (0x0) +# CHECK: ComplexType: Null (0x0) +# CHECK: StorageClass: Static (0x3) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 12 +# CHECK: RelocationCount: 3 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0xD92012AC +# CHECK: Number: 4 +# CHECK: Selection: Associative (0x5) +# CHECK: AssocSection: .text (4) +# CHECK: } +# CHECK: } +# CHECK: Symbol { +# CHECK: Name: .pdata +# CHECK: Value: 0 +# CHECK: Section: .pdata (9) +# CHECK: BaseType: Null (0x0) +# CHECK: ComplexType: Null (0x0) +# CHECK: StorageClass: Static (0x3) +# CHECK: AuxSymbolCount: 1 +# CHECK: AuxSectionDef { +# CHECK: Length: 12 +# CHECK: RelocationCount: 3 +# CHECK: LineNumberCount: 0 +# CHECK: Checksum: 0xCCAA009E +# CHECK: Number: 4 +# CHECK: Selection: Associative (0x5) +# CHECK: AssocSection: .text (4) +# CHECK: } +# CHECK: } +# CHECK: ] Index: test/MC/COFF/seh-section.s =================================================================== --- test/MC/COFF/seh-section.s +++ test/MC/COFF/seh-section.s @@ -4,7 +4,7 @@ // characteristics, so that is not possible. // RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | llvm-readobj -s -sd | FileCheck %s -// CHECK: Name: .xdata$foo +// CHECK: Name: .xdata // CHECK-NEXT: VirtualSize // CHECK-NEXT: VirtualAddress // CHECK-NEXT: RawDataSize: 8 @@ -22,7 +22,7 @@ // CHECK-NEXT: 0000: 01050200 05500402 // CHECK-NEXT: ) -// CHECK: Name: .xdata$.mytext +// CHECK: Name: .xdata // CHECK-NEXT: VirtualSize // CHECK-NEXT: VirtualAddress // CHECK-NEXT: RawDataSize: 8