mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[MC] Improve COFF associative section lookup
Handle the case when the symbol is private. Private symbols are not in the COFF object file symbol table, so they aren't inserted into SymbolMap. We can't look up the section of the symbol that way. Instead, get the MCSection from the MCSymbol and map that to the object file section. Print a better error message when the symbol has no section, like when the symbol is undefined. Fixes PR38607 llvm-svn: 339942
This commit is contained in:
parent
8079aabce6
commit
c86f6679fb
@ -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);
|
||||
|
26
test/MC/COFF/assoc-private.s
Normal file
26
test/MC/COFF/assoc-private.s
Normal file
@ -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
|
||||
|
8
test/MC/COFF/assoc-undef.s
Normal file
8
test/MC/COFF/assoc-undef.s
Normal file
@ -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
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user