summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp19
-rw-r--r--llvm/test/CodeGen/X86/elf-associated.ll18
-rw-r--r--llvm/test/CodeGen/X86/explicit-elf-sections.ll65
3 files changed, 94 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index ac7c4c50ae4..7a93a262bb9 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -586,15 +586,30 @@ MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal(
Flags |= ELF::SHF_GROUP;
}
+ bool EmitUniqueSection = false;
+
+ // If we have -ffunction-sections or -fdata-sections then we should emit the
+ // global value to a uniqued section of the same name.
+ if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
+ if (Kind.isText())
+ EmitUniqueSection = TM.getFunctionSections();
+ else
+ EmitUniqueSection = TM.getDataSections();
+ }
+ EmitUniqueSection |= GO->hasComdat();
+
// A section can have at most one associated section. Put each global with
// MD_associated in a unique section.
- unsigned UniqueID = MCContext::GenericSectionID;
const MCSymbolELF *AssociatedSymbol = getAssociatedSymbol(GO, TM);
if (AssociatedSymbol) {
- UniqueID = NextUniqueID++;
+ EmitUniqueSection = true;
Flags |= ELF::SHF_LINK_ORDER;
}
+ unsigned UniqueID = MCContext::GenericSectionID;
+ if (EmitUniqueSection)
+ UniqueID = NextUniqueID++;
+
MCSectionELF *Section = getContext().getELFSection(
SectionName, getELFSectionType(SectionName, Kind), Flags,
getEntrySizeForKind(Kind), Group, UniqueID, AssociatedSymbol);
diff --git a/llvm/test/CodeGen/X86/elf-associated.ll b/llvm/test/CodeGen/X86/elf-associated.ll
index e0e9e005828..3d0cf6c1f87 100644
--- a/llvm/test/CodeGen/X86/elf-associated.ll
+++ b/llvm/test/CodeGen/X86/elf-associated.ll
@@ -1,5 +1,5 @@
-; RUN: llc -data-sections=1 -mtriple x86_64-pc-linux-gnu < %s | FileCheck %s
-; RUN: llc -data-sections=0 -mtriple x86_64-pc-linux-gnu < %s | FileCheck %s
+; RUN: llc -data-sections=1 -mtriple x86_64-pc-linux-gnu < %s | FileCheck %s --check-prefix=DSECTIONS --check-prefix=CHECK
+; RUN: llc -data-sections=0 -mtriple x86_64-pc-linux-gnu < %s | FileCheck %s --check-prefix=NDSECTIONS --check-prefix=CHECK
@a = global i32 1
@b = global i32 2, !associated !0
@@ -28,9 +28,14 @@
@j = global i32 1, section "bbb", !associated !4
@k = global i32 1, !associated !4
!4 = !{i32* @h}
-; CHECK-DAG: .section aaa,"aw",@progbits
-; CHECK-DAG: .section bbb,"awo",@progbits,h,unique,1
-; CHECK-DAG: .section bbb,"awo",@progbits,h,unique,2
+; NDSECTIONS-DAG: .section aaa,"aw",@progbits
+; NDSECTIONS-DAG: .section bbb,"awo",@progbits,h,unique,1
+; NDSECTIONS-DAG: .section bbb,"awo",@progbits,h,unique,2
+
+; DSECTIONS-DAG: .section aaa,"aw",@progbits,unique,1
+; DSECTIONS-DAG: .section bbb,"awo",@progbits,h,unique,2
+; DSECTIONS-DAG: .section bbb,"awo",@progbits,h,unique,3
+
; CHECK-DAG: .section .data.k,"awo",@progbits,h
; Non-GlobalValue metadata.
@@ -47,4 +52,5 @@
@n = alias i32, i32* inttoptr (i64 add (i64 ptrtoint (i32* @a to i64), i64 1297036692682702848) to i32*)
@o = global i32 1, section "eee", !associated !7
!7 = !{i32* @n}
-; CHECK-DAG: .section eee,"awo",@progbits,n,unique,3
+; NDSECTIONS-DAG: .section eee,"awo",@progbits,n,unique,3
+; DSECTIONS-DAG: .section eee,"awo",@progbits,n,unique,6
diff --git a/llvm/test/CodeGen/X86/explicit-elf-sections.ll b/llvm/test/CodeGen/X86/explicit-elf-sections.ll
new file mode 100644
index 00000000000..549d362d874
--- /dev/null
+++ b/llvm/test/CodeGen/X86/explicit-elf-sections.ll
@@ -0,0 +1,65 @@
+; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections=1 -data-sections=1 | FileCheck %s -check-prefix=SECTIONS
+; RUN: llc < %s -mtriple=x86_64-pc-linux -function-sections=0 -data-sections=0 | FileCheck %s -check-prefix=NSECTIONS
+
+define void @f() section "aaa" { ret void }
+define void @g() section "aaa" { ret void }
+
+define void @h() { ret void }
+
+@x = global i32 1, section "aaa"
+@y = global i32 1, section "aaa"
+@z = global i32 1
+
+define void @i() section "aaa" { ret void }
+
+@w = global i32 1, section "aaa"
+
+; NSECTIONS: .section aaa,"ax",@progbits
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: f:
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: g:
+; NSECTIONS: .text
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: h:
+; NSECTIONS: .section aaa,"ax",@progbits
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: i:
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: x:
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: y:
+; NSECTIONS: .data
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: z:
+; NSECTIONS: .section aaa,"ax",@progbits
+; NSECTIONS-NOT: {{\.section|\.text|\.data}}
+; NSECTIONS: w:
+
+
+; SECTIONS: .section aaa,"ax",@progbits,unique,1
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: f:
+; SECTIONS: .section aaa,"ax",@progbits,unique,2
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: g:
+; SECTIONS: .section .text.h,"ax",@progbits
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: h:
+; SECTIONS: .section aaa,"ax",@progbits,unique,3
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: i:
+; SECTIONS: .section aaa,"aw",@progbits,unique,4
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: x:
+; SECTIONS: .section aaa,"aw",@progbits,unique,5
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: y:
+; SECTIONS: .section .data.z,"aw",@progbits
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: z:
+; SECTIONS: .section aaa,"aw",@progbits,unique,6
+; SECTIONS-NOT: {{\.section|\.text|\.data}}
+; SECTIONS: w:
+
+
OpenPOWER on IntegriCloud