1*67e74705SXin Li// Test that debug info is emitted for an Objective-C module and 2*67e74705SXin Li// a precompiled header. 3*67e74705SXin Li 4*67e74705SXin Li// REQUIRES: asserts, shell 5*67e74705SXin Li 6*67e74705SXin Li// Modules: 7*67e74705SXin Li// RUN: rm -rf %t 8*67e74705SXin Li// RUN: %clang_cc1 -x objective-c -fmodules -fmodule-format=obj \ 9*67e74705SXin Li// RUN: -fimplicit-module-maps -DMODULES -fmodules-cache-path=%t %s \ 10*67e74705SXin Li// RUN: -I %S/Inputs -I %t -emit-llvm -o %t.ll \ 11*67e74705SXin Li// RUN: -mllvm -debug-only=pchcontainer &>%t-mod.ll 12*67e74705SXin Li// RUN: cat %t-mod.ll | FileCheck %s 13*67e74705SXin Li// RUN: cat %t-mod.ll | FileCheck %s --check-prefix=CHECK2 14*67e74705SXin Li 15*67e74705SXin Li// PCH: 16*67e74705SXin Li// RUN: %clang_cc1 -x objective-c -emit-pch -fmodule-format=obj -I %S/Inputs \ 17*67e74705SXin Li// RUN: -o %t.pch %S/Inputs/DebugObjC.h \ 18*67e74705SXin Li// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll 19*67e74705SXin Li// RUN: cat %t-pch.ll | FileCheck %s 20*67e74705SXin Li// RUN: cat %t-pch.ll | FileCheck %s --check-prefix=CHECK2 21*67e74705SXin Li 22*67e74705SXin Li#ifdef MODULES 23*67e74705SXin Li@import DebugObjC; 24*67e74705SXin Li#endif 25*67e74705SXin Li 26*67e74705SXin Li// CHECK: distinct !DICompileUnit(language: DW_LANG_ObjC 27*67e74705SXin Li// CHECK-SAME: isOptimized: false, 28*67e74705SXin Li 29*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, 30*67e74705SXin Li// CHECK-SAME: scope: ![[MODULE:[0-9]+]], 31*67e74705SXin Li// CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugObjC 32*67e74705SXin Li 33*67e74705SXin Li// CHECK: ![[TD_ENUM:.*]] = !DICompositeType(tag: DW_TAG_enumeration_type, 34*67e74705SXin Li// CHECK-NOT: name: 35*67e74705SXin Li// CHECK-SAME: elements: 36*67e74705SXin Li 37*67e74705SXin Li// CHECK: !DISubprogram(name: "+[ObjCClass classMethod]", 38*67e74705SXin Li// CHECK-SAME: scope: ![[MODULE]], 39*67e74705SXin Li 40*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass", 41*67e74705SXin Li// CHECK-SAME: scope: ![[MODULE]], 42*67e74705SXin Li// CHECK-SAME: elements 43*67e74705SXin Li 44*67e74705SXin Li// The forward declaration should not be in the module scope. 45*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "OpaqueData", file 46*67e74705SXin Li 47*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDecl", 48*67e74705SXin Li// CHECK-SAME: scope: ![[MODULE]], 49*67e74705SXin Li 50*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClassWithPrivateIVars", 51*67e74705SXin Li// CHECK-SAME: scope: ![[MODULE]], 52*67e74705SXin Li// CHECK-SAME: elements 53*67e74705SXin Li 54*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDeclared" 55*67e74705SXin Li// CHECK-SAME: elements: 56*67e74705SXin Li 57*67e74705SXin Li// CHECK: ![[TD_UNION:.*]] = distinct !DICompositeType(tag: DW_TAG_union_type, 58*67e74705SXin Li// CHECK-NOT: name: 59*67e74705SXin Li// CHECK-SAME: elements: 60*67e74705SXin Li 61*67e74705SXin Li// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefUnion", 62*67e74705SXin Li// CHECK-SAME: baseType: ![[TD_UNION]]) 63*67e74705SXin Li 64*67e74705SXin Li// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefEnum", 65*67e74705SXin Li// CHECK-SAME: baseType: ![[TD_ENUM:.*]]) 66*67e74705SXin Li 67*67e74705SXin Li// CHECK: ![[TD_STRUCT:.*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, 68*67e74705SXin Li// CHECK-NOT: name: 69*67e74705SXin Li// CHECK-SAME: elements: 70*67e74705SXin Li// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefStruct", 71*67e74705SXin Li// CHECK-SAME: baseType: ![[TD_STRUCT]]) 72*67e74705SXin Li 73*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_union_type, 74*67e74705SXin Li// CHECK-NOT: name: 75*67e74705SXin Li// CHECK-SAME: ) 76*67e74705SXin Li 77*67e74705SXin Li// CHECK: !DICompositeType(tag: DW_TAG_structure_type, 78*67e74705SXin Li// CHECK-NOT: name: 79*67e74705SXin Li// CHECK-SAME: ) 80*67e74705SXin Li 81*67e74705SXin Li// CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl" 82*67e74705SXin Li 83*67e74705SXin Li// The output order is sublty different for module vs. pch, 84*67e74705SXin Li// so these are checked separately: 85*67e74705SXin Li// 86*67e74705SXin Li// CHECK2: !DISubprogram(name: "+[ObjCClass classMethod]" 87*67e74705SXin Li// CHECK2: !DISubprogram(name: "-[ObjCClass instanceMethodWithInt:]" 88*67e74705SXin Li// CHECK2: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass", 89*67e74705SXin Li// CHECK2: !DIObjCProperty(name: "property", 90*67e74705SXin Li// CHECK2: !DIDerivedType(tag: DW_TAG_member, name: "ivar" 91*67e74705SXin Li// CHECK2: !DISubprogram(name: "-[Category(Category) categoryMethod]" 92*67e74705SXin Li// CHECK2: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDecl", 93*67e74705SXin Li// CHECK2: !DIDerivedType(tag: DW_TAG_typedef, name: "InnerEnum" 94