blob: 94b431050e6152b26f3e03920b8469ba2b3f0370 [file] [edit]
// RUN: %clang -cc1 -triple x86_64-unknown-unknown %s -debug-info-kind=limited -fdynamic-debugging -o %t \
// RUN: -emit-llvm --save-dynamic-debugging-temps --discard-dynamic-debugging-debug-module
// RUN: FileCheck %s --check-prefix=INNER < %t.dyndbg.1.inner.ll
// RUN: FileCheck %s --check-prefix=OUTER < %t.dyndbg.2.outer.ll
// Test global variables get expected linkage and names in the dyndbg inner
// and outer modules. Global data is stored in the outer module and referenced
// from the inner module.
//
// The external global variables are simply referenced by inner.
//
// The internal (static) global variables get external aliases in outer
// and those are referenced from inner.
//
// The internal functions _ZTW1d (thread-local wrapper routine for d) and
// _GLOBAL__sub_I_symbols_globals, __cxx_global_var_init are promoted too (get
// global aliases).
int a = 1;
// OUTER-DAG: @a = global i32 1, align 4
// INNER-DAG: @a = external global i32, align 4
extern int b;
// OUTER-DAG: @b = external global i32, align 4
// INNER-DAG: @b = external global i32, align 4
inline int c = 2;
// OUTER-DAG: $c = comdat any
// OUTER-DAG: @c = linkonce_odr global i32 2, comdat, align 4
// INNER-DAG: @c = external global i32, align 4
thread_local int d = 3;
// OUTER-DAG: @d = thread_local global i32 3, align 4
// INNER-DAG: @d = external thread_local global i32, align 4
//
// OUTER-DAG: $_ZTW1d = comdat any
// OUTER-DAG: define weak_odr hidden noundef ptr @_ZTW1d() #[[#]] comdat
// INNER-DAG: $__dyndbg._ZTW1d = comdat any
// INNER-DAG: declare hidden noundef ptr @_ZTW1d()
// INNER-DAG: define weak_odr hidden noundef ptr @__dyndbg._ZTW1d() #[[#]] comdat
struct S { int a, b; float c, d; } e {0, 100, 4.f, 5.f};
// OUTER-DAG: @e = global %struct.S { i32 0, i32 100, float 4.000000e+00, float 5.000000e+00 }, align 4
// INNER-DAG: @e = external global %struct.S, align 4
inline S f {0, 100, 4.f, 5.f};
// OUTER-DAG: $f = comdat any
// OUTER-DAG: @f = linkonce_odr global %struct.S { i32 0, i32 100, float 4.000000e+00, float 5.000000e+00 }, comdat, align 4
// INNER-DAG: @f = external global %struct.S, align 4
int fun() {
static int g = 0;
return g;
}
// OUTER-DAG: @_ZZ3funvE1g = internal global i32 0, align 4
// OUTER-DAG: @_ZZ3funvE1g.dyndbg.[[hash:[0-9A-F]+]] = hidden alias i32, ptr @_ZZ3funvE1g
// INNER-DAG: @_ZZ3funvE1g.dyndbg.[[hash:[0-9A-F]+]] = external hidden global i32, align 4
static int h = 1;
// OUTER-DAG: @_ZL1h = internal global i32 1, align 4
// OUTER-DAG: @_ZL1h.dyndbg.[[hash]] = hidden alias i32, ptr @_ZL1h
// INNER-DAG: @_ZL1h.dyndbg.[[hash]] = external hidden global i32, align 4
__attribute__((nodebug)) int use = a + b + c + d + e.a + f.a + h;
// OUTER-DAG: define internal void @__cxx_global_var_init()
// OUTER-DAG: @__cxx_global_var_init.dyndbg.[[hash]] = hidden alias void (), ptr @__cxx_global_var_init
// INNER-DAG: declare hidden void @__cxx_global_var_init.dyndbg.[[hash]]()
// OUTER-DAG: define internal void @_GLOBAL__sub_I_symbols_globals.cpp()
// OUTER-DAG: @_GLOBAL__sub_I_symbols_globals.cpp.dyndbg.[[hash]] = hidden alias void (), ptr @_GLOBAL__sub_I_symbols_globals.cpp
// INNER-DAG: define hidden void @__dyndbg._GLOBAL__sub_I_symbols_globals.cpp.dyndbg.[[hash]]() #[[#]]