mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-11 21:57:55 +00:00
Move code only used by codegen out of MC. NFC.
MC itself never needs to know about these sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279965 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1801e2fa13
commit
1a56948cc9
@ -98,6 +98,8 @@ public:
|
||||
~TargetLoweringObjectFileMachO() override {}
|
||||
TargetLoweringObjectFileMachO();
|
||||
|
||||
void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
|
||||
|
||||
/// Emit the module flags that specify the garbage collection information.
|
||||
void emitModuleFlags(MCStreamer &Streamer,
|
||||
ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
|
||||
@ -145,6 +147,7 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
|
||||
public:
|
||||
~TargetLoweringObjectFileCOFF() override {}
|
||||
|
||||
void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
|
||||
MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Mangler &Mang,
|
||||
const TargetMachine &TM) const override;
|
||||
|
@ -65,12 +65,6 @@ protected:
|
||||
/// constants.
|
||||
MCSection *ReadOnlySection;
|
||||
|
||||
/// This section contains the static constructor pointer list.
|
||||
MCSection *StaticCtorSection;
|
||||
|
||||
/// This section contains the static destructor pointer list.
|
||||
MCSection *StaticDtorSection;
|
||||
|
||||
/// If exception handling is supported by the target, this is the section the
|
||||
/// Language Specific Data Area information is emitted to.
|
||||
MCSection *LSDASection;
|
||||
|
@ -45,6 +45,12 @@ protected:
|
||||
bool SupportIndirectSymViaGOTPCRel;
|
||||
bool SupportGOTPCRelWithOffset;
|
||||
|
||||
/// This section contains the static constructor pointer list.
|
||||
MCSection *StaticCtorSection;
|
||||
|
||||
/// This section contains the static destructor pointer list.
|
||||
MCSection *StaticDtorSection;
|
||||
|
||||
public:
|
||||
MCContext &getContext() const { return *Ctx; }
|
||||
|
||||
|
@ -446,13 +446,20 @@ const MCExpr *TargetLoweringObjectFileELF::lowerRelativeReference(
|
||||
void
|
||||
TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
|
||||
UseInitArray = UseInitArray_;
|
||||
if (!UseInitArray)
|
||||
return;
|
||||
MCContext &Ctx = getContext();
|
||||
if (!UseInitArray) {
|
||||
StaticCtorSection = Ctx.getELFSection(".ctors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
|
||||
StaticCtorSection = getContext().getELFSection(
|
||||
".init_array", ELF::SHT_INIT_ARRAY, ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
||||
StaticDtorSection = getContext().getELFSection(
|
||||
".fini_array", ELF::SHT_FINI_ARRAY, ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
||||
StaticDtorSection = Ctx.getELFSection(".dtors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
return;
|
||||
}
|
||||
|
||||
StaticCtorSection = Ctx.getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
|
||||
ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
||||
StaticDtorSection = Ctx.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
|
||||
ELF::SHF_WRITE | ELF::SHF_ALLOC);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -464,6 +471,24 @@ TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO()
|
||||
SupportIndirectSymViaGOTPCRel = true;
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
|
||||
const TargetMachine &TM) {
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
if (!TM.isPositionIndependent()) {
|
||||
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::getData());
|
||||
StaticDtorSection = Ctx.getMachOSection("__DATA", "__mod_term_func",
|
||||
MachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getData());
|
||||
}
|
||||
}
|
||||
|
||||
/// emitModuleFlags - Perform code emission for module flags.
|
||||
void TargetLoweringObjectFileMachO::
|
||||
emitModuleFlags(MCStreamer &Streamer,
|
||||
@ -1052,6 +1077,31 @@ emitModuleFlags(MCStreamer &Streamer,
|
||||
}
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
|
||||
const TargetMachine &TM) {
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
const Triple &T = TM.getTargetTriple();
|
||||
if (T.isKnownWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
|
||||
StaticCtorSection =
|
||||
Ctx.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
StaticDtorSection =
|
||||
Ctx.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
} else {
|
||||
StaticCtorSection = Ctx.getCOFFSection(
|
||||
".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getData());
|
||||
StaticDtorSection = Ctx.getCOFFSection(
|
||||
".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getData());
|
||||
}
|
||||
}
|
||||
|
||||
MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(
|
||||
unsigned Priority, const MCSymbol *KeySym) const {
|
||||
return getContext().getAssociativeCOFFSection(
|
||||
|
@ -177,20 +177,6 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
|
||||
MachO::S_THREAD_LOCAL_VARIABLE_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
if (!PositionIndependent) {
|
||||
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::getData());
|
||||
StaticDtorSection = Ctx->getMachOSection("__DATA", "__mod_term_func",
|
||||
MachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getData());
|
||||
}
|
||||
|
||||
// Exception Handling.
|
||||
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
@ -507,12 +493,6 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T) {
|
||||
Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
|
||||
|
||||
StaticCtorSection = Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
|
||||
StaticDtorSection = Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_WRITE);
|
||||
|
||||
// Exception Handling Sections.
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on ELF, even though
|
||||
@ -630,26 +610,6 @@ void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
|
||||
".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
if (T.isKnownWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
|
||||
StaticCtorSection =
|
||||
Ctx->getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
StaticDtorSection =
|
||||
Ctx->getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
} else {
|
||||
StaticCtorSection = Ctx->getCOFFSection(
|
||||
".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getData());
|
||||
StaticDtorSection = Ctx->getCOFFSection(
|
||||
".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getData());
|
||||
}
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
|
||||
// though it contains relocatable pointers. In PIC mode, this is probably a
|
||||
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
|
Loading…
Reference in New Issue
Block a user