14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=YESINFO
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s --check-prefix=NOINFO
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if SETNODEBUG
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define NODEBUG __attribute__((nodebug))
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define NODEBUG
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Const global variable. Use it so it gets emitted.
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNODEBUG static const int const_global_int_def = 1;
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func1(int);
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func2() { func1(const_global_int_def); }
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DIGlobalVariable(name: "const_global_int_def"
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DIGlobalVariable(name: "const_global_int_def"
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Global variable with a more involved type.
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// If the variable has no debug info, the type should not appear either.
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S1 {
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int a;
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int b;
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNODEBUG S1 global_struct = { 2, 3 };
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DICompositeType({{.*}} name: "S1"
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DICompositeType({{.*}} name: "S1"
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DIGlobalVariable(name: "global_struct"
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DIGlobalVariable(name: "global_struct"
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Static data members. Const member needs a use.
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Also the class as a whole needs a use, so that we produce debug info for
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// the entire class (iterating over the members, demonstrably skipping those
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// with 'nodebug').
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S2 {
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NODEBUG static int static_member;
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NODEBUG static const int static_const_member = 4;
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint S2::static_member = 5;
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func3() {
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S2 junk;
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  func1(S2::static_const_member);
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DIGlobalVariable(name: "static_member"
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DIGlobalVariable(name: "static_member"
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DIDerivedType({{.*}} name: "static_const_member"
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DIDerivedType({{.*}} name: "static_const_member"
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Function-local static and auto variables.
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid func4() {
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NODEBUG static int static_local = 6;
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NODEBUG        int normal_local = 7;
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DIGlobalVariable(name: "static_local"
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DIGlobalVariable(name: "static_local"
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// YESINFO-DAG: !DILocalVariable(name: "normal_local"
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// NOINFO-NOT:  !DILocalVariable(name: "normal_local"
56