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);
--- /dev/null
+# 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
+
--- /dev/null
+# 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
+
// 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"