xref: /aosp_15_r20/external/clang/test/Modules/ModuleDebugInfo.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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