mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-30 19:06:04 +00:00

D33412/D33413 introduced this to support a clang pragma to set section names for a symbol depending on if it would be placed in bss/data/rodata/text, which may not be known until the backend. However, for text we know that only functions will go there, so just directly set the section in clang instead of going through a completely separate attribute. Autoupgrade the "implicit-section-name" attribute to directly setting the section on a Fuction.
103 lines
4.3 KiB
C++
103 lines
4.3 KiB
C++
// RUN: %clang_cc1 -emit-llvm -triple arm-none-eabi -o - %s | FileCheck %s --check-prefixes=CHECK,ELF
|
|
// RUN: %clang_cc1 -emit-llvm -triple arm64-apple-ios -o - %s | FileCheck %s --check-prefixes=CHECK,MACHO
|
|
// Test that global variables, statics and functions are attached section-attributes
|
|
// as per '#pragma clang section' directives.
|
|
|
|
extern "C" {
|
|
// test with names for each section
|
|
#ifdef __MACH__
|
|
#pragma clang section bss = "__BSS,__mybss1" data = "__DATA,__mydata1" rodata = "__RODATA,__myrodata1"
|
|
#pragma clang section text = "__TEXT,__mytext1"
|
|
#else
|
|
#pragma clang section bss="my_bss.1" data="my_data.1" rodata="my_rodata.1"
|
|
#pragma clang section text="my_text.1"
|
|
#endif
|
|
int a; // my_bss.1
|
|
int b = 1; // my_data.1
|
|
int c[4]; // my_bss.1
|
|
short d[5] = {0}; // my_bss.1
|
|
short e[6] = {0, 0, 1}; // my_data.1
|
|
extern const int f;
|
|
const int f = 2; // my_rodata.1
|
|
int foo(void) { // my_text.1
|
|
return b;
|
|
}
|
|
static int g[2]; // my_bss.1
|
|
#pragma clang section bss=""
|
|
int h; // default - .bss
|
|
#ifdef __MACH__
|
|
#pragma clang section data = "" bss = "__BSS,__mybss2" text = "__TEXT,__mytext2"
|
|
#else
|
|
#pragma clang section data="" bss="my_bss.2" text="my_text.2"
|
|
#endif
|
|
int i = 0; // my_bss.2
|
|
extern const int j;
|
|
const int j = 4; // default - .rodata
|
|
int k; // my_bss.2
|
|
extern int zoo(int *x, int *y);
|
|
int goo(void) { // my_text.2
|
|
static int lstat_h; // my_bss.2
|
|
return zoo(g, &lstat_h);
|
|
}
|
|
#ifdef __MACH__
|
|
#pragma clang section rodata = "__RODATA,__myrodata2" data = "__DATA,__mydata2" relro = "__RELRO,__myrelro2"
|
|
#else
|
|
#pragma clang section rodata="my_rodata.2" data="my_data.2" relro="my_relro.2"
|
|
#endif
|
|
int l = 5; // my_data.2
|
|
extern const int m;
|
|
const int m = 6; // my_rodata.2
|
|
|
|
typedef int (*fptr_t)(void);
|
|
const fptr_t fptrs[2] = {&foo, &goo};
|
|
#pragma clang section rodata="" data="" bss="" text=""
|
|
int n; // default
|
|
int o = 6; // default
|
|
extern const int p;
|
|
const int p = 7; // default
|
|
int hoo(void) {
|
|
return b + fptrs[f]();
|
|
}
|
|
}
|
|
//CHECK: @a ={{.*}} global i32 0, align 4 #0
|
|
//CHECK: @b ={{.*}} global i32 1, align 4 #0
|
|
//CHECK: @c ={{.*}} global [4 x i32] zeroinitializer, align 4 #0
|
|
//CHECK: @d ={{.*}} global [5 x i16] zeroinitializer, align 2 #0
|
|
//CHECK: @e ={{.*}} global [6 x i16] [i16 0, i16 0, i16 1, i16 0, i16 0, i16 0], align 2 #0
|
|
//CHECK: @f ={{.*}} constant i32 2, align 4 #0
|
|
|
|
//CHECK: @h ={{.*}} global i32 0, align 4 #1
|
|
//CHECK: @i ={{.*}} global i32 0, align 4 #2
|
|
//CHECK: @j ={{.*}} constant i32 4, align 4 #2
|
|
//CHECK: @k ={{.*}} global i32 0, align 4 #2
|
|
//CHECK: @_ZZ3gooE7lstat_h = internal global i32 0, align 4 #2
|
|
//CHECK: @_ZL1g = internal global [2 x i32] zeroinitializer, align 4 #0
|
|
|
|
//CHECK: @l ={{.*}} global i32 5, align 4 #3
|
|
//CHECK: @m ={{.*}} constant i32 6, align 4 #3
|
|
|
|
//CHECK: @n ={{.*}} global i32 0, align 4
|
|
//CHECK: @o ={{.*}} global i32 6, align 4
|
|
//CHECK: @p ={{.*}} constant i32 7, align 4
|
|
//CHECK: @_ZL5fptrs = internal constant [2 x ptr] [ptr @foo, ptr @goo], align {{4|8}} #3
|
|
|
|
//ELF: define{{.*}} i32 @foo(){{.*}} section "my_text.1" {
|
|
//ELF: define{{.*}} i32 @goo(){{.*}} section "my_text.2" {
|
|
//MACHO: define{{.*}} i32 @foo(){{.*}} section "__TEXT,__mytext1" {
|
|
//MACHO: define{{.*}} i32 @goo(){{.*}} section "__TEXT,__mytext2" {
|
|
|
|
// ensure zoo/hoo don't have a section
|
|
//CHECK: declare i32 @zoo(ptr noundef, ptr noundef) #6{{$}}
|
|
//CHECK: define{{.*}} i32 @hoo() #5 {
|
|
|
|
//ELF: attributes #0 = { "bss-section"="my_bss.1" "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
|
|
//ELF: attributes #1 = { "data-section"="my_data.1" "rodata-section"="my_rodata.1" }
|
|
//ELF: attributes #2 = { "bss-section"="my_bss.2" "rodata-section"="my_rodata.1" }
|
|
//ELF: attributes #3 = { "bss-section"="my_bss.2" "data-section"="my_data.2" "relro-section"="my_relro.2" "rodata-section"="my_rodata.2" }
|
|
//ELF: attributes #4 = { "relro-section"="my_relro.2" }
|
|
//MACHO: attributes #0 = { "bss-section"="__BSS,__mybss1" "data-section"="__DATA,__mydata1" "rodata-section"="__RODATA,__myrodata1" }
|
|
//MACHO: attributes #1 = { "data-section"="__DATA,__mydata1" "rodata-section"="__RODATA,__myrodata1" }
|
|
//MACHO: attributes #2 = { "bss-section"="__BSS,__mybss2" "rodata-section"="__RODATA,__myrodata1" }
|
|
//MACHO: attributes #3 = { "bss-section"="__BSS,__mybss2" "data-section"="__DATA,__mydata2" "relro-section"="__RELRO,__myrelro2" "rodata-section"="__RODATA,__myrodata2" }
|
|
//MACHO: attributes #4 = { "relro-section"="__RELRO,__myrelro2" }
|