1 // RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=YESINFO 2 // RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=NOINFO 3 4 #if SETNODEBUG 5 #define NODEBUG __attribute__((nodebug)) 6 #else 7 #define NODEBUG 8 #endif 9 10 // Const global variable. Use it so it gets emitted. 11 NODEBUG static const int const_global_int_def = 1; 12 void func1(int); 13 void func2() { func1(const_global_int_def); } 14 // YESINFO-DAG: !DIGlobalVariable(name: "const_global_int_def" 15 // NOINFO-NOT: !DIGlobalVariable(name: "const_global_int_def" 16 17 // Global variable with a more involved type. 18 // If the variable has no debug info, the type should not appear either. 19 struct S1 { 20 int a; 21 int b; 22 }; 23 NODEBUG S1 global_struct = { 2, 3 }; 24 // YESINFO-DAG: !DICompositeType({{.*}} name: "S1" 25 // NOINFO-NOT: !DICompositeType({{.*}} name: "S1" 26 // YESINFO-DAG: !DIGlobalVariable(name: "global_struct" 27 // NOINFO-NOT: !DIGlobalVariable(name: "global_struct" 28 29 // Static data members. Const member needs a use. 30 // Also the class as a whole needs a use, so that we produce debug info for 31 // the entire class (iterating over the members, demonstrably skipping those 32 // with 'nodebug'). 33 struct S2 { 34 NODEBUG static int static_member; 35 NODEBUG static const int static_const_member = 4; 36 }; 37 int S2::static_member = 5; 38 void func3() { 39 S2 junk; 40 func1(S2::static_const_member); 41 } 42 // YESINFO-DAG: !DIGlobalVariable(name: "static_member" 43 // NOINFO-NOT: !DIGlobalVariable(name: "static_member" 44 // YESINFO-DAG: !DIDerivedType({{.*}} name: "static_const_member" 45 // NOINFO-NOT: !DIDerivedType({{.*}} name: "static_const_member" 46 47 // Function-local static and auto variables. 48 void func4() { 49 NODEBUG static int static_local = 6; 50 NODEBUG int normal_local = 7; 51 } 52 // YESINFO-DAG: !DIGlobalVariable(name: "static_local" 53 // NOINFO-NOT: !DIGlobalVariable(name: "static_local" 54 // YESINFO-DAG: !DILocalVariable(name: "normal_local" 55 // NOINFO-NOT: !DILocalVariable(name: "normal_local" 56