diff options
Diffstat (limited to 'llvm/lib/MC/WinCOFFObjectWriter.cpp')
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 28 |
1 files changed, 17 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); |

