mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-18 11:24:01 +00:00
Fix a few issues with comdat handling on COFF.
* Section association cannot use just the section name as many sections can have the same name. With this patch, the comdat symbol in an assoc section is interpreted to mean a symbol in the associated section and the mapping is discovered from it. * Comdat symbols were not being set correctly. Instead we were getting whatever was output first for that section. A consequence is that associative sections now must use .section to set the association. Using .linkonce would not work since it is not possible to change a sections comdat symbol (it is used to decide if we should create a new section or reuse an existing one). This includes r210298, which was reverted because it was asserting on an associated section having the same comdat as the associated section. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210367 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -336,7 +336,7 @@ getSectionForConstant(SectionKind Kind) const {
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(
|
||||
unsigned Priority, const MCSymbol *KeySym, const MCSection *KeySec) const {
|
||||
unsigned Priority, const MCSymbol *KeySym) const {
|
||||
// The default scheme is .ctor / .dtor, so we have to invert the priority
|
||||
// numbering.
|
||||
if (Priority == 65535)
|
||||
@ -356,7 +356,7 @@ const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection(
|
||||
unsigned Priority, const MCSymbol *KeySym, const MCSection *KeySec) const {
|
||||
unsigned Priority, const MCSymbol *KeySym) const {
|
||||
// The default scheme is .ctor / .dtor, so we have to invert the priority
|
||||
// numbering.
|
||||
if (Priority == 65535)
|
||||
@ -864,8 +864,7 @@ emitModuleFlags(MCStreamer &Streamer,
|
||||
|
||||
static const MCSection *getAssociativeCOFFSection(MCContext &Ctx,
|
||||
const MCSection *Sec,
|
||||
const MCSymbol *KeySym,
|
||||
const MCSection *KeySec) {
|
||||
const MCSymbol *KeySym) {
|
||||
// Return the normal section if we don't have to be associative.
|
||||
if (!KeySym)
|
||||
return Sec;
|
||||
@ -873,20 +872,19 @@ static const MCSection *getAssociativeCOFFSection(MCContext &Ctx,
|
||||
// Make an associative section with the same name and kind as the normal
|
||||
// section.
|
||||
const MCSectionCOFF *SecCOFF = cast<MCSectionCOFF>(Sec);
|
||||
const MCSectionCOFF *KeySecCOFF = cast<MCSectionCOFF>(KeySec);
|
||||
unsigned Characteristics =
|
||||
SecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
|
||||
return Ctx.getCOFFSection(SecCOFF->getSectionName(), Characteristics,
|
||||
SecCOFF->getKind(), KeySym->getName(),
|
||||
COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, KeySecCOFF);
|
||||
COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE);
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(
|
||||
unsigned Priority, const MCSymbol *KeySym, const MCSection *KeySec) const {
|
||||
return getAssociativeCOFFSection(getContext(), StaticCtorSection, KeySym, KeySec);
|
||||
unsigned Priority, const MCSymbol *KeySym) const {
|
||||
return getAssociativeCOFFSection(getContext(), StaticCtorSection, KeySym);
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection(
|
||||
unsigned Priority, const MCSymbol *KeySym, const MCSection *KeySec) const {
|
||||
return getAssociativeCOFFSection(getContext(), StaticDtorSection, KeySym, KeySec);
|
||||
unsigned Priority, const MCSymbol *KeySym) const {
|
||||
return getAssociativeCOFFSection(getContext(), StaticDtorSection, KeySym);
|
||||
}
|
||||
|
Reference in New Issue
Block a user