diff options
Diffstat (limited to 'test/CodeGen/cfi-pragma-section.c')
-rw-r--r-- | test/CodeGen/cfi-pragma-section.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/CodeGen/cfi-pragma-section.c b/test/CodeGen/cfi-pragma-section.c new file mode 100644 index 0000000000..c2aae39cd9 --- /dev/null +++ b/test/CodeGen/cfi-pragma-section.c @@ -0,0 +1,32 @@ +// Check that CFI-generated data structures are tagged with +// "#pragma clang section" attributes + +// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-icall \ +// RUN: -fno-sanitize-trap=cfi-icall -emit-llvm -o - %s | FileCheck %s + +// CHECK-DAG: attributes [[ATTR:#[0-9]+]]{{.*}}bss-section{{.*}}data-section{{.*}}rodata-section +// CHECK-DAG: @.src = private unnamed_addr constant{{.*}}cfi-pragma-section.c{{.*}}[[ATTR]] +// CHECK-DAG: @{{[0-9]+}} = private unnamed_addr constant{{.*}}int (int){{.*}}[[ATTR]] +// CHECK-DAG: @{{[0-9]+}} = private unnamed_addr global{{.*}}@.src{{.*}}[[ATTR]] + +typedef int (*int_arg_fn)(int); + +static int int_arg1(int arg) { + return 0; +} + +static int int_arg2(int arg) { + return 1; +} + +int_arg_fn int_funcs[2] = {int_arg1, int_arg2}; + +#pragma clang section bss = ".bss.mycfi" +#pragma clang section data = ".data.mycfi" +#pragma clang section rodata = ".rodata.mycfi" + +int main(int argc, const char *argv[]) { + + int idx = argv[1][0] - '0'; + return int_funcs[argc](idx); +} |