llvm-project/clang/test/CodeGen/keep-persistent-storage-variables.cpp
Zheng Qian bb6ab91b1d Add option -fkeep-persistent-storage-variables to emit all variables that have a persistent storage duration
This patch adds a new option -fkeep-persistent-storage-variables to emit
all variables that have a persistent storage duration, including global,
static and thread-local variables. This could be useful in cases where
the presence of all these variables as symbols in the object file are
required, so that they can be directly addressed.

Reviewed By: hubert.reinterpretcast

Differential Revision: https://reviews.llvm.org/D150221
2023-07-15 16:13:48 -04:00

54 lines
1.7 KiB
C++

// RUN: %clang_cc1 -fkeep-persistent-storage-variables -emit-llvm %s -o - -triple=x86_64-unknown-linux-gnu | FileCheck %s
// RUN: %clang_cc1 -fkeep-persistent-storage-variables -emit-llvm %s -o - -triple=powerpc64-ibm-aix-xcoff | FileCheck %s
// CHECK: @_ZL2g1 = internal global i32 0, align 4
// CHECK: @_ZL2g2 = internal global i32 1, align 4
// CHECK: @tl1 = thread_local global i32 0, align 4
// CHECK: @tl2 = thread_local global i32 3, align 4
// CHECK: @_ZL3tl3 = internal thread_local global i32 0, align 4
// CHECK: @_ZL3tl4 = internal thread_local global i32 4, align 4
// CHECK: @g5 = global i32 0, align 4
// CHECK: @g6 = global i32 6, align 4
// CHECK: @_ZZ5test3vE2s3 = internal global i32 0, align 4
// CHECK: @_ZN12_GLOBAL__N_12s4E = internal global i32 42, align 4
// CHECK: @_ZZ5test5vE3tl5 = internal thread_local global i32 1, align 4
// CHECK: @_ZN2ST2s6E = global i32 7, align 4
// CHECK: @_Z2v7 = internal global %union.anon zeroinitializer, align 4
// CHECK: @_ZDC2v8E = global %struct.ST8 zeroinitializer, align 4
// CHECK: @llvm{{(\.compiler)?}}.used = appending global [14 x ptr] [ptr @_ZL2g1, ptr @_ZL2g2, ptr @tl1, ptr @tl2, ptr @_ZL3tl3, ptr @_ZL3tl4, ptr @g5, ptr @g6, ptr @_ZZ5test3vE2s3, ptr @_ZN12_GLOBAL__N_12s4E, ptr @_ZZ5test5vE3tl5, ptr @_ZN2ST2s6E, ptr @_Z2v7, ptr @_ZDC2v8E], section "llvm.metadata"
static int g1;
static int g2 = 1;
__thread int tl1;
__thread int tl2 = 3;
static __thread int tl3;
static __thread int tl4 = 4;
int g5;
int g6 = 6;
int test3() {
static int s3 = 0;
++s3;
return s3;
}
namespace {
int s4 = 42;
}
int test5() {
static __thread int tl5 = 1;
++tl5;
return tl5;
}
struct ST {
static int s6;
};
int ST::s6 = 7;
static union { int v7; };
struct ST8 { int v8; };
auto [v8] = ST8{0};