mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-20 19:04:10 -04:00
Target: Change various section classifiers in TargetLoweringObjectFile to take a GlobalObject.
These functions are about classifying a global which will actually be emitted, so it does not make sense for them to take a GlobalValue which may for example be an alias. Change the Mach-O object writer and the Hexagon, Lanai and MIPS backends to look through aliases before using TargetLoweringObjectFile interfaces. These are functional changes but all appear to be bug fixes. Differential Revision: https://reviews.llvm.org/D25917 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285006 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -209,15 +209,15 @@ static const Comdat *getELFComdat(const GlobalValue *GV) {
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
StringRef SectionName = GV->getSection();
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
StringRef SectionName = GO->getSection();
|
||||
|
||||
// Infer section flags from the section name if we can.
|
||||
Kind = getELFKindForNamedSection(SectionName, Kind);
|
||||
|
||||
StringRef Group = "";
|
||||
unsigned Flags = getELFSectionFlags(Kind);
|
||||
if (const Comdat *C = getELFComdat(GV)) {
|
||||
if (const Comdat *C = getELFComdat(GO)) {
|
||||
Group = C->getName();
|
||||
Flags |= ELF::SHF_GROUP;
|
||||
}
|
||||
@@ -246,7 +246,7 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) {
|
||||
}
|
||||
|
||||
static MCSectionELF *
|
||||
selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
selectELFSectionForGlobal(MCContext &Ctx, const GlobalObject *GO,
|
||||
SectionKind Kind, Mangler &Mang,
|
||||
const TargetMachine &TM, bool EmitUniqueSection,
|
||||
unsigned Flags, unsigned *NextUniqueID) {
|
||||
@@ -274,7 +274,7 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
}
|
||||
|
||||
StringRef Group = "";
|
||||
if (const Comdat *C = getELFComdat(GV)) {
|
||||
if (const Comdat *C = getELFComdat(GO)) {
|
||||
Flags |= ELF::SHF_GROUP;
|
||||
Group = C->getName();
|
||||
}
|
||||
@@ -285,8 +285,8 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
// We also need alignment here.
|
||||
// FIXME: this is getting the alignment of the character, not the
|
||||
// alignment of the global!
|
||||
unsigned Align = GV->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GV));
|
||||
unsigned Align = GO->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GO));
|
||||
|
||||
std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + ".";
|
||||
Name = SizeSpec + utostr(Align);
|
||||
@@ -297,7 +297,7 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
Name = getSectionPrefixForGlobal(Kind);
|
||||
}
|
||||
|
||||
if (const Function *F = dyn_cast<Function>(GV)) {
|
||||
if (const auto *F = dyn_cast<Function>(GO)) {
|
||||
const auto &OptionalPrefix = F->getSectionPrefix();
|
||||
if (OptionalPrefix)
|
||||
Name += *OptionalPrefix;
|
||||
@@ -305,7 +305,7 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
|
||||
if (EmitUniqueSection && UniqueSectionNames) {
|
||||
Name.push_back('.');
|
||||
TM.getNameWithPrefix(Name, GV, Mang, true);
|
||||
TM.getNameWithPrefix(Name, GO, Mang, true);
|
||||
}
|
||||
unsigned UniqueID = MCContext::GenericSectionID;
|
||||
if (EmitUniqueSection && !UniqueSectionNames) {
|
||||
@@ -317,7 +317,7 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
unsigned Flags = getELFSectionFlags(Kind);
|
||||
|
||||
// If we have -ffunction-section or -fdata-section then we should emit the
|
||||
@@ -329,9 +329,9 @@ MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal(
|
||||
else
|
||||
EmitUniqueSection = TM.getDataSections();
|
||||
}
|
||||
EmitUniqueSection |= GV->hasComdat();
|
||||
EmitUniqueSection |= GO->hasComdat();
|
||||
|
||||
return selectELFSectionForGlobal(getContext(), GV, Kind, getMangler(), TM,
|
||||
return selectELFSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
|
||||
EmitUniqueSection, Flags, &NextUniqueID);
|
||||
}
|
||||
|
||||
@@ -572,22 +572,22 @@ static void checkMachOComdat(const GlobalValue *GV) {
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
// Parse the section specifier and create it if valid.
|
||||
StringRef Segment, Section;
|
||||
unsigned TAA = 0, StubSize = 0;
|
||||
bool TAAParsed;
|
||||
|
||||
checkMachOComdat(GV);
|
||||
checkMachOComdat(GO);
|
||||
|
||||
std::string ErrorCode =
|
||||
MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
|
||||
MCSectionMachO::ParseSectionSpecifier(GO->getSection(), Segment, Section,
|
||||
TAA, TAAParsed, StubSize);
|
||||
if (!ErrorCode.empty()) {
|
||||
// If invalid, report the error with report_fatal_error.
|
||||
report_fatal_error("Global variable '" + GV->getName() +
|
||||
report_fatal_error("Global variable '" + GO->getName() +
|
||||
"' has an invalid section specifier '" +
|
||||
GV->getSection() + "': " + ErrorCode + ".");
|
||||
GO->getSection() + "': " + ErrorCode + ".");
|
||||
}
|
||||
|
||||
// Get the section.
|
||||
@@ -604,7 +604,7 @@ MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
|
||||
// to reject it here.
|
||||
if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
|
||||
// If invalid, report the error with report_fatal_error.
|
||||
report_fatal_error("Global variable '" + GV->getName() +
|
||||
report_fatal_error("Global variable '" + GO->getName() +
|
||||
"' section type or attributes does not match previous"
|
||||
" section specifier");
|
||||
}
|
||||
@@ -613,19 +613,19 @@ MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileMachO::SelectSectionForGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
checkMachOComdat(GV);
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
checkMachOComdat(GO);
|
||||
|
||||
// Handle thread local data.
|
||||
if (Kind.isThreadBSS()) return TLSBSSSection;
|
||||
if (Kind.isThreadData()) return TLSDataSection;
|
||||
|
||||
if (Kind.isText())
|
||||
return GV->isWeakForLinker() ? TextCoalSection : TextSection;
|
||||
return GO->isWeakForLinker() ? TextCoalSection : TextSection;
|
||||
|
||||
// If this is weak/linkonce, put this in a coalescable section, either in text
|
||||
// or data depending on if it is writable.
|
||||
if (GV->isWeakForLinker()) {
|
||||
if (GO->isWeakForLinker()) {
|
||||
if (Kind.isReadOnly())
|
||||
return ConstTextCoalSection;
|
||||
return DataCoalSection;
|
||||
@@ -633,21 +633,21 @@ MCSection *TargetLoweringObjectFileMachO::SelectSectionForGlobal(
|
||||
|
||||
// FIXME: Alignment check should be handled by section classifier.
|
||||
if (Kind.isMergeable1ByteCString() &&
|
||||
GV->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GV)) < 32)
|
||||
GO->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GO)) < 32)
|
||||
return CStringSection;
|
||||
|
||||
// Do not put 16-bit arrays in the UString section if they have an
|
||||
// externally visible label, this runs into issues with certain linker
|
||||
// versions.
|
||||
if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
|
||||
GV->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GV)) < 32)
|
||||
if (Kind.isMergeable2ByteCString() && !GO->hasExternalLinkage() &&
|
||||
GO->getParent()->getDataLayout().getPreferredAlignment(
|
||||
cast<GlobalVariable>(GO)) < 32)
|
||||
return UStringSection;
|
||||
|
||||
// With MachO only variables whose corresponding symbol starts with 'l' or
|
||||
// 'L' can be merged, so we only try merging GVs with private linkage.
|
||||
if (GV->hasPrivateLinkage() && Kind.isMergeableConst()) {
|
||||
if (GO->hasPrivateLinkage() && Kind.isMergeableConst()) {
|
||||
if (Kind.isMergeableConst4())
|
||||
return FourByteConstantSection;
|
||||
if (Kind.isMergeableConst8())
|
||||
@@ -821,10 +821,13 @@ static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
|
||||
void TargetLoweringObjectFileMachO::getNameWithPrefix(
|
||||
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
|
||||
const TargetMachine &TM) const {
|
||||
SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
|
||||
const MCSection *TheSection = SectionForGlobal(GV, GVKind, TM);
|
||||
bool CannotUsePrivateLabel =
|
||||
!canUsePrivateLabel(*TM.getMCAsmInfo(), *TheSection);
|
||||
bool CannotUsePrivateLabel = true;
|
||||
if (auto *GO = GV->getBaseObject()) {
|
||||
SectionKind GOKind = TargetLoweringObjectFile::getKindForGlobal(GO, TM);
|
||||
const MCSection *TheSection = SectionForGlobal(GO, GOKind, TM);
|
||||
CannotUsePrivateLabel =
|
||||
!canUsePrivateLabel(*TM.getMCAsmInfo(), *TheSection);
|
||||
}
|
||||
getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
|
||||
}
|
||||
|
||||
@@ -912,18 +915,18 @@ static int getSelectionForCOFF(const GlobalValue *GV) {
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
int Selection = 0;
|
||||
unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
|
||||
StringRef Name = GV->getSection();
|
||||
StringRef Name = GO->getSection();
|
||||
StringRef COMDATSymName = "";
|
||||
if (GV->hasComdat()) {
|
||||
Selection = getSelectionForCOFF(GV);
|
||||
if (GO->hasComdat()) {
|
||||
Selection = getSelectionForCOFF(GO);
|
||||
const GlobalValue *ComdatGV;
|
||||
if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE)
|
||||
ComdatGV = getComdatGVForCOFF(GV);
|
||||
ComdatGV = getComdatGVForCOFF(GO);
|
||||
else
|
||||
ComdatGV = GV;
|
||||
ComdatGV = GO;
|
||||
|
||||
if (!ComdatGV->hasPrivateLinkage()) {
|
||||
MCSymbol *Sym = TM.getSymbol(ComdatGV, getMangler());
|
||||
@@ -951,7 +954,7 @@ static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, const TargetMachine &TM) const {
|
||||
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
|
||||
// If we have -ffunction-sections then we should emit the global value to a
|
||||
// uniqued section specifically for it.
|
||||
bool EmitUniquedSection;
|
||||
@@ -960,19 +963,19 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
|
||||
else
|
||||
EmitUniquedSection = TM.getDataSections();
|
||||
|
||||
if ((EmitUniquedSection && !Kind.isCommon()) || GV->hasComdat()) {
|
||||
if ((EmitUniquedSection && !Kind.isCommon()) || GO->hasComdat()) {
|
||||
const char *Name = getCOFFSectionNameForUniqueGlobal(Kind);
|
||||
unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
|
||||
|
||||
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
|
||||
int Selection = getSelectionForCOFF(GV);
|
||||
int Selection = getSelectionForCOFF(GO);
|
||||
if (!Selection)
|
||||
Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES;
|
||||
const GlobalValue *ComdatGV;
|
||||
if (GV->hasComdat())
|
||||
ComdatGV = getComdatGVForCOFF(GV);
|
||||
if (GO->hasComdat())
|
||||
ComdatGV = getComdatGVForCOFF(GO);
|
||||
else
|
||||
ComdatGV = GV;
|
||||
ComdatGV = GO;
|
||||
|
||||
unsigned UniqueID = MCContext::GenericSectionID;
|
||||
if (EmitUniquedSection)
|
||||
@@ -985,7 +988,7 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
|
||||
COMDATSymName, Selection, UniqueID);
|
||||
} else {
|
||||
SmallString<256> TmpData;
|
||||
getMangler().getNameWithPrefix(TmpData, GV, /*CannotUsePrivateLabel=*/true);
|
||||
getMangler().getNameWithPrefix(TmpData, GO, /*CannotUsePrivateLabel=*/true);
|
||||
return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
|
||||
Selection, UniqueID);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user