mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-21 03:00:45 +00:00
Stop producing .data.rel sections.
If a section is rw, it is irrelevant if the dynamic linker will write to it or not. It looks like llvm implemented this because gcc was doing it. It looks like gcc implemented this in the hope that it would put all the relocated items close together and speed up the dynamic linker. There are two problem with this: * It doesn't work. Both bfd and gold will map .data.rel to .data and concatenate the input sections in the order they are seen. * If we want a feature like that, it can be implemented directly in the linker since it knowns where the dynamic relocations are. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253436 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
35da61aba1
commit
cfc74b78b1
@ -149,7 +149,6 @@ protected:
|
||||
MCSection *EHFrameSection;
|
||||
|
||||
// ELF specific sections.
|
||||
MCSection *DataRelSection;
|
||||
MCSection *DataRelROSection;
|
||||
MCSection *MergeableConst4Section;
|
||||
MCSection *MergeableConst8Section;
|
||||
@ -276,7 +275,6 @@ public:
|
||||
MCSection *getFaultMapSection() const { return FaultMapSection; }
|
||||
|
||||
// ELF specific sections.
|
||||
MCSection *getDataRelSection() const { return DataRelSection; }
|
||||
MCSection *getDataRelROSection() const { return DataRelROSection; }
|
||||
const MCSection *getMergeableConst4Section() const {
|
||||
return MergeableConst4Section;
|
||||
|
@ -99,15 +99,8 @@ class SectionKind {
|
||||
/// marked 'constant'.
|
||||
Common,
|
||||
|
||||
/// DataRel - This is the most general form of data that is written
|
||||
/// to by the program, it can have random relocations to arbitrary
|
||||
/// globals.
|
||||
DataRel,
|
||||
|
||||
/// DataNoRel - This is writeable data that has a non-zero
|
||||
/// initializer, but whose initializer is known to have no
|
||||
/// relocations.
|
||||
DataNoRel,
|
||||
/// This is writeable data that has a non-zero initializer.
|
||||
Data,
|
||||
|
||||
/// ReadOnlyWithRel - These are global variables that are never
|
||||
/// written to by the program, but that have relocations, so they
|
||||
@ -155,7 +148,7 @@ public:
|
||||
bool isThreadData() const { return K == ThreadData; }
|
||||
|
||||
bool isGlobalWriteableData() const {
|
||||
return isBSS() || isCommon() || isDataRel() || isReadOnlyWithRel();
|
||||
return isBSS() || isCommon() || isData() || isReadOnlyWithRel();
|
||||
}
|
||||
|
||||
bool isBSS() const { return K == BSS || K == BSSLocal || K == BSSExtern; }
|
||||
@ -164,11 +157,7 @@ public:
|
||||
|
||||
bool isCommon() const { return K == Common; }
|
||||
|
||||
bool isDataRel() const {
|
||||
return K == DataRel || K == DataNoRel;
|
||||
}
|
||||
|
||||
bool isDataNoRel() const { return K == DataNoRel; }
|
||||
bool isData() const { return K == Data; }
|
||||
|
||||
bool isReadOnlyWithRel() const {
|
||||
return K == ReadOnlyWithRel;
|
||||
@ -202,8 +191,7 @@ public:
|
||||
static SectionKind getBSSLocal() { return get(BSSLocal); }
|
||||
static SectionKind getBSSExtern() { return get(BSSExtern); }
|
||||
static SectionKind getCommon() { return get(Common); }
|
||||
static SectionKind getDataRel() { return get(DataRel); }
|
||||
static SectionKind getDataNoRel() { return get(DataNoRel); }
|
||||
static SectionKind getData() { return get(Data); }
|
||||
static SectionKind getReadOnlyWithRel() { return get(ReadOnlyWithRel); }
|
||||
};
|
||||
|
||||
|
@ -355,12 +355,7 @@ static MCSymbol *getOrCreateEmuTLSInitSym(MCSymbol *GVSym, MCContext &C) {
|
||||
void AsmPrinter::EmitEmulatedTLSControlVariable(const GlobalVariable *GV,
|
||||
MCSymbol *EmittedSym,
|
||||
bool AllZeroInitValue) {
|
||||
// If there is init value, use .data.rel.local section;
|
||||
// otherwise use the .data section.
|
||||
MCSection *TLSVarSection =
|
||||
const_cast<MCSection *>((GV->hasInitializer() && !AllZeroInitValue)
|
||||
? getObjFileLowering().getDataRelSection()
|
||||
: getObjFileLowering().getDataSection());
|
||||
MCSection *TLSVarSection = getObjFileLowering().getDataSection();
|
||||
OutStreamer->SwitchSection(TLSVarSection);
|
||||
MCSymbol *GVSym = getSymbol(GV);
|
||||
EmitLinkage(GV, EmittedSym); // same linkage as GV
|
||||
@ -1139,7 +1134,7 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
// Output stubs for external and common global variables.
|
||||
MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
|
||||
if (!Stubs.empty()) {
|
||||
OutStreamer->SwitchSection(TLOF.getDataRelSection());
|
||||
OutStreamer->SwitchSection(TLOF.getDataSection());
|
||||
const DataLayout &DL = M.getDataLayout();
|
||||
|
||||
for (const auto &Stub : Stubs) {
|
||||
|
@ -233,10 +233,8 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) {
|
||||
return ".tdata";
|
||||
if (Kind.isThreadBSS())
|
||||
return ".tbss";
|
||||
if (Kind.isDataNoRel())
|
||||
if (Kind.isData())
|
||||
return ".data";
|
||||
if (Kind.isDataRel())
|
||||
return ".data.rel";
|
||||
assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
|
||||
return ".data.rel.ro";
|
||||
}
|
||||
@ -502,7 +500,7 @@ emitModuleFlags(MCStreamer &Streamer,
|
||||
|
||||
// Get the section.
|
||||
MCSectionMachO *S = getContext().getMachOSection(
|
||||
Segment, Section, TAA, StubSize, SectionKind::getDataNoRel());
|
||||
Segment, Section, TAA, StubSize, SectionKind::getData());
|
||||
Streamer.SwitchSection(S);
|
||||
Streamer.EmitLabel(getContext().
|
||||
getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
|
||||
@ -635,7 +633,7 @@ MCSection *TargetLoweringObjectFileMachO::getSectionForConstant(
|
||||
const DataLayout &DL, SectionKind Kind, const Constant *C) const {
|
||||
// If this constant requires a relocation, we have to put it in the data
|
||||
// segment, not in the text segment.
|
||||
if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
|
||||
if (Kind.isData() || Kind.isReadOnlyWithRel())
|
||||
return ConstDataSection;
|
||||
|
||||
if (Kind.isMergeableConst4())
|
||||
|
@ -76,16 +76,15 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) {
|
||||
MachO::S_ATTR_PURE_INSTRUCTIONS,
|
||||
SectionKind::getText());
|
||||
DataSection // .data
|
||||
= Ctx->getMachOSection("__DATA", "__data", 0,
|
||||
SectionKind::getDataRel());
|
||||
= Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
|
||||
|
||||
// BSSSection might not be expected initialized on msvc.
|
||||
BSSSection = nullptr;
|
||||
|
||||
TLSDataSection // .tdata
|
||||
= Ctx->getMachOSection("__DATA", "__thread_data",
|
||||
MachO::S_THREAD_LOCAL_REGULAR,
|
||||
SectionKind::getDataRel());
|
||||
= Ctx->getMachOSection("__DATA", "__thread_data",
|
||||
MachO::S_THREAD_LOCAL_REGULAR,
|
||||
SectionKind::getData());
|
||||
TLSBSSSection // .tbss
|
||||
= Ctx->getMachOSection("__DATA", "__thread_bss",
|
||||
MachO::S_THREAD_LOCAL_ZEROFILL,
|
||||
@ -93,14 +92,13 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) {
|
||||
|
||||
// TODO: Verify datarel below.
|
||||
TLSTLVSection // .tlv
|
||||
= Ctx->getMachOSection("__DATA", "__thread_vars",
|
||||
MachO::S_THREAD_LOCAL_VARIABLES,
|
||||
SectionKind::getDataRel());
|
||||
= Ctx->getMachOSection("__DATA", "__thread_vars",
|
||||
MachO::S_THREAD_LOCAL_VARIABLES,
|
||||
SectionKind::getData());
|
||||
|
||||
TLSThreadInitSection
|
||||
= Ctx->getMachOSection("__DATA", "__thread_init",
|
||||
MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
TLSThreadInitSection = Ctx->getMachOSection(
|
||||
"__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
|
||||
SectionKind::getData());
|
||||
|
||||
CStringSection // .cstring
|
||||
= Ctx->getMachOSection("__TEXT", "__cstring",
|
||||
@ -145,10 +143,8 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) {
|
||||
= Ctx->getMachOSection("__TEXT", "__const_coal",
|
||||
MachO::S_COALESCED,
|
||||
SectionKind::getReadOnly());
|
||||
DataCoalSection
|
||||
= Ctx->getMachOSection("__DATA","__datacoal_nt",
|
||||
MachO::S_COALESCED,
|
||||
SectionKind::getDataRel());
|
||||
DataCoalSection = Ctx->getMachOSection(
|
||||
"__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
|
||||
} else {
|
||||
TextCoalSection = TextSection;
|
||||
ConstTextCoalSection = ReadOnlySection;
|
||||
@ -177,21 +173,17 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) {
|
||||
SectionKind::getMetadata());
|
||||
|
||||
if (RelocM == Reloc::Static) {
|
||||
StaticCtorSection
|
||||
= Ctx->getMachOSection("__TEXT", "__constructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= Ctx->getMachOSection("__TEXT", "__destructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
StaticCtorSection = Ctx->getMachOSection("__TEXT", "__constructor", 0,
|
||||
SectionKind::getData());
|
||||
StaticDtorSection = Ctx->getMachOSection("__TEXT", "__destructor", 0,
|
||||
SectionKind::getData());
|
||||
} else {
|
||||
StaticCtorSection
|
||||
= Ctx->getMachOSection("__DATA", "__mod_init_func",
|
||||
MachO::S_MOD_INIT_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= Ctx->getMachOSection("__DATA", "__mod_term_func",
|
||||
MachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
StaticCtorSection = Ctx->getMachOSection("__DATA", "__mod_init_func",
|
||||
MachO::S_MOD_INIT_FUNC_POINTERS,
|
||||
SectionKind::getData());
|
||||
StaticDtorSection = Ctx->getMachOSection("__DATA", "__mod_term_func",
|
||||
MachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getData());
|
||||
}
|
||||
|
||||
// Exception Handling.
|
||||
@ -452,9 +444,6 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) {
|
||||
TLSBSSSection = Ctx->getELFSection(
|
||||
".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
|
||||
|
||||
DataRelSection = Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
|
||||
DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
|
||||
@ -556,7 +545,7 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
EHFrameSection = Ctx->getCOFFSection(
|
||||
".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
|
||||
bool IsWoA = T.getArch() == Triple::arm || T.getArch() == Triple::thumb;
|
||||
|
||||
@ -576,7 +565,7 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
DataSection = Ctx->getCOFFSection(
|
||||
".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
ReadOnlySection = Ctx->getCOFFSection(
|
||||
".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
@ -594,11 +583,11 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
StaticCtorSection = Ctx->getCOFFSection(
|
||||
".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
StaticDtorSection = Ctx->getCOFFSection(
|
||||
".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
}
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
|
||||
@ -751,11 +740,11 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
|
||||
PDataSection = Ctx->getCOFFSection(
|
||||
".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
|
||||
XDataSection = Ctx->getCOFFSection(
|
||||
".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
|
||||
SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
|
||||
SectionKind::getMetadata());
|
||||
@ -763,7 +752,7 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
TLSDataSection = Ctx->getCOFFSection(
|
||||
".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
SectionKind::getData());
|
||||
|
||||
StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
|
@ -98,11 +98,10 @@ class COFFAsmParser : public MCAsmParserExtension {
|
||||
SectionKind::getText());
|
||||
}
|
||||
bool ParseSectionDirectiveData(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".data",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
||||
| COFF::IMAGE_SCN_MEM_READ
|
||||
| COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
return ParseSectionSwitch(".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getData());
|
||||
}
|
||||
bool ParseSectionDirectiveBSS(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".bss",
|
||||
@ -153,7 +152,7 @@ static SectionKind computeSectionKind(unsigned Flags) {
|
||||
if (Flags & COFF::IMAGE_SCN_MEM_READ &&
|
||||
(Flags & COFF::IMAGE_SCN_MEM_WRITE) == 0)
|
||||
return SectionKind::getReadOnly();
|
||||
return SectionKind::getDataRel();
|
||||
return SectionKind::getData();
|
||||
}
|
||||
|
||||
bool COFFAsmParser::ParseSectionFlags(StringRef FlagsString, unsigned* Flags) {
|
||||
|
@ -390,9 +390,8 @@ bool DarwinAsmParser::parseSectionSwitch(const char *Segment,
|
||||
// FIXME: Arch specific.
|
||||
bool isText = TAA & MachO::S_ATTR_PURE_INSTRUCTIONS;
|
||||
getStreamer().SwitchSection(getContext().getMachOSection(
|
||||
Segment, Section, TAA, StubSize,
|
||||
isText ? SectionKind::getText()
|
||||
: SectionKind::getDataRel()));
|
||||
Segment, Section, TAA, StubSize,
|
||||
isText ? SectionKind::getText() : SectionKind::getData()));
|
||||
|
||||
// Set the implicit alignment, if any.
|
||||
//
|
||||
@ -614,9 +613,8 @@ bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) {
|
||||
// FIXME: Arch specific.
|
||||
bool isText = Segment == "__TEXT"; // FIXME: Hack.
|
||||
getStreamer().SwitchSection(getContext().getMachOSection(
|
||||
Segment, Section, TAA, StubSize,
|
||||
isText ? SectionKind::getText()
|
||||
: SectionKind::getDataRel()));
|
||||
Segment, Section, TAA, StubSize,
|
||||
isText ? SectionKind::getText() : SectionKind::getData()));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -79,8 +79,8 @@ public:
|
||||
// the best way for us to get access to it?
|
||||
bool ParseSectionDirectiveData(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".data", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_WRITE |ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
ELF::SHF_WRITE | ELF::SHF_ALLOC,
|
||||
SectionKind::getData());
|
||||
}
|
||||
bool ParseSectionDirectiveText(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".text", ELF::SHT_PROGBITS,
|
||||
@ -111,9 +111,8 @@ public:
|
||||
}
|
||||
bool ParseSectionDirectiveDataRel(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".data.rel", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE,
|
||||
SectionKind::getData());
|
||||
}
|
||||
bool ParseSectionDirectiveDataRelRo(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".data.rel.ro", ELF::SHT_PROGBITS,
|
||||
@ -123,9 +122,8 @@ public:
|
||||
}
|
||||
bool ParseSectionDirectiveEhFrame(StringRef, SMLoc) {
|
||||
return ParseSectionSwitch(".eh_frame", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE,
|
||||
SectionKind::getData());
|
||||
}
|
||||
bool ParseDirectivePushSection(StringRef, SMLoc);
|
||||
bool ParseDirectivePopSection(StringRef, SMLoc);
|
||||
|
@ -49,10 +49,10 @@ static MCSection *getUnwindInfoSection(StringRef SecName,
|
||||
if (CodeSecName.startswith(".text$"))
|
||||
CodeSecName = CodeSecName.substr(6);
|
||||
|
||||
return Context.getCOFFSection(
|
||||
(SecName + Twine('$') + CodeSecName).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getDataRel());
|
||||
return Context.getCOFFSection((SecName + Twine('$') + CodeSecName).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getData());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1079,19 +1079,14 @@ inline void ARMELFStreamer::SwitchToEHSection(const char *Prefix,
|
||||
}
|
||||
|
||||
inline void ARMELFStreamer::SwitchToExTabSection(const MCSymbol &FnStart) {
|
||||
SwitchToEHSection(".ARM.extab",
|
||||
ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel(),
|
||||
FnStart);
|
||||
SwitchToEHSection(".ARM.extab", ELF::SHT_PROGBITS, ELF::SHF_ALLOC,
|
||||
SectionKind::getData(), FnStart);
|
||||
}
|
||||
|
||||
inline void ARMELFStreamer::SwitchToExIdxSection(const MCSymbol &FnStart) {
|
||||
SwitchToEHSection(".ARM.exidx",
|
||||
ELF::SHT_ARM_EXIDX,
|
||||
SwitchToEHSection(".ARM.exidx", ELF::SHT_ARM_EXIDX,
|
||||
ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER,
|
||||
SectionKind::getDataRel(),
|
||||
FnStart);
|
||||
SectionKind::getData(), FnStart);
|
||||
}
|
||||
void ARMELFStreamer::EmitFixup(const MCExpr *Expr, MCFixupKind Kind) {
|
||||
MCDataFragment *Frag = getOrCreateDataFragment();
|
||||
|
@ -73,7 +73,7 @@ IsGlobalInSmallSection(const GlobalValue *GV, const TargetMachine &TM,
|
||||
if (!GVA)
|
||||
return false;
|
||||
|
||||
if (Kind.isBSS() || Kind.isDataNoRel() || Kind.isCommon()) {
|
||||
if (Kind.isBSS() || Kind.isData() || Kind.isCommon()) {
|
||||
Type *Ty = GV->getType()->getElementType();
|
||||
return IsInSmallSection(
|
||||
GV->getParent()->getDataLayout().getTypeAllocSize(Ty));
|
||||
@ -90,7 +90,7 @@ HexagonTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
|
||||
// Handle Small Section classification here.
|
||||
if (Kind.isBSS() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
return SmallBSSSection;
|
||||
if (Kind.isDataNoRel() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
if (Kind.isData() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
return SmallDataSection;
|
||||
|
||||
// Otherwise, we work the same as ELF.
|
||||
|
@ -76,7 +76,7 @@ bool MipsTargetObjectFile::
|
||||
IsGlobalInSmallSection(const GlobalValue *GV, const TargetMachine &TM,
|
||||
SectionKind Kind) const {
|
||||
return (IsGlobalInSmallSectionImpl(GV, TM) &&
|
||||
(Kind.isDataRel() || Kind.isBSS() || Kind.isCommon()));
|
||||
(Kind.isData() || Kind.isBSS() || Kind.isCommon()));
|
||||
}
|
||||
|
||||
/// Return true if this global address should be placed into small data/bss
|
||||
@ -121,7 +121,7 @@ MipsTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
|
||||
// Handle Small Section classification here.
|
||||
if (Kind.isBSS() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
return SmallBSSSection;
|
||||
if (Kind.isDataRel() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
if (Kind.isData() && IsGlobalInSmallSection(GV, TM, Kind))
|
||||
return SmallDataSection;
|
||||
|
||||
// Otherwise, we work the same as ELF.
|
||||
|
@ -48,8 +48,7 @@ public:
|
||||
void Initialize(MCContext &ctx, const TargetMachine &TM) override {
|
||||
TargetLoweringObjectFile::Initialize(ctx, TM);
|
||||
TextSection = new NVPTXSection(MCSection::SV_ELF, SectionKind::getText());
|
||||
DataSection =
|
||||
new NVPTXSection(MCSection::SV_ELF, SectionKind::getDataRel());
|
||||
DataSection = new NVPTXSection(MCSection::SV_ELF, SectionKind::getData());
|
||||
BSSSection = new NVPTXSection(MCSection::SV_ELF, SectionKind::getBSS());
|
||||
ReadOnlySection =
|
||||
new NVPTXSection(MCSection::SV_ELF, SectionKind::getReadOnly());
|
||||
|
@ -227,11 +227,11 @@ SectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
|
||||
// globals together onto fewer pages, improving the locality of the dynamic
|
||||
// linker.
|
||||
if (ReloModel == Reloc::Static)
|
||||
return SectionKind::getDataNoRel();
|
||||
return SectionKind::getData();
|
||||
|
||||
if (C->needsRelocation())
|
||||
return SectionKind::getDataRel();
|
||||
return SectionKind::getDataNoRel();
|
||||
return SectionKind::getData();
|
||||
return SectionKind::getData();
|
||||
}
|
||||
|
||||
/// This method computes the appropriate section to emit the specified global
|
||||
|
@ -129,13 +129,15 @@ XCoreTargetObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
|
||||
if (Kind.isReadOnly()) return UseCPRel? ReadOnlySection
|
||||
: DataRelROSection;
|
||||
if (Kind.isBSS() || Kind.isCommon())return BSSSection;
|
||||
if (Kind.isDataRel()) return DataSection;
|
||||
if (Kind.isData())
|
||||
return DataSection;
|
||||
if (Kind.isReadOnlyWithRel()) return DataRelROSection;
|
||||
} else {
|
||||
if (Kind.isReadOnly()) return UseCPRel? ReadOnlySectionLarge
|
||||
: DataRelROSectionLarge;
|
||||
if (Kind.isBSS() || Kind.isCommon())return BSSSectionLarge;
|
||||
if (Kind.isDataRel()) return DataSectionLarge;
|
||||
if (Kind.isData())
|
||||
return DataSectionLarge;
|
||||
if (Kind.isReadOnlyWithRel()) return DataRelROSectionLarge;
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ entry:
|
||||
; ARM_64: .section .rodata,
|
||||
; ARM_64-LABEL: __emutls_t.external_y:
|
||||
; ARM_64-NEXT: .byte 7
|
||||
; ARM_64: .section .data.rel
|
||||
; ARM_64: .data
|
||||
; ARM_64: .align 3
|
||||
; ARM_64-LABEL: __emutls_v.internal_y:
|
||||
; ARM_64-NEXT: .xword 8
|
||||
|
@ -15,7 +15,7 @@
|
||||
; CHECK-NEXT: .xword .L_ZTIi.DW.stub-[[TYPEINFO_LBL]]
|
||||
|
||||
; .. and which is properly defined (in a writable section for the dynamic loader) later.
|
||||
; CHECK: .section .data.rel,"aw"
|
||||
; CHECK: .data
|
||||
; CHECK: .L_ZTIi.DW.stub:
|
||||
; CHECK-NEXT: .xword _ZTIi
|
||||
|
||||
|
@ -39,7 +39,7 @@ entry:
|
||||
; ARM_32: .long __emutls_v.internal_y
|
||||
; ARM_32-NOT: __emutls_t.external_x
|
||||
; ARM_32-NOT: __emutls_v.external_x:
|
||||
; ARM_32: .section .data.rel
|
||||
; ARM_32: .data
|
||||
; ARM_32: .align 2
|
||||
; ARM_32-LABEL: __emutls_v.external_y:
|
||||
; ARM_32-NEXT: .long 1
|
||||
@ -49,7 +49,7 @@ entry:
|
||||
; ARM_32: .section .rodata,
|
||||
; ARM_32-LABEL: __emutls_t.external_y:
|
||||
; ARM_32-NEXT: .byte 7
|
||||
; ARM_32: .section .data.rel
|
||||
; ARM_32: .data
|
||||
; ARM_32: .align 2
|
||||
; ARM_32-LABEL: __emutls_v.internal_y:
|
||||
; ARM_32-NEXT: .long 8
|
||||
|
@ -30,13 +30,13 @@ entry:
|
||||
; MIPS_32: lw {{.+}}call16(__emutls_get_address
|
||||
; MIPS_32-NOT: __emutls_t.external_x
|
||||
; MIPS_32-NOT: __emutls_v.external_x:
|
||||
; MIPS_32: .section .data.rel
|
||||
; MIPS_32: .data
|
||||
; MIPS_32: .align 2
|
||||
; MIPS_32-LABEL: __emutls_v.external_y:
|
||||
; MIPS_32: .section .rodata,
|
||||
; MIPS_32-LABEL: __emutls_t.external_y:
|
||||
; MIPS_32-NEXT: .byte 7
|
||||
; MIPS_32: .section .data.rel
|
||||
; MIPS_32: .data
|
||||
; MIPS_32: .align 2
|
||||
; MIPS_32-LABEL: __emutls_v.internal_y:
|
||||
; MIPS_32-NEXT: .4byte 8
|
||||
@ -58,7 +58,7 @@ entry:
|
||||
; MIPS_64: .section .rodata,
|
||||
; MIPS_64-LABEL: __emutls_t.external_y:
|
||||
; MIPS_64-NEXT: .byte 7
|
||||
; MIPS_64: .section .data.rel
|
||||
; MIPS_64: .data
|
||||
; MIPS_64: .align 3
|
||||
; MIPS_64-LABEL: __emutls_v.internal_y:
|
||||
; MIPS_64-NEXT: .8byte 8
|
||||
|
@ -103,7 +103,7 @@ entry:
|
||||
|
||||
;;;;; 32-bit targets
|
||||
|
||||
; X32: .section .data.rel,
|
||||
; X32: .data
|
||||
; X32-LABEL: __emutls_v.i:
|
||||
; X32-NEXT: .long 4
|
||||
; X32-NEXT: .long 4
|
||||
@ -114,7 +114,7 @@ entry:
|
||||
; X32-LABEL: __emutls_t.i:
|
||||
; X32-NEXT: .long 15
|
||||
|
||||
; X32: .section .data.rel,
|
||||
; X32: .data
|
||||
; X32-LABEL: __emutls_v.j:
|
||||
; X32-NEXT: .long 4
|
||||
; X32-NEXT: .long 4
|
||||
@ -136,7 +136,7 @@ entry:
|
||||
|
||||
;;;;; 64-bit targets
|
||||
|
||||
; X64: .section .data.rel,
|
||||
; X64: .data
|
||||
; X64-LABEL: __emutls_v.i:
|
||||
; X64-NEXT: .quad 4
|
||||
; X64-NEXT: .quad 4
|
||||
@ -147,7 +147,7 @@ entry:
|
||||
; X64-LABEL: __emutls_t.i:
|
||||
; X64-NEXT: .long 15
|
||||
|
||||
; X64: .section .data.rel,
|
||||
; X64: .data
|
||||
; X64-LABEL: __emutls_v.j:
|
||||
; X64-NEXT: .quad 4
|
||||
; X64-NEXT: .quad 4
|
||||
|
@ -100,7 +100,7 @@ entry:
|
||||
|
||||
;;;;; 32-bit targets
|
||||
|
||||
; X32: .section .data.rel,
|
||||
; X32: .data
|
||||
; X32-LABEL: __emutls_v.i:
|
||||
; X32-NEXT: .long 4
|
||||
; X32-NEXT: .long 4
|
||||
@ -116,7 +116,7 @@ entry:
|
||||
|
||||
;;;;; 64-bit targets
|
||||
|
||||
; X64: .section .data.rel,
|
||||
; X64: .data
|
||||
; X64-LABEL: __emutls_v.i:
|
||||
; X64-NEXT: .quad 4
|
||||
; X64-NEXT: .quad 4
|
||||
|
@ -55,7 +55,7 @@ entry:
|
||||
; X86_32: calll __emutls_get_address
|
||||
; X86_32-NOT: __emutls_t.external_x
|
||||
; X86_32-NOT: __emutls_v.external_x:
|
||||
; X86_32: .section .data.rel
|
||||
; X86_32: .data
|
||||
; X86_32: .align 4
|
||||
; X86_32-LABEL: __emutls_v.external_y:
|
||||
; X86_32-NEXT: .long 1
|
||||
@ -65,7 +65,7 @@ entry:
|
||||
; X86_32: .section .rodata,
|
||||
; X86_32-LABEL: __emutls_t.external_y:
|
||||
; X86_32-NEXT: .byte 7
|
||||
; X86_32: .section .data.rel
|
||||
; X86_32: .data
|
||||
; X86_32: .align 4
|
||||
; X86_32-LABEL: __emutls_v.internal_y:
|
||||
; X86_32-NEXT: .long 8
|
||||
@ -95,7 +95,7 @@ entry:
|
||||
; X86_64: .section .rodata,
|
||||
; X86_64-LABEL: __emutls_t.external_y:
|
||||
; X86_64-NEXT: .byte 7
|
||||
; X86_64: .section .data.rel
|
||||
; X86_64: .data
|
||||
; X86_64: .align 8
|
||||
; X86_64-LABEL: __emutls_v.internal_y:
|
||||
; X86_64-NEXT: .quad 8
|
||||
|
@ -38,7 +38,7 @@ target triple = "x86_64-unknown-linux-gnu"
|
||||
; PIC-NOT: .section
|
||||
; PIC: p1:
|
||||
; PIC: t1:
|
||||
; PIC: .section .data.rel,"aw",@progbits
|
||||
; PIC: .data
|
||||
; PIC: p2:
|
||||
; PIC: t2:
|
||||
; PIC-NOT: .section
|
||||
|
@ -1,10 +1,10 @@
|
||||
; RUN: llc -generate-arange-section -relocation-model=pic < %s | FileCheck %s
|
||||
|
||||
; CHECK: .section .data.rel,"aw",@progbits
|
||||
; CHECK: .data
|
||||
; CHECK-NOT: .section
|
||||
; CHECK: .L_ZTId.DW.stub:
|
||||
|
||||
; CHECK: .section .data.rel,"aw",@progbits
|
||||
; CHECK: .data
|
||||
; CHECK-NEXT: .Lsec_end0:
|
||||
|
||||
target triple = "x86_64-linux-gnu"
|
||||
|
Loading…
x
Reference in New Issue
Block a user