mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Put jump tables in distinct sections if -ffunction-sections is used.
A small regression in r230411 was that we were basing the decision on -fdata-sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230707 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e508109037
commit
fc0ad8d28d
@ -244,22 +244,9 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) {
|
||||
return ".data.rel.ro";
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::
|
||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Mangler &Mang, const TargetMachine &TM) const {
|
||||
unsigned Flags = getELFSectionFlags(Kind);
|
||||
|
||||
// If we have -ffunction-section or -fdata-section then we should emit the
|
||||
// global value to a uniqued section specifically for it.
|
||||
bool EmitUniqueSection = false;
|
||||
if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
|
||||
if (Kind.isText())
|
||||
EmitUniqueSection = TM.getFunctionSections();
|
||||
else
|
||||
EmitUniqueSection = TM.getDataSections();
|
||||
}
|
||||
EmitUniqueSection |= GV->hasComdat();
|
||||
|
||||
static const MCSectionELF *selectELFSectionForGlobal(
|
||||
MCContext &Ctx, const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
|
||||
const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags) {
|
||||
unsigned EntrySize = 0;
|
||||
if (Kind.isMergeableCString()) {
|
||||
if (Kind.isMergeable2ByteCString()) {
|
||||
@ -309,9 +296,29 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Name.push_back('.');
|
||||
TM.getNameWithPrefix(Name, GV, Mang, true);
|
||||
}
|
||||
return getContext().getELFSection(Name, getELFSectionType(Name, Kind), Flags,
|
||||
EntrySize, Group,
|
||||
EmitUniqueSection && !UniqueSectionNames);
|
||||
return Ctx.getELFSection(Name, getELFSectionType(Name, Kind), Flags,
|
||||
EntrySize, Group,
|
||||
EmitUniqueSection && !UniqueSectionNames);
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal(
|
||||
const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
|
||||
const TargetMachine &TM) const {
|
||||
unsigned Flags = getELFSectionFlags(Kind);
|
||||
|
||||
// If we have -ffunction-section or -fdata-section then we should emit the
|
||||
// global value to a uniqued section specifically for it.
|
||||
bool EmitUniqueSection = false;
|
||||
if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
|
||||
if (Kind.isText())
|
||||
EmitUniqueSection = TM.getFunctionSections();
|
||||
else
|
||||
EmitUniqueSection = TM.getDataSections();
|
||||
}
|
||||
EmitUniqueSection |= GV->hasComdat();
|
||||
|
||||
return selectELFSectionForGlobal(getContext(), GV, Kind, Mang, TM,
|
||||
EmitUniqueSection, Flags);
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable(
|
||||
@ -323,7 +330,8 @@ const MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable(
|
||||
if (!EmitUniqueSection)
|
||||
return ReadOnlySection;
|
||||
|
||||
return SelectSectionForGlobal(&F, SectionKind::getReadOnly(), Mang, TM);
|
||||
return selectELFSectionForGlobal(getContext(), &F, SectionKind::getReadOnly(),
|
||||
Mang, TM, EmitUniqueSection, ELF::SHF_ALLOC);
|
||||
}
|
||||
|
||||
bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(
|
||||
|
@ -3,6 +3,7 @@
|
||||
; RUN: llc < %s -mtriple=i386-apple-darwin10 -relocation-model=static | FileCheck %s -check-prefix=DARWIN-STATIC
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin10 | FileCheck %s -check-prefix=DARWIN64
|
||||
; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -data-sections -function-sections | FileCheck %s -check-prefix=LINUX-SECTIONS
|
||||
; RUN: llc < %s -mtriple=i386-unknown-linux-gnu -function-sections | FileCheck %s -check-prefix=LINUX-FUNC-SECTIONS
|
||||
; RUN: llc < %s -mtriple=x86_64-pc-linux -data-sections -function-sections -relocation-model=pic | FileCheck %s -check-prefix=LINUX-SECTIONS-PIC
|
||||
; RUN: llc < %s -mtriple=i686-pc-win32 -data-sections -function-sections | FileCheck %s -check-prefix=WIN32-SECTIONS
|
||||
|
||||
@ -42,6 +43,11 @@ bb5:
|
||||
; LINUX-SECTIONS-NEXT: .cfi_endproc
|
||||
; LINUX-SECTIONS-NEXT: .section .rodata.F2,"a",@progbits
|
||||
|
||||
; LINUX-FUNC-SECTIONS: .section .text.F2,"ax",@progbits
|
||||
; LINUX-FUNC-SECTIONS: .size F2,
|
||||
; LINUX-FUNC-SECTIONS-NEXT: .cfi_endproc
|
||||
; LINUX-FUNC-SECTIONS-NEXT: .section .rodata.F2,"a",@progbits
|
||||
|
||||
; LINUX-SECTIONS-PIC: .section .text.F2,"ax",@progbits
|
||||
; LINUX-SECTIONS-PIC: .size F2,
|
||||
; LINUX-SECTIONS-PIC-NEXT: .cfi_endproc
|
||||
|
Loading…
Reference in New Issue
Block a user