diff options
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 28 | ||||
-rw-r--r-- | llvm/test/MC/COFF/assoc-private.s | 26 | ||||
-rw-r--r-- | llvm/test/MC/COFF/assoc-undef.s | 8 | ||||
-rw-r--r-- | llvm/test/MC/COFF/section-comdat.s | 2 |
4 files changed, 53 insertions, 11 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 9ffecd99df6..f63d491c825 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -1020,22 +1020,28 @@ uint64_t WinCOFFObjectWriter::writeObject(MCAssembler &Asm, continue; const MCSectionCOFF &MCSec = *Section->MCSection; + const MCSymbol *AssocMCSym = MCSec.getCOMDATSymbol(); + assert(AssocMCSym); - const MCSymbol *COMDAT = MCSec.getCOMDATSymbol(); - assert(COMDAT); - COFFSymbol *COMDATSymbol = GetOrCreateCOFFSymbol(COMDAT); - assert(COMDATSymbol); - COFFSection *Assoc = COMDATSymbol->Section; - if (!Assoc) - report_fatal_error( - Twine("Missing associated COMDAT section for section ") + - MCSec.getSectionName()); + // It's an error to try to associate with an undefined symbol or a symbol + // without a section. + if (!AssocMCSym->isInSection()) { + Asm.getContext().reportError( + SMLoc(), Twine("cannot make section ") + MCSec.getSectionName() + + Twine(" associative with sectionless symbol ") + + AssocMCSym->getName()); + continue; + } + + const auto *AssocMCSec = cast<MCSectionCOFF>(&AssocMCSym->getSection()); + assert(SectionMap.count(AssocMCSec)); + COFFSection *AssocSec = SectionMap[AssocMCSec]; // Skip this section if the associated section is unused. - if (Assoc->Number == -1) + if (AssocSec->Number == -1) continue; - Section->Symbol->Aux[0].Aux.SectionDefinition.Number = Assoc->Number; + Section->Symbol->Aux[0].Aux.SectionDefinition.Number = AssocSec->Number; } assignFileOffsets(Asm, Layout); diff --git a/llvm/test/MC/COFF/assoc-private.s b/llvm/test/MC/COFF/assoc-private.s new file mode 100644 index 00000000000..30e49bc1d16 --- /dev/null +++ b/llvm/test/MC/COFF/assoc-private.s @@ -0,0 +1,26 @@ +# RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-objdump - -h -t | FileCheck %s + +# PR38607: We assemble this, and make .CRT$XCU comdat with .rdata even though +# .rdata isn't comdat. It's not clear what the semantics are, but we assemble +# it anyway. + +# CHECK: Sections: +# CHECK: Idx Name Size Address Type +# CHECK: 3 .rdata 00000004 0000000000000000 DATA +# CHECK: 4 .CRT$XCU 00000008 0000000000000000 DATA +# CHECK: SYMBOL TABLE: +# CHECK: [ 6](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata +# CHECK: AUX scnlen 0x4 nreloc 0 nlnno 0 checksum 0x0 assoc 4 comdat 0 +# CHECK: [ 8](sec 5)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .CRT$XCU +# CHECK: AUX scnlen 0x8 nreloc 1 nlnno 0 checksum 0x0 assoc 4 comdat 5 +# CHECK: [10](sec 0)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 register_x + + .section .rdata,"dr" + .p2align 2 # @x +.Lprivate: + .long 0 # 0x0 + + .section .CRT$XCU,"dr",associative,.Lprivate + .p2align 3 + .quad register_x + diff --git a/llvm/test/MC/COFF/assoc-undef.s b/llvm/test/MC/COFF/assoc-undef.s new file mode 100644 index 00000000000..bc6265f59b3 --- /dev/null +++ b/llvm/test/MC/COFF/assoc-undef.s @@ -0,0 +1,8 @@ +# RUN: not llvm-mc %s -filetype=obj -triple=x86_64-windows-msvc -o /dev/null 2>&1 | FileCheck %s + +# CHECK: cannot make section assocSec associative with sectionless symbol undef + + .section assocSec,"dr",associative,undef + .p2align 3 + .quad my_initializer + diff --git a/llvm/test/MC/COFF/section-comdat.s b/llvm/test/MC/COFF/section-comdat.s index 7669ffbadc3..923c23ab95a 100644 --- a/llvm/test/MC/COFF/section-comdat.s +++ b/llvm/test/MC/COFF/section-comdat.s @@ -2,6 +2,8 @@ // RUN: llvm-mc -triple x86_64-pc-win32 -filetype=obj %s | llvm-readobj -s -t | FileCheck %s .section assocSec, "dr", discard, "assocSym" +.global assocSym +assocSym: .long 1 .section secName, "dr", discard, "Symbol1" |