mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Remove "JumpTableDataSection" from TAI, instead, have AsmPrinter
compute it based on what it knows. As part of this, rename getSectionForMergeableConstant to getSectionForConstant because it works for non-mergable constants also. The only functionality change from this is that Xcore will start dropping its jump tables into readonly section instead of data section in -static mode. This should be fine as the linker resolves the relocations. If this is a problem, let me know and we'll come up with another solution. llvm-svn: 77833
This commit is contained in:
parent
8120a93944
commit
81229d1bed
@ -206,11 +206,6 @@ namespace llvm {
|
||||
/// section with the section name and this suffix printed.
|
||||
const char *SectionEndDirectiveSuffix;// Defaults to null.
|
||||
|
||||
/// JumpTableDataSection - This is the section that we SwitchToSection right
|
||||
/// before emitting the jump tables for a function when the relocation model
|
||||
/// is not PIC.
|
||||
const char *JumpTableDataSection; // Defaults to "\t.section .rodata"
|
||||
|
||||
/// JumpTableDirective - if non-null, the directive to emit before a jump
|
||||
/// table.
|
||||
const char *JumpTableDirective;
|
||||
@ -538,9 +533,6 @@ namespace llvm {
|
||||
const char *getSectionEndDirectiveSuffix() const {
|
||||
return SectionEndDirectiveSuffix;
|
||||
}
|
||||
const char *getJumpTableDataSection() const {
|
||||
return JumpTableDataSection;
|
||||
}
|
||||
const char *getStaticCtorsSection() const {
|
||||
return StaticCtorsSection;
|
||||
}
|
||||
|
@ -45,7 +45,9 @@ protected:
|
||||
const MCSection *BSSSection;
|
||||
|
||||
/// ReadOnlySection - Section that is readonly and can contain arbitrary
|
||||
/// initialized data.
|
||||
/// initialized data. Targets are not required to have a readonly section.
|
||||
/// If they don't, various bits of code will fall back to using the data
|
||||
/// section for constants.
|
||||
const MCSection *ReadOnlySection;
|
||||
|
||||
public:
|
||||
@ -76,11 +78,9 @@ public:
|
||||
return GV != 0;
|
||||
}
|
||||
|
||||
/// getSectionForMergeableConstant - Given a mergeable constant with the
|
||||
/// specified size and relocation information, return a section that it
|
||||
/// should be placed in.
|
||||
virtual const MCSection *
|
||||
getSectionForMergeableConstant(SectionKind Kind) const;
|
||||
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
||||
/// section that it should be placed in.
|
||||
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
||||
|
||||
/// getKindForNamedSection - If this target wants to be able to override
|
||||
/// section flags based on the name of the section specified for a global
|
||||
@ -158,11 +158,9 @@ public:
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
|
||||
/// getSectionForMergeableConstant - Given a mergeable constant with the
|
||||
/// specified size and relocation information, return a section that it
|
||||
/// should be placed in.
|
||||
virtual const MCSection *
|
||||
getSectionForMergeableConstant(SectionKind Kind) const;
|
||||
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
||||
/// section that it should be placed in.
|
||||
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
||||
|
||||
virtual SectionKind getKindForNamedSection(const char *Section,
|
||||
SectionKind K) const;
|
||||
@ -194,8 +192,7 @@ public:
|
||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Mangler *Mang, const TargetMachine &TM) const;
|
||||
|
||||
virtual const MCSection *
|
||||
getSectionForMergeableConstant(SectionKind Kind) const;
|
||||
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
||||
|
||||
/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
|
||||
/// decide not to emit the UsedDirective for some symbols in llvm.used.
|
||||
|
@ -349,8 +349,7 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
|
||||
}
|
||||
}
|
||||
|
||||
const MCSection *S =
|
||||
getObjFileLowering().getSectionForMergeableConstant(Kind);
|
||||
const MCSection *S = getObjFileLowering().getSectionForConstant(Kind);
|
||||
|
||||
// The number of sections are small, just do a linear search from the
|
||||
// last section to the first.
|
||||
@ -419,22 +418,21 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
|
||||
// the appropriate section.
|
||||
TargetLowering *LoweringInfo = TM.getTargetLowering();
|
||||
|
||||
const char *JumpTableDataSection = TAI->getJumpTableDataSection();
|
||||
const Function *F = MF.getFunction();
|
||||
|
||||
const MCSection *FuncSection =
|
||||
getObjFileLowering().SectionForGlobal(F, Mang, TM);
|
||||
|
||||
bool JTInDiffSection = false;
|
||||
if ((IsPic && !LoweringInfo->usesGlobalOffsetTable()) ||
|
||||
!JumpTableDataSection || F->isWeakForLinker()) {
|
||||
if (F->isWeakForLinker() ||
|
||||
(IsPic && !LoweringInfo->usesGlobalOffsetTable())) {
|
||||
// In PIC mode, we need to emit the jump table to the same section as the
|
||||
// function body itself, otherwise the label differences won't make sense.
|
||||
// We should also do if the section name is NULL or function is declared in
|
||||
// discardable section.
|
||||
SwitchToSection(FuncSection);
|
||||
SwitchToSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
|
||||
} else {
|
||||
SwitchToDataSection(JumpTableDataSection);
|
||||
// Otherwise, drop it in the readonly section.
|
||||
const MCSection *ReadOnlySection =
|
||||
getObjFileLowering().getSectionForConstant(
|
||||
SectionKind::get(SectionKind::ReadOnly));
|
||||
SwitchToSection(ReadOnlySection);
|
||||
JTInDiffSection = true;
|
||||
}
|
||||
|
||||
|
@ -178,7 +178,13 @@ void ELFWriter::addExternalSymbol(const char *External) {
|
||||
// Get jump table section on the section name returned by TAI
|
||||
ELFSection &ELFWriter::getJumpTableSection() {
|
||||
unsigned Align = TM.getTargetData()->getPointerABIAlignment();
|
||||
return getSection(TAI->getJumpTableDataSection(),
|
||||
|
||||
const TargetLoweringObjectFile &TLOF =
|
||||
TM.getTargetLowering()->getObjFileLowering();
|
||||
|
||||
return getSection(TLOF.getSectionForConstant(
|
||||
SectionKind::get(SectionKind::ReadOnly))
|
||||
->getName(),
|
||||
ELFSection::SHT_PROGBITS,
|
||||
ELFSection::SHF_ALLOC, Align);
|
||||
}
|
||||
@ -204,7 +210,7 @@ ELFSection &ELFWriter::getConstantPoolSection(MachineConstantPoolEntry &CPE) {
|
||||
const TargetLoweringObjectFile &TLOF =
|
||||
TM.getTargetLowering()->getObjFileLowering();
|
||||
|
||||
return getSection(TLOF.getSectionForMergeableConstant(Kind)->getName(),
|
||||
return getSection(TLOF.getSectionForConstant(Kind)->getName(),
|
||||
ELFSection::SHT_PROGBITS,
|
||||
ELFSection::SHF_MERGE | ELFSection::SHF_ALLOC,
|
||||
CPE.getAlignment());
|
||||
|
@ -49,8 +49,6 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM)
|
||||
HiddenDirective = "\t.private_extern ";
|
||||
|
||||
// Sections:
|
||||
JumpTableDataSection = "\t.const";
|
||||
|
||||
if (TM.getRelocationModel() == Reloc::Static) {
|
||||
StaticCtorsSection = ".constructor";
|
||||
StaticDtorsSection = ".destructor";
|
||||
|
@ -69,7 +69,6 @@ TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm) : TM(tm) {
|
||||
TextSectionStartSuffix = "";
|
||||
DataSectionStartSuffix = "";
|
||||
SectionEndDirectiveSuffix = 0;
|
||||
JumpTableDataSection = "\t.section .rodata";
|
||||
JumpTableDirective = 0;
|
||||
// FIXME: Flags are ELFish - replace with normal section stuff.
|
||||
StaticCtorsSection = "\t.section .ctors,\"aw\",@progbits";
|
||||
|
@ -228,12 +228,11 @@ TargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
|
||||
return getDataSection();
|
||||
}
|
||||
|
||||
/// getSectionForMergableConstant - Given a mergable constant with the
|
||||
/// getSectionForConstant - Given a mergable constant with the
|
||||
/// specified size and relocation information, return a section that it
|
||||
/// should be placed in.
|
||||
const MCSection *
|
||||
TargetLoweringObjectFile::
|
||||
getSectionForMergeableConstant(SectionKind Kind) const {
|
||||
TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
|
||||
if (Kind.isReadOnly() && ReadOnlySection != 0)
|
||||
return ReadOnlySection;
|
||||
|
||||
@ -459,11 +458,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
return DataRelROSection;
|
||||
}
|
||||
|
||||
/// getSectionForMergeableConstant - Given a mergeable constant with the
|
||||
/// getSectionForConstant - Given a mergeable constant with the
|
||||
/// specified size and relocation information, return a section that it
|
||||
/// should be placed in.
|
||||
const MCSection *TargetLoweringObjectFileELF::
|
||||
getSectionForMergeableConstant(SectionKind Kind) const {
|
||||
getSectionForConstant(SectionKind Kind) const {
|
||||
if (Kind.isMergeableConst4())
|
||||
return MergeableConst4Section;
|
||||
if (Kind.isMergeableConst8())
|
||||
@ -582,8 +581,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
}
|
||||
|
||||
const MCSection *
|
||||
TargetLoweringObjectFileMachO::
|
||||
getSectionForMergeableConstant(SectionKind Kind) const {
|
||||
TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
|
||||
// If this constant requires a relocation, we have to put it in the data
|
||||
// segment, not in the text segment.
|
||||
if (Kind.isDataRel())
|
||||
|
@ -228,7 +228,6 @@ X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
|
||||
|
||||
AlignmentIsInBytes = true;
|
||||
|
||||
JumpTableDataSection = NULL;
|
||||
SwitchToSectionDirective = "";
|
||||
TextSectionStartSuffix = "\tSEGMENT PARA 'CODE'";
|
||||
DataSectionStartSuffix = "\tSEGMENT PARA 'DATA'";
|
||||
|
@ -18,7 +18,7 @@ XCoreTargetAsmInfo::XCoreTargetAsmInfo(const TargetMachine &TM)
|
||||
Data64bitsDirective = 0;
|
||||
ZeroDirective = "\t.space\t";
|
||||
CommentString = "#";
|
||||
JumpTableDataSection = "\t.section\t.dp.data,\"awd\",@progbits";
|
||||
|
||||
PrivateGlobalPrefix = ".L";
|
||||
AscizDirective = ".asciiz";
|
||||
WeakDefDirective = "\t.weak\t";
|
||||
|
Loading…
Reference in New Issue
Block a user