mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-01 02:33:44 +00:00
COFF: Let globals with private linkage reside in their own section
Summary: COFF COMDATs (for selection kinds other than 'select any') require at least one non-section symbol in the symbol table. Satisfy this by morally enhancing the linkage from private to internal. Reviewers: rafael Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D8374 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5ea1773441
commit
6526150f82
@ -147,6 +147,10 @@ public:
|
|||||||
SectionKind Kind, Mangler &Mang,
|
SectionKind Kind, Mangler &Mang,
|
||||||
const TargetMachine &TM) const override;
|
const TargetMachine &TM) const override;
|
||||||
|
|
||||||
|
void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
|
||||||
|
bool CannotUsePrivateLabel, Mangler &Mang,
|
||||||
|
const TargetMachine &TM) const override;
|
||||||
|
|
||||||
const MCSection *
|
const MCSection *
|
||||||
getSectionForJumpTable(const Function &F, Mangler &Mang,
|
getSectionForJumpTable(const Function &F, Mangler &Mang,
|
||||||
const TargetMachine &TM) const override;
|
const TargetMachine &TM) const override;
|
||||||
|
@ -101,6 +101,11 @@ public:
|
|||||||
return SectionForGlobal(GV, getKindForGlobal(GV, TM), Mang, TM);
|
return SectionForGlobal(GV, getKindForGlobal(GV, TM), Mang, TM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName,
|
||||||
|
const GlobalValue *GV,
|
||||||
|
bool CannotUsePrivateLabel, Mangler &Mang,
|
||||||
|
const TargetMachine &TM) const;
|
||||||
|
|
||||||
virtual const MCSection *
|
virtual const MCSection *
|
||||||
getSectionForJumpTable(const Function &F, Mangler &Mang,
|
getSectionForJumpTable(const Function &F, Mangler &Mang,
|
||||||
const TargetMachine &TM) const;
|
const TargetMachine &TM) const;
|
||||||
|
@ -927,6 +927,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
|||||||
StringRef COMDATSymName = Sym->getName();
|
StringRef COMDATSymName = Sym->getName();
|
||||||
return getContext().getCOFFSection(Name, Characteristics, Kind,
|
return getContext().getCOFFSection(Name, Characteristics, Kind,
|
||||||
COMDATSymName, Selection);
|
COMDATSymName, Selection);
|
||||||
|
} else {
|
||||||
|
SmallString<256> TmpData;
|
||||||
|
getNameWithPrefix(TmpData, GV, true, Mang, TM);
|
||||||
|
return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
|
||||||
|
Selection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -948,6 +953,25 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
|||||||
return DataSection;
|
return DataSection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TargetLoweringObjectFileCOFF::getNameWithPrefix(
|
||||||
|
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
|
||||||
|
bool CannotUsePrivateLabel, Mangler &Mang, const TargetMachine &TM) const {
|
||||||
|
if (GV->hasPrivateLinkage() &&
|
||||||
|
((isa<Function>(GV) && TM.getFunctionSections()) ||
|
||||||
|
(isa<GlobalVariable>(GV) && TM.getDataSections()))) {
|
||||||
|
SmallString<256> Tmp;
|
||||||
|
Mang.getNameWithPrefix(Tmp, GV, /*CannotUsePrivateLabel=*/false);
|
||||||
|
if (Tmp.startswith(".L"))
|
||||||
|
OutName.append(Tmp.begin() + 2, Tmp.end());
|
||||||
|
else if (Tmp.startswith("L"))
|
||||||
|
OutName.append(Tmp.begin() + 1, Tmp.end());
|
||||||
|
else
|
||||||
|
OutName.append(Tmp.begin(), Tmp.end());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
|
||||||
|
}
|
||||||
|
|
||||||
const MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
|
const MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
|
||||||
const Function &F, Mangler &Mang, const TargetMachine &TM) const {
|
const Function &F, Mangler &Mang, const TargetMachine &TM) const {
|
||||||
// If the function can be removed, produce a unique section so that
|
// If the function can be removed, produce a unique section so that
|
||||||
|
@ -343,3 +343,9 @@ const MCExpr *TargetLoweringObjectFile::getDebugThreadLocalSymbol(const MCSymbol
|
|||||||
// null return could mean 'no location' & we should just do that here.
|
// null return could mean 'no location' & we should just do that here.
|
||||||
return MCSymbolRefExpr::Create(Sym, *Ctx);
|
return MCSymbolRefExpr::Create(Sym, *Ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TargetLoweringObjectFile::getNameWithPrefix(
|
||||||
|
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
|
||||||
|
bool CannotUsePrivateLabel, Mangler &Mang, const TargetMachine &TM) const {
|
||||||
|
Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
|
||||||
|
}
|
||||||
|
@ -175,7 +175,7 @@ void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
|
|||||||
const TargetLoweringObjectFile *TLOF = getObjFileLowering();
|
const TargetLoweringObjectFile *TLOF = getObjFileLowering();
|
||||||
const MCSection *TheSection = TLOF->SectionForGlobal(GV, GVKind, Mang, *this);
|
const MCSection *TheSection = TLOF->SectionForGlobal(GV, GVKind, Mang, *this);
|
||||||
bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection);
|
bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection);
|
||||||
Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel);
|
TLOF->getNameWithPrefix(Name, GV, CannotUsePrivateLabel, Mang, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const {
|
MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const {
|
||||||
|
@ -275,8 +275,8 @@ bb7:
|
|||||||
; LINUX-SECTIONS: .asciz "foo"
|
; LINUX-SECTIONS: .asciz "foo"
|
||||||
; LINUX-SECTIONS: .size .LG14, 4
|
; LINUX-SECTIONS: .size .LG14, 4
|
||||||
|
|
||||||
; WIN32-SECTIONS: .section .rdata,"dr"
|
; WIN32-SECTIONS: .section .rdata,"dr",one_only,_G14
|
||||||
; WIN32-SECTIONS: L_G14:
|
; WIN32-SECTIONS: _G14:
|
||||||
; WIN32-SECTIONS: .asciz "foo"
|
; WIN32-SECTIONS: .asciz "foo"
|
||||||
|
|
||||||
; cannot be merged on MachO, but can on other formats.
|
; cannot be merged on MachO, but can on other formats.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user