[llvm] r304704 - Add support for #pragma clang section
Javed Absar via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 5 03:09:14 PDT 2017
Author: javed.absar
Date: Mon Jun 5 05:09:13 2017
New Revision: 304704
URL: http://llvm.org/viewvc/llvm-project?rev=304704&view=rev
Log:
Add support for #pragma clang section
This patch provides a means to specify section-names for global variables,
functions and static variables, using #pragma directives.
This feature is only defined to work sensibly for ELF targets.
One can specify section names as:
#pragma clang section bss="myBSS" data="myData" rodata="myRodata" text="myText"
One can "unspecify" a section name with empty string e.g.
#pragma clang section bss="" data="" text="" rodata=""
Reviewers: Roger Ferrer, Jonathan Roelofs, Reid Kleckner
Differential Revision: https://reviews.llvm.org/D33413
Added:
llvm/trunk/test/CodeGen/ARM/clang-section.ll
llvm/trunk/test/MC/ELF/clang-section.s
Modified:
llvm/trunk/include/llvm/IR/GlobalVariable.h
llvm/trunk/lib/CodeGen/GlobalMerge.cpp
llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp
Modified: llvm/trunk/include/llvm/IR/GlobalVariable.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/GlobalVariable.h?rev=304704&r1=304703&r2=304704&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/GlobalVariable.h (original)
+++ llvm/trunk/include/llvm/IR/GlobalVariable.h Mon Jun 5 05:09:13 2017
@@ -235,6 +235,13 @@ public:
Attrs = A;
}
+ /// Check if section name is present
+ bool hasImplicitSection() const {
+ return getAttributes().hasAttribute("bss-section") ||
+ getAttributes().hasAttribute("data-section") ||
+ getAttributes().hasAttribute("rodata-section");
+ }
+
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const Value *V) {
return V->getValueID() == Value::GlobalVariableVal;
Modified: llvm/trunk/lib/CodeGen/GlobalMerge.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalMerge.cpp?rev=304704&r1=304703&r2=304704&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalMerge.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalMerge.cpp Mon Jun 5 05:09:13 2017
@@ -553,7 +553,8 @@ bool GlobalMerge::doInitialization(Modul
// Grab all non-const globals.
for (auto &GV : M.globals()) {
// Merge is safe for "normal" internal or external globals only
- if (GV.isDeclaration() || GV.isThreadLocal() || GV.hasSection())
+ if (GV.isDeclaration() || GV.isThreadLocal() ||
+ GV.hasSection() || GV.hasImplicitSection())
continue;
// It's not safe to merge globals that may be preempted
Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=304704&r1=304703&r2=304704&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
+++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Mon Jun 5 05:09:13 2017
@@ -248,6 +248,25 @@ MCSection *TargetLoweringObjectFileELF::
const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
StringRef SectionName = GO->getSection();
+ // Check if '#pragma clang section' name is applicable.
+ // Note that pragma directive overrides -ffunction-section, -fdata-section
+ // and so section name is exactly as user specified and not uniqued.
+ const GlobalVariable *GV = dyn_cast<GlobalVariable>(GO);
+ if (GV && GV->hasImplicitSection()) {
+ auto Attrs = GV->getAttributes();
+ if (Attrs.hasAttribute("bss-section") && Kind.isBSS()) {
+ SectionName = Attrs.getAttribute("bss-section").getValueAsString();
+ } else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly()) {
+ SectionName = Attrs.getAttribute("rodata-section").getValueAsString();
+ } else if (Attrs.hasAttribute("data-section") && Kind.isData()) {
+ SectionName = Attrs.getAttribute("data-section").getValueAsString();
+ }
+ }
+ const Function *F = dyn_cast<Function>(GO);
+ if (F && F->hasFnAttribute("implicit-section-name")) {
+ SectionName = F->getFnAttribute("implicit-section-name").getValueAsString();
+ }
+
// Infer section flags from the section name if we can.
Kind = getELFKindForNamedSection(SectionName, Kind);
Modified: llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp?rev=304704&r1=304703&r2=304704&view=diff
==============================================================================
--- llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp (original)
+++ llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp Mon Jun 5 05:09:13 2017
@@ -240,6 +240,20 @@ MCSection *TargetLoweringObjectFile::Sec
if (GO->hasSection())
return getExplicitSectionGlobal(GO, Kind, TM);
+ if (auto *GVar = dyn_cast<GlobalVariable>(GO)) {
+ auto Attrs = GVar->getAttributes();
+ if ((Attrs.hasAttribute("bss-section") && Kind.isBSS()) ||
+ (Attrs.hasAttribute("data-section") && Kind.isData()) ||
+ (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly())) {
+ return getExplicitSectionGlobal(GO, Kind, TM);
+ }
+ }
+
+ if (auto *F = dyn_cast<Function>(GO)) {
+ if (F->hasFnAttribute("implicit-section-name"))
+ return getExplicitSectionGlobal(GO, Kind, TM);
+ }
+
// Use default section depending on the 'type' of global
return SelectSectionForGlobal(GO, Kind, TM);
}
Added: llvm/trunk/test/CodeGen/ARM/clang-section.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/clang-section.ll?rev=304704&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/clang-section.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/clang-section.ll Mon Jun 5 05:09:13 2017
@@ -0,0 +1,140 @@
+;RUN: llc -mtriple=armv7-eabi %s -o - | FileCheck %s
+;Test that global variables and functions are assigned to correct sections.
+
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+target triple = "armv7-arm-none-eabi"
+
+ at a = global i32 0, align 4 #0
+ at b = global i32 1, align 4 #0
+ at c = global [4 x i32] zeroinitializer, align 4 #0
+ at d = global [5 x i16] zeroinitializer, align 2 #0
+ at e = global [6 x i16] [i16 0, i16 0, i16 1, i16 0, i16 0, i16 0], align 2 #0
+ at f = constant i32 2, align 4 #0
+ at h = global i32 0, align 4 #1
+ at i = global i32 0, align 4 #2
+ at j = constant i32 4, align 4 #2
+ at k = global i32 0, align 4 #2
+ at _ZZ3gooE7lstat_h = internal global i32 0, align 4 #2
+ at _ZL1g = internal global [2 x i32] zeroinitializer, align 4 #0
+ at l = global i32 5, align 4 #3
+ at m = constant i32 6, align 4 #3
+ at n = global i32 0, align 4
+ at o = global i32 6, align 4
+ at p = constant i32 7, align 4
+
+; Function Attrs: noinline nounwind
+define i32 @foo() #4 {
+entry:
+ %0 = load i32, i32* @b, align 4
+ ret i32 %0
+}
+
+; Function Attrs: noinline
+define i32 @goo() #5 {
+entry:
+ %call = call i32 @zoo(i32* getelementptr inbounds ([2 x i32], [2 x i32]* @_ZL1g, i32 0, i32 0), i32* @_ZZ3gooE7lstat_h)
+ ret i32 %call
+}
+
+declare i32 @zoo(i32*, i32*) #6
+
+; Function Attrs: noinline nounwind
+define i32 @hoo() #7 {
+entry:
+ %0 = load i32, i32* @b, align 4
+ ret i32 %0
+}
+
+attributes #0 = { "bss-section"="my_bss.1" "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
+attributes #1 = { "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
+attributes #2 = { "bss-section"="my_bss.2" "rodata-section"="my_rodata.1" }
+attributes #3 = { "bss-section"="my_bss.2" "data-section"="my_data.2" "rodata-section"="my_rodata.2" }
+attributes #4 = { noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="preserve-sign" "disable-tail-calls"="false" "implicit-section-name"="my_text.1" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="true" "no-jump-tables"="false" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-a9" "target-features"="+dsp,+fp16,+neon,+vfp3" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #5 = { noinline "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="preserve-sign" "disable-tail-calls"="false" "implicit-section-name"="my_text.2" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="true" "no-jump-tables"="false" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-a9" "target-features"="+dsp,+fp16,+neon,+vfp3" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #6 = { "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="preserve-sign" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-a9" "target-features"="+dsp,+fp16,+neon,+vfp3" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #7 = { noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="preserve-sign" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="true" "no-jump-tables"="false" "no-nans-fp-math"="true" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cortex-a9" "target-features"="+dsp,+fp16,+neon,+vfp3" "unsafe-fp-math"="false" "use-soft-float"="false" }
+
+!llvm.module.flags = !{!0, !1, !2, !3}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, !"static_rwdata", i32 1}
+!2 = !{i32 1, !"enumsize_buildattr", i32 2}
+!3 = !{i32 1, !"armlib_unavailable", i32 0}
+
+;CHECK: .section my_text.1,"ax",%progbits
+;CHECK: .type foo,%function
+;CHECK: foo:
+
+;CHECK: .section my_text.2,"ax",%progbits
+;CHECK: .type goo,%function
+;CHECK: goo:
+
+;CHECK: .text
+;CHECK: .type hoo,%function
+;CHECK: hoo:
+
+;CHECK: .type a,%object
+;CHECK: .section my_bss.1,"aw",%nobits
+;CHECK: a:
+
+;CHECK: .type b,%object
+;CHECK: .section my_data.1,"aw",%progbits
+;CHECK: b:
+
+;CHECK: .type c,%object
+;CHECK: .section my_bss.1,"aw",%nobits
+;CHECK: c:
+
+;CHECK: .type d,%object
+;CHECK: d:
+
+;CHECK: .type e,%object
+;CHECK: .section my_data.1,"aw",%progbits
+;CHECK: e:
+
+;CHECK: .type f,%object
+;CHECK: .section my_rodata.1,"a",%progbits
+;CHECK: f:
+
+;CHECK: .type h,%object
+;CHECK: .bss
+;CHECK: h:
+
+;CHECK: .type i,%object
+;CHECK: .section my_bss.2,"aw",%nobits
+;CHECK: i:
+
+;CHECK: .type j,%object
+;CHECK: .section my_rodata.1,"a",%progbits
+;CHECK: j:
+
+;CHECK: .type k,%object
+;CHECK: .section my_bss.2,"aw",%nobits
+;CHECK: k:
+
+;CHECK: .type _ZZ3gooE7lstat_h,%object @ @_ZZ3gooE7lstat_h
+;CHECK: _ZZ3gooE7lstat_h:
+
+;CHECK: .type _ZL1g,%object
+;CHECK: .section my_bss.1,"aw",%nobits
+;CHECK: _ZL1g:
+
+;CHECK: .type l,%object
+;CHECK: .section my_data.2,"aw",%progbits
+;CHECK: l:
+
+;CHECK: .type m,%object
+;CHECK: .section my_rodata.2,"a",%progbits
+;CHECK: m:
+
+;CHECK: .type n,%object
+;CHECK: .bss
+;CHECK: n:
+
+;CHECK: .type o,%object
+;CHECK: .data
+;CHECK: o:
+
+;CHECK: .type p,%object
+;CHECK: .section .rodata,"a",%progbits
+;CHECK: p:
Added: llvm/trunk/test/MC/ELF/clang-section.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/clang-section.s?rev=304704&view=auto
==============================================================================
--- llvm/trunk/test/MC/ELF/clang-section.s (added)
+++ llvm/trunk/test/MC/ELF/clang-section.s Mon Jun 5 05:09:13 2017
@@ -0,0 +1,399 @@
+// RUN: llvm-mc -filetype=obj -triple arm-eabi %s -o - | llvm-readobj -s -t | FileCheck %s
+// Test that global variables and functions are assigned correct section.
+ .text
+ .syntax unified
+ .eabi_attribute 67, "2.09" @ Tag_conformance
+ .eabi_attribute 6, 1 @ Tag_CPU_arch
+ .eabi_attribute 8, 1 @ Tag_ARM_ISA_use
+ .eabi_attribute 17, 1 @ Tag_ABI_PCS_GOT_use
+ .eabi_attribute 20, 1 @ Tag_ABI_FP_denormal
+ .eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions
+ .eabi_attribute 23, 3 @ Tag_ABI_FP_number_model
+ .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access
+ .eabi_attribute 24, 1 @ Tag_ABI_align_needed
+ .eabi_attribute 25, 1 @ Tag_ABI_align_preserved
+ .eabi_attribute 38, 1 @ Tag_ABI_FP_16bit_format
+ .eabi_attribute 18, 4 @ Tag_ABI_PCS_wchar_t
+ .eabi_attribute 26, 2 @ Tag_ABI_enum_size
+ .eabi_attribute 14, 0 @ Tag_ABI_PCS_R9_use
+ .section my_text.1,"ax",%progbits
+ .globl foo
+ .p2align 2
+ .type foo,%function
+ .code 32 @ @foo
+foo:
+ .fnstart
+@ BB#0: @ %entry
+ ldr r0, .LCPI0_0
+ ldr r0, [r0]
+ mov pc, lr
+ .p2align 2
+@ BB#1:
+.LCPI0_0:
+ .long b
+.Lfunc_end0:
+ .size foo, .Lfunc_end0-foo
+ .cantunwind
+ .fnend
+
+ .section my_text.2,"ax",%progbits
+ .globl goo
+ .p2align 2
+ .type goo,%function
+ .code 32 @ @goo
+goo:
+ .fnstart
+@ BB#0: @ %entry
+ .save {r11, lr}
+ push {r11, lr}
+ ldr r0, .LCPI1_0
+ ldr r1, .LCPI1_1
+ bl zoo
+ pop {r11, lr}
+ mov pc, lr
+ .p2align 2
+@ BB#1:
+.LCPI1_0:
+ .long _ZL1g
+.LCPI1_1:
+ .long _ZZ3gooE7lstat_h
+.Lfunc_end1:
+ .size goo, .Lfunc_end1-goo
+ .cantunwind
+ .fnend
+
+ .text
+ .globl hoo
+ .p2align 2
+ .type hoo,%function
+ .code 32 @ @hoo
+hoo:
+ .fnstart
+@ BB#0: @ %entry
+ ldr r0, .LCPI2_0
+ ldr r0, [r0]
+ mov pc, lr
+ .p2align 2
+@ BB#1:
+.LCPI2_0:
+ .long b
+.Lfunc_end2:
+ .size hoo, .Lfunc_end2-hoo
+ .cantunwind
+ .fnend
+
+ .type a,%object @ @a
+ .section my_bss.1,"aw",%nobits
+ .globl a
+ .p2align 2
+a:
+ .long 0 @ 0x0
+ .size a, 4
+
+ .type b,%object @ @b
+ .section my_data.1,"aw",%progbits
+ .globl b
+ .p2align 2
+b:
+ .long 1 @ 0x1
+ .size b, 4
+
+ .type c,%object @ @c
+ .section my_bss.1,"aw",%nobits
+ .globl c
+ .p2align 2
+c:
+ .zero 16
+ .size c, 16
+
+ .type d,%object @ @d
+ .globl d
+ .p2align 1
+d:
+ .zero 10
+ .size d, 10
+
+ .type e,%object @ @e
+ .section my_data.1,"aw",%progbits
+ .globl e
+ .p2align 1
+e:
+ .short 0 @ 0x0
+ .short 0 @ 0x0
+ .short 1 @ 0x1
+ .short 0 @ 0x0
+ .short 0 @ 0x0
+ .short 0 @ 0x0
+ .size e, 12
+
+ .type f,%object @ @f
+ .section my_rodata.1,"a",%progbits
+ .globl f
+ .p2align 2
+f:
+ .long 2 @ 0x2
+ .size f, 4
+
+ .type h,%object @ @h
+ .bss
+ .globl h
+ .p2align 2
+h:
+ .long 0 @ 0x0
+ .size h, 4
+
+ .type i,%object @ @i
+ .section my_bss.2,"aw",%nobits
+ .globl i
+ .p2align 2
+i:
+ .long 0 @ 0x0
+ .size i, 4
+
+ .type j,%object @ @j
+ .section my_rodata.1,"a",%progbits
+ .globl j
+ .p2align 2
+j:
+ .long 4 @ 0x4
+ .size j, 4
+
+ .type k,%object @ @k
+ .section my_bss.2,"aw",%nobits
+ .globl k
+ .p2align 2
+k:
+ .long 0 @ 0x0
+ .size k, 4
+
+ .type _ZZ3gooE7lstat_h,%object @ @_ZZ3gooE7lstat_h
+ .p2align 2
+_ZZ3gooE7lstat_h:
+ .long 0 @ 0x0
+ .size _ZZ3gooE7lstat_h, 4
+
+ .type _ZL1g,%object @ @_ZL1g
+ .section my_bss.1,"aw",%nobits
+ .p2align 2
+_ZL1g:
+ .zero 8
+ .size _ZL1g, 8
+
+ .type l,%object @ @l
+ .section my_data.2,"aw",%progbits
+ .globl l
+ .p2align 2
+l:
+ .long 5 @ 0x5
+ .size l, 4
+
+ .type m,%object @ @m
+ .section my_rodata.2,"a",%progbits
+ .globl m
+ .p2align 2
+m:
+ .long 6 @ 0x6
+ .size m, 4
+
+ .type n,%object @ @n
+ .bss
+ .globl n
+ .p2align 2
+n:
+ .long 0 @ 0x0
+ .size n, 4
+
+ .type o,%object @ @o
+ .data
+ .globl o
+ .p2align 2
+o:
+ .long 6 @ 0x6
+ .size o, 4
+
+ .type p,%object @ @p
+ .section .rodata,"a",%progbits
+ .globl p
+ .p2align 2
+p:
+ .long 7 @ 0x7
+ .size p, 4
+
+
+ .ident "clang version 5.0.0 (http://llvm.org/git/clang.git 254242a3ad440307fb451093a429c71ea9a8c888) (http://llvm.org/git/llvm.git 3c8daefbe3d1672ac1dae775b211f881f0063038)"
+ .section ".note.GNU-stack","",%progbits
+ .eabi_attribute 30, 1 @ Tag_ABI_optimization_goals
+
+//CHECK: Section {
+//CHECK: Name: .text
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x6)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_EXECINSTR (0x4)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_text.1
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x6)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_EXECINSTR (0x4)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_text.2
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x6)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_EXECINSTR (0x4)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_bss.1
+//CHECK: Type: SHT_NOBITS (0x8)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_data.1
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_rodata.1
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x2)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: .bss
+//CHECK: Type: SHT_NOBITS (0x8)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_bss.2
+//CHECK: Type: SHT_NOBITS (0x8)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_data.2
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: my_rodata.2
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x2)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: .data
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x3)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: SHF_WRITE (0x1)
+//CHECK: ]
+//CHECK: }
+//CHECK: Section {
+//CHECK: Name: .rodata
+//CHECK: Type: SHT_PROGBITS (0x1)
+//CHECK: Flags [ (0x2)
+//CHECK: SHF_ALLOC (0x2)
+//CHECK: ]
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: _ZL1g
+//CHECK: Section: my_bss.1 (0xE)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: _ZZ3gooE7lstat_h
+//CHECK: Section: my_bss.2 (0x12)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: a
+//CHECK: Section: my_bss.1 (0xE)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: b
+//CHECK: Section: my_data.1 (0xF)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: c
+//CHECK: Section: my_bss.1 (0xE)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: d
+//CHECK: Section: my_bss.1 (0xE)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: e
+//CHECK: Section: my_data.1 (0xF)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: f
+//CHECK: Section: my_rodata.1 (0x10)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: foo
+//CHECK: Section: my_text.1 (0x4)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: goo
+//CHECK: Section: my_text.2 (0x8)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: h
+//CHECK: Section: .bss (0x11)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: hoo
+//CHECK: Section: .text (0x2)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: i
+//CHECK: Section: my_bss.2 (0x12)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: j
+//CHECK: Section: my_rodata.1 (0x10)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: k
+//CHECK: Section: my_bss.2 (0x12)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: l
+//CHECK: Section: my_data.2 (0x13)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: m
+//CHECK: Section: my_rodata.2 (0x14)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: n
+//CHECK: Section: .bss (0x11)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: o
+//CHECK: Section: .data (0x15)
+//CHECK: }
+//CHECK: Symbol {
+//CHECK: Name: p
+//CHECK: Section: .rodata (0x16)
+//CHECK: }
More information about the llvm-commits
mailing list