From 7c531922f20bf284a5cd83b20e94cb624ef031d2 Mon Sep 17 00:00:00 2001 From: Haohai Wen Date: Thu, 9 Jan 2025 15:29:33 +0800 Subject: [PATCH 1/2] [COFF] Preserve UniqueID used to create MCSectionCOFF This UniqueID can be used later to create associative section. e.g. A .pseudo_probe associated to the section of the corresponding function. --- llvm/include/llvm/MC/MCSectionCOFF.h | 9 +++++++-- llvm/lib/MC/MCContext.cpp | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/MC/MCSectionCOFF.h b/llvm/include/llvm/MC/MCSectionCOFF.h index 97540d985dbd1..9c79c27f2a915 100644 --- a/llvm/include/llvm/MC/MCSectionCOFF.h +++ b/llvm/include/llvm/MC/MCSectionCOFF.h @@ -47,16 +47,19 @@ class MCSectionCOFF final : public MCSection { /// section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0 mutable int Selection; + unsigned UniqueID; + private: friend class MCContext; // The storage of Name is owned by MCContext's COFFUniquingMap. MCSectionCOFF(StringRef Name, unsigned Characteristics, - MCSymbol *COMDATSymbol, int Selection, MCSymbol *Begin) + MCSymbol *COMDATSymbol, int Selection, unsigned UniqueID, + MCSymbol *Begin) : MCSection(SV_COFF, Name, Characteristics & COFF::IMAGE_SCN_CNT_CODE, Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA, Begin), Characteristics(Characteristics), COMDATSymbol(COMDATSymbol), - Selection(Selection) { + Selection(Selection), UniqueID(UniqueID) { assert((Characteristics & 0x00F00000) == 0 && "alignment must not be set upon section creation"); } @@ -72,6 +75,8 @@ class MCSectionCOFF final : public MCSection { void setSelection(int Selection) const; + unsigned getUniqueID() const { return UniqueID; } + void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, raw_ostream &OS, uint32_t Subsection) const override; diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index 46222fcaa5b15..56aba5de4445e 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -718,7 +718,7 @@ MCSectionCOFF *MCContext::getCOFFSection(StringRef Section, StringRef CachedName = Iter->first.SectionName; MCSymbol *Begin = getOrCreateSectionSymbol(Section); MCSectionCOFF *Result = new (COFFAllocator.Allocate()) MCSectionCOFF( - CachedName, Characteristics, COMDATSymbol, Selection, Begin); + CachedName, Characteristics, COMDATSymbol, Selection, UniqueID, Begin); Iter->second = Result; auto *F = allocInitialFragment(*Result); Begin->setFragment(F); From a7fd88567919801620303a42a695e7d0d0ab4d44 Mon Sep 17 00:00:00 2001 From: Haohai Wen Date: Tue, 18 Feb 2025 11:51:20 +0800 Subject: [PATCH 2/2] Support unique for coff asm --- .../llvm/MC/MCParser/MCAsmParserExtension.h | 2 + llvm/include/llvm/MC/MCSectionCOFF.h | 1 + llvm/lib/MC/MCParser/COFFAsmParser.cpp | 21 ++++-- llvm/lib/MC/MCParser/ELFAsmParser.cpp | 23 ------- llvm/lib/MC/MCParser/MCAsmParserExtension.cpp | 22 ++++++ llvm/lib/MC/MCSectionCOFF.cpp | 10 ++- llvm/test/CodeGen/X86/constructor.ll | 4 +- llvm/test/CodeGen/X86/ctor-priority-coff.ll | 4 +- llvm/test/CodeGen/X86/data-section-prefix.ll | 8 +-- llvm/test/CodeGen/X86/dtor-priority-coff.ll | 2 +- llvm/test/CodeGen/X86/global-sections.ll | 18 ++--- llvm/test/CodeGen/X86/mingw-comdats.ll | 18 ++--- llvm/test/CodeGen/X86/text-section-prefix.ll | 8 +-- llvm/test/MC/COFF/global_ctors_dtors.ll | 4 +- llvm/test/MC/COFF/section-unique.s | 67 +++++++++++++++++++ 15 files changed, 148 insertions(+), 64 deletions(-) create mode 100644 llvm/test/MC/COFF/section-unique.s diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h b/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h index f1c1b2641ab15..b409a857e0091 100644 --- a/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h @@ -100,6 +100,8 @@ class MCAsmParserExtension { bool parseDirectiveCGProfile(StringRef, SMLoc); + bool maybeParseUniqueID(int64_t &UniqueID); + bool check(bool P, const Twine &Msg) { return getParser().check(P, Msg); } diff --git a/llvm/include/llvm/MC/MCSectionCOFF.h b/llvm/include/llvm/MC/MCSectionCOFF.h index 9c79c27f2a915..4472a128caa6b 100644 --- a/llvm/include/llvm/MC/MCSectionCOFF.h +++ b/llvm/include/llvm/MC/MCSectionCOFF.h @@ -75,6 +75,7 @@ class MCSectionCOFF final : public MCSection { void setSelection(int Selection) const; + bool isUnique() const { return UniqueID != NonUniqueID; } unsigned getUniqueID() const { return UniqueID; } void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, diff --git a/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/llvm/lib/MC/MCParser/COFFAsmParser.cpp index 4618e5675e47b..eb15d063be74b 100644 --- a/llvm/lib/MC/MCParser/COFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFAsmParser.cpp @@ -38,12 +38,12 @@ class COFFAsmParser : public MCAsmParserExtension { bool parseSectionSwitch(StringRef Section, unsigned Characteristics); bool parseSectionSwitch(StringRef Section, unsigned Characteristics, - StringRef COMDATSymName, COFF::COMDATType Type); + StringRef COMDATSymName, COFF::COMDATType Type, + unsigned UniqueID); bool parseSectionName(StringRef &SectionName); bool parseSectionFlags(StringRef SectionName, StringRef FlagsString, unsigned *Flags); - void Initialize(MCAsmParser &Parser) override { // Call the base implementation. MCAsmParserExtension::Initialize(Parser); @@ -315,19 +315,21 @@ bool COFFAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) { bool COFFAsmParser::parseSectionSwitch(StringRef Section, unsigned Characteristics) { - return parseSectionSwitch(Section, Characteristics, "", (COFF::COMDATType)0); + return parseSectionSwitch(Section, Characteristics, "", (COFF::COMDATType)0, + MCSection::NonUniqueID); } bool COFFAsmParser::parseSectionSwitch(StringRef Section, unsigned Characteristics, StringRef COMDATSymName, - COFF::COMDATType Type) { + COFF::COMDATType Type, + unsigned UniqueID) { if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in section switching directive"); Lex(); getStreamer().switchSection(getContext().getCOFFSection( - Section, Characteristics, COMDATSymName, Type)); + Section, Characteristics, COMDATSymName, Type, UniqueID)); return false; } @@ -386,7 +388,8 @@ bool COFFAsmParser::parseSectionArguments(StringRef, SMLoc) { COFF::COMDATType Type = (COFF::COMDATType)0; StringRef COMDATSymName; - if (getLexer().is(AsmToken::Comma)) { + if (getLexer().is(AsmToken::Comma) && + getLexer().peekTok().getString() != "unique") { Type = COFF::IMAGE_COMDAT_SELECT_ANY; Lex(); @@ -407,6 +410,10 @@ bool COFFAsmParser::parseSectionArguments(StringRef, SMLoc) { return TokError("expected identifier in directive"); } + int64_t UniqueID = MCSection::NonUniqueID; + if (maybeParseUniqueID(UniqueID)) + return true; + if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); @@ -415,7 +422,7 @@ bool COFFAsmParser::parseSectionArguments(StringRef, SMLoc) { if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb) Flags |= COFF::IMAGE_SCN_MEM_16BIT; } - parseSectionSwitch(SectionName, Flags, COMDATSymName, Type); + parseSectionSwitch(SectionName, Flags, COMDATSymName, Type, UniqueID); return false; } diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 99b13c68a9966..04496ed694f3a 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -158,7 +158,6 @@ class ELFAsmParser : public MCAsmParserExtension { bool parseMergeSize(int64_t &Size); bool parseGroup(StringRef &GroupName, bool &IsComdat); bool parseLinkedToSym(MCSymbolELF *&LinkedToSym); - bool maybeParseUniqueID(int64_t &UniqueID); }; } // end anonymous namespace @@ -495,28 +494,6 @@ bool ELFAsmParser::parseLinkedToSym(MCSymbolELF *&LinkedToSym) { return false; } -bool ELFAsmParser::maybeParseUniqueID(int64_t &UniqueID) { - MCAsmLexer &L = getLexer(); - if (L.isNot(AsmToken::Comma)) - return false; - Lex(); - StringRef UniqueStr; - if (getParser().parseIdentifier(UniqueStr)) - return TokError("expected identifier"); - if (UniqueStr != "unique") - return TokError("expected 'unique'"); - if (L.isNot(AsmToken::Comma)) - return TokError("expected commma"); - Lex(); - if (getParser().parseAbsoluteExpression(UniqueID)) - return true; - if (UniqueID < 0) - return TokError("unique id must be positive"); - if (!isUInt<32>(UniqueID) || UniqueID == ~0U) - return TokError("unique id is too large"); - return false; -} - static bool hasPrefix(StringRef SectionName, StringRef Prefix) { return SectionName.consume_front(Prefix) && (SectionName.empty() || SectionName[0] == '.'); diff --git a/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp b/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp index 444ce395a4dea..1b83e0412cc2b 100644 --- a/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp +++ b/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp @@ -62,3 +62,25 @@ bool MCAsmParserExtension::parseDirectiveCGProfile(StringRef, SMLoc) { Count); return false; } + +bool MCAsmParserExtension::maybeParseUniqueID(int64_t &UniqueID) { + MCAsmLexer &L = getLexer(); + if (L.isNot(AsmToken::Comma)) + return false; + Lex(); + StringRef UniqueStr; + if (getParser().parseIdentifier(UniqueStr)) + return TokError("expected identifier"); + if (UniqueStr != "unique") + return TokError("expected 'unique'"); + if (L.isNot(AsmToken::Comma)) + return TokError("expected commma"); + Lex(); + if (getParser().parseAbsoluteExpression(UniqueID)) + return true; + if (UniqueID < 0) + return TokError("unique id must be positive"); + if (!isUInt<32>(UniqueID) || UniqueID == ~0U) + return TokError("unique id is too large"); + return false; +} diff --git a/llvm/lib/MC/MCSectionCOFF.cpp b/llvm/lib/MC/MCSectionCOFF.cpp index 1389772502802..94e29ce27d881 100644 --- a/llvm/lib/MC/MCSectionCOFF.cpp +++ b/llvm/lib/MC/MCSectionCOFF.cpp @@ -18,7 +18,7 @@ using namespace llvm; // should be printed before the section name bool MCSectionCOFF::shouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const { - if (COMDATSymbol) + if (COMDATSymbol || isUnique()) return false; // FIXME: Does .section .bss/.data/.text work everywhere?? @@ -67,6 +67,10 @@ void MCSectionCOFF::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, OS << 'i'; OS << '"'; + // unique should be tail of .section directive. + if (isUnique() && !COMDATSymbol) + OS << ",unique," << UniqueID; + if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { if (COMDATSymbol) OS << ","; @@ -103,6 +107,10 @@ void MCSectionCOFF::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, COMDATSymbol->print(OS, &MAI); } } + + if (isUnique() && COMDATSymbol) + OS << ",unique," << UniqueID; + OS << '\n'; } diff --git a/llvm/test/CodeGen/X86/constructor.ll b/llvm/test/CodeGen/X86/constructor.ll index 3133979b32f83..f46325db8c19e 100644 --- a/llvm/test/CodeGen/X86/constructor.ll +++ b/llvm/test/CodeGen/X86/constructor.ll @@ -77,10 +77,10 @@ entry: ; MCU-CTORS: .section .ctors,"aw",@progbits ; MCU-INIT-ARRAY: .section .init_array,"aw",@init_array -; COFF-CTOR: .section .ctors.65520,"dw",associative,v +; COFF-CTOR: .section .ctors.65520,"dw",associative,v,unique,0 ; COFF-CTOR-NEXT: .p2align 3 ; COFF-CTOR-NEXT: .quad g -; COFF-CTOR-NEXT: .section .ctors.09980,"dw",associative,v +; COFF-CTOR-NEXT: .section .ctors.09980,"dw",associative,v,unique,0 ; COFF-CTOR-NEXT: .p2align 3 ; COFF-CTOR-NEXT: .quad h ; COFF-CTOR-NEXT: .section .ctors,"dw" diff --git a/llvm/test/CodeGen/X86/ctor-priority-coff.ll b/llvm/test/CodeGen/X86/ctor-priority-coff.ll index 2e4e7ca0c5dcf..c99eb4e51d79d 100644 --- a/llvm/test/CodeGen/X86/ctor-priority-coff.ll +++ b/llvm/test/CodeGen/X86/ctor-priority-coff.ll @@ -12,13 +12,13 @@ ; CHECK: .section .CRT$XCC00250,"dr" ; CHECK: .p2align 3 ; CHECK: .quad k -; CHECK: .section .CRT$XCL,"dr" +; CHECK: .section .CRT$XCL,"dr",unique,0 ; CHECK: .p2align 3 ; CHECK: .quad j ; CHECK: .section .CRT$XCT12345,"dr" ; CHECK: .p2align 3 ; CHECK: .quad g -; CHECK: .section .CRT$XCT23456,"dr",associative,h +; CHECK: .section .CRT$XCT23456,"dr",associative,h,unique,0 ; CHECK: .p2align 3 ; CHECK: .quad init_h diff --git a/llvm/test/CodeGen/X86/data-section-prefix.ll b/llvm/test/CodeGen/X86/data-section-prefix.ll index 4812fc70758fb..36e0527eb3c06 100644 --- a/llvm/test/CodeGen/X86/data-section-prefix.ll +++ b/llvm/test/CodeGen/X86/data-section-prefix.ll @@ -13,10 +13,10 @@ ; ELF-NOUNIQ: .section .bss.unlikely.,"aw",@nobits,unique,3 ; ELF-NOUNIQ: .section .bss,"aw",@nobits,unique,4 -; COFF-MSVC: .section .data,"dw",one_only,foo -; COFF-MSVC: .section .data,"dw",one_only,bar -; COFF-MSVC: .section .bss,"bw",one_only,baz -; COFF-MSVC: .section .bss,"bw",one_only,quz +; COFF-MSVC: .section .data,"dw",one_only,foo,unique,0 +; COFF-MSVC: .section .data,"dw",one_only,bar,unique,1 +; COFF-MSVC: .section .bss,"bw",one_only,baz,unique,2 +; COFF-MSVC: .section .bss,"bw",one_only,quz,unique,3 @foo = global i32 1, !section_prefix !0 @bar = global i32 2 diff --git a/llvm/test/CodeGen/X86/dtor-priority-coff.ll b/llvm/test/CodeGen/X86/dtor-priority-coff.ll index a170690b69441..8a7b0379d2373 100644 --- a/llvm/test/CodeGen/X86/dtor-priority-coff.ll +++ b/llvm/test/CodeGen/X86/dtor-priority-coff.ll @@ -9,7 +9,7 @@ ; CHECK: .section .CRT$XTT12345,"dr" ; CHECK: .p2align 3 ; CHECK: .quad g -; CHECK: .section .CRT$XTT23456,"dr",associative,h +; CHECK: .section .CRT$XTT23456,"dr",associative,h,unique,0 ; CHECK: .p2align 3 ; CHECK: .quad init_h ; CHECK: .section .CRT$XTX,"dr" diff --git a/llvm/test/CodeGen/X86/global-sections.ll b/llvm/test/CodeGen/X86/global-sections.ll index b300fc87e38ab..4199481a1f299 100644 --- a/llvm/test/CodeGen/X86/global-sections.ll +++ b/llvm/test/CodeGen/X86/global-sections.ll @@ -12,7 +12,7 @@ define void @F1() { ret void } -; WIN32-SECTIONS: .section .text,"xr",one_only,_F1 +; WIN32-SECTIONS: .section .text,"xr",one_only,_F1,unique,0 ; WIN32-SECTIONS: .globl _F1 define void @F2(i32 %y) { @@ -49,9 +49,9 @@ bb5: ; LINUX-FUNC-SECTIONS-NEXT: .cfi_endproc ; LINUX-FUNC-SECTIONS-NEXT: .section .rodata.F2,"a",@progbits -; WIN32-FUNC-SECTIONS: .section .text,"xr",one_only,_F2 +; WIN32-FUNC-SECTIONS: .section .text,"xr",one_only,_F2,unique,1 ; WIN32-FUNC-SECTIONS-NOT: .section -; WIN32-FUNC-SECTIONS: .section .rdata,"dr",associative,_F2 +; WIN32-FUNC-SECTIONS: .section .rdata,"dr",associative,_F2,unique,2 ; LINUX-SECTIONS-PIC: .section .text.F2,"ax",@progbits @@ -138,7 +138,7 @@ bb7: ; LINUX-SECTIONS: .section .rodata.G3,"a",@progbits ; LINUX-SECTIONS: .globl G3 -; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G3 +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G3,unique,6 ; WIN32-SECTIONS: .globl _G3 @@ -213,7 +213,7 @@ bb7: ; LINUX-SECTIONS: .section .rodata.str1.1,"aMS",@progbits,1 ; LINUX-SECTIONS: .globl G7 -; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G7 +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G7,unique,11 ; WIN32-SECTIONS: .globl _G7 @@ -276,7 +276,7 @@ bb7: ; LINUX-SECTIONS: .asciz "foo" ; LINUX-SECTIONS: .size .LG14, 4 -; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G14 +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G14,unique,18 ; WIN32-SECTIONS: _G14: ; WIN32-SECTIONS: .asciz "foo" @@ -298,7 +298,7 @@ bb7: ; LINUX-SECTIONS: .section .rodata.cst8,"aM",@progbits,8 ; LINUX-SECTIONS: G15: -; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G15 +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G15,unique,19 ; WIN32-SECTIONS: _G15: @G16 = unnamed_addr constant i256 0 @@ -309,7 +309,7 @@ bb7: ; LINUX-SECTIONS: .section .rodata.cst32,"aM",@progbits,32 ; LINUX-SECTIONS: G16: -; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G16 +; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G16,unique,20 ; WIN32-SECTIONS: _G16: ; PR26570 @@ -326,7 +326,7 @@ bb7: ; LINUX-SECTIONS: .byte 0 ; LINUX-SECTIONS: .size G17, 1 -; WIN32-SECTIONS: .section .bss,"bw",one_only,_G17 +; WIN32-SECTIONS: .section .bss,"bw",one_only,_G17,unique,21 ; WIN32-SECTIONS: _G17: ; WIN32-SECTIONS:.byte 0 diff --git a/llvm/test/CodeGen/X86/mingw-comdats.ll b/llvm/test/CodeGen/X86/mingw-comdats.ll index 01c8c03161292..bca8e12ea3c73 100644 --- a/llvm/test/CodeGen/X86/mingw-comdats.ll +++ b/llvm/test/CodeGen/X86/mingw-comdats.ll @@ -27,11 +27,11 @@ entry: ret i32 %call } -; CHECK: .section .text,"xr",one_only,main +; CHECK: .section .text,"xr",one_only,main,unique,0 ; CHECK: main: -; GNU: .section .text$main,"xr",one_only,main +; GNU: .section .text$main,"xr",one_only,main,unique,0 ; GNU: main: -; GNU32: .section .text$main,"xr",one_only,_main +; GNU32: .section .text$main,"xr",one_only,_main,unique,0 ; GNU32: _main: define dso_local x86_fastcallcc i32 @fastcall(i32 %x, i32 %y) { @@ -39,11 +39,11 @@ define dso_local x86_fastcallcc i32 @fastcall(i32 %x, i32 %y) { ret i32 %rv } -; CHECK: .section .text,"xr",one_only,fastcall +; CHECK: .section .text,"xr",one_only,fastcall,unique,1 ; CHECK: fastcall: -; GNU: .section .text$fastcall,"xr",one_only,fastcall +; GNU: .section .text$fastcall,"xr",one_only,fastcall,unique,1 ; GNU: fastcall: -; GNU32: .section .text$fastcall,"xr",one_only,@fastcall@8 +; GNU32: .section .text$fastcall,"xr",one_only,@fastcall@8,unique,1 ; GNU32: @fastcall@8: ; Function Attrs: inlinehint uwtable @@ -55,19 +55,19 @@ entry: ret i32 %add } -; CHECK: .section .text,"xr",discard,_Z3fooi +; CHECK: .section .text,"xr",discard,_Z3fooi,unique,2 ; CHECK: _Z3fooi: ; CHECK: .section .data,"dw",discard,gv ; CHECK: gv: ; CHECK: .long 42 -; GNU: .section .text$_Z3fooi,"xr",discard,_Z3fooi +; GNU: .section .text$_Z3fooi,"xr",discard,_Z3fooi,unique,2 ; GNU: _Z3fooi: ; GNU: .section .data$gv,"dw",discard,gv ; GNU: gv: ; GNU: .long 42 -; GNU32: .section .text$_Z3fooi,"xr",discard,__Z3fooi +; GNU32: .section .text$_Z3fooi,"xr",discard,__Z3fooi,unique,2 ; GNU32: __Z3fooi: ; GNU32: .section .data$gv,"dw",discard,_gv ; GNU32: _gv: diff --git a/llvm/test/CodeGen/X86/text-section-prefix.ll b/llvm/test/CodeGen/X86/text-section-prefix.ll index 652f29cd331d0..43206c8e3b2a0 100644 --- a/llvm/test/CodeGen/X86/text-section-prefix.ll +++ b/llvm/test/CodeGen/X86/text-section-prefix.ll @@ -7,8 +7,8 @@ define void @foo1(i1 zeroext %0) nounwind !section_prefix !0 { ;; Check hot section name ; ELF: .section .text.hot.foo1,"ax",@progbits ; ELF-NOUNIQ: .section .text.hot.,"ax",@progbits,unique,1 -; COFF-MSVC: .section .text$hot,"xr",one_only,foo1 -; COFF-GNU: .section .text$hot$foo1,"xr",one_only,foo1 +; COFF-MSVC: .section .text$hot,"xr",one_only,foo1,unique,0 +; COFF-GNU: .section .text$hot$foo1,"xr",one_only,foo1,unique,0 ret void } @@ -16,8 +16,8 @@ define void @foo2(i1 zeroext %0) nounwind !section_prefix !1 { ;; Check unlikely section name ; ELF: .section .text.unlikely.foo2,"ax",@progbits ; ELF-NOUNIQ: .section .text.unlikely.,"ax",@progbits,unique,2 -; COFF-MSVC: .section .text$unlikely,"xr",one_only,foo2 -; COFF-GNU: .section .text$unlikely$foo2,"xr",one_only,foo2 +; COFF-MSVC: .section .text$unlikely,"xr",one_only,foo2,unique,1 +; COFF-GNU: .section .text$unlikely$foo2,"xr",one_only,foo2,unique,1 ret void } diff --git a/llvm/test/MC/COFF/global_ctors_dtors.ll b/llvm/test/MC/COFF/global_ctors_dtors.ll index 7df4d3e500b54..6668ea196829e 100644 --- a/llvm/test/MC/COFF/global_ctors_dtors.ll +++ b/llvm/test/MC/COFF/global_ctors_dtors.ll @@ -51,14 +51,14 @@ define i32 @main() nounwind { ; WIN32: .section .CRT$XCU,"dr" ; WIN32: a_global_ctor -; WIN32: .section .CRT$XCU,"dr",associative,{{_?}}b +; WIN32: .section .CRT$XCU,"dr",associative,{{_?}}b,unique,0 ; WIN32: b_global_ctor ; WIN32-NOT: c_global_ctor ; WIN32: .section .CRT$XTX,"dr" ; WIN32: a_global_dtor ; MINGW32: .section .ctors,"dw" ; MINGW32: a_global_ctor -; MINGW32: .section .ctors,"dw",associative,{{_?}}b +; MINGW32: .section .ctors,"dw",associative,{{_?}}b,unique,0 ; MINGW32: b_global_ctor ; MINGW32-NOT: c_global_ctor ; MINGW32: .section .dtors,"dw" diff --git a/llvm/test/MC/COFF/section-unique.s b/llvm/test/MC/COFF/section-unique.s new file mode 100644 index 0000000000000..e14748d5e6662 --- /dev/null +++ b/llvm/test/MC/COFF/section-unique.s @@ -0,0 +1,67 @@ +// RUN: llvm-mc -triple x86_64-pc-windows-msvc %s -o - | FileCheck %s +// RUN: llvm-mc -triple x86_64-pc-windows-msvc %s -filetype=obj -o - | llvm-readobj --symbols - | FileCheck %s --check-prefix=OBJ + .section .text,"xr",unique,0 + nop + .section .text,"xr",one_only,main,unique,4294967293 + nop + .section .text,"xr",discard,"",unique,4294967294 + nop + +// CHECK: .section .text,"xr",unique,0 + +// CHECK: .section .text,"xr",one_only,main,unique,4294967293 + +// CHECK: .section .text,"xr",unique,4294967294 +// CHECK-NEXT: .linkonce discard + +// OBJ-COUNT-4: Symbol { +// OBJ-NEXT: Name: .text +// OBJ-NEXT: Value: 0 +// OBJ-NEXT: Section: .text (4) +// OBJ-NEXT: BaseType: Null (0x0) +// OBJ-NEXT: ComplexType: Null (0x0) +// OBJ-NEXT: StorageClass: Static (0x3) +// OBJ-NEXT: AuxSymbolCount: 1 +// OBJ-NEXT: AuxSectionDef { +// OBJ-NEXT: Length: 1 +// OBJ-NEXT: RelocationCount: 0 +// OBJ-NEXT: LineNumberCount: 0 +// OBJ-NEXT: Checksum: 0xF00F9344 +// OBJ-NEXT: Number: 4 +// OBJ-NEXT: Selection: 0x0 +// OBJ-NEXT: } +// OBJ-NEXT: } +// OBJ-NEXT: Symbol { +// OBJ-NEXT: Name: .text +// OBJ-NEXT: Value: 0 +// OBJ-NEXT: Section: .text (5) +// OBJ-NEXT: BaseType: Null (0x0) +// OBJ-NEXT: ComplexType: Null (0x0) +// OBJ-NEXT: StorageClass: Static (0x3) +// OBJ-NEXT: AuxSymbolCount: 1 +// OBJ-NEXT: AuxSectionDef { +// OBJ-NEXT: Length: 1 +// OBJ-NEXT: RelocationCount: 0 +// OBJ-NEXT: LineNumberCount: 0 +// OBJ-NEXT: Checksum: 0xF00F9344 +// OBJ-NEXT: Number: 5 +// OBJ-NEXT: Selection: NoDuplicates (0x1) +// OBJ-NEXT: } +// OBJ-NEXT: } +// OBJ-COUNT-2: Symbol { +// OBJ-NEXT: Name: .text +// OBJ-NEXT: Value: 0 +// OBJ-NEXT: Section: .text (6) +// OBJ-NEXT: BaseType: Null (0x0) +// OBJ-NEXT: ComplexType: Null (0x0) +// OBJ-NEXT: StorageClass: Static (0x3) +// OBJ-NEXT: AuxSymbolCount: 1 +// OBJ-NEXT: AuxSectionDef { +// OBJ-NEXT: Length: 1 +// OBJ-NEXT: RelocationCount: 0 +// OBJ-NEXT: LineNumberCount: 0 +// OBJ-NEXT: Checksum: 0xF00F9344 +// OBJ-NEXT: Number: 6 +// OBJ-NEXT: Selection: Any (0x2) +// OBJ-NEXT: } +// OBJ-NEXT: }