1*1ff1bcabSJake Egan// UNSUPPORTED: -zos, -aix
2748a6cd1SAdrian Prantl// Test that debug info is emitted for an Objective-C module and
3748a6cd1SAdrian Prantl// a precompiled header.
4748a6cd1SAdrian Prantl
52e1538f2SReid Kleckner// REQUIRES: asserts
6748a6cd1SAdrian Prantl
7748a6cd1SAdrian Prantl// Modules:
8748a6cd1SAdrian Prantl// RUN: rm -rf %t
9992d820eSAdrian Prantl// RUN: %clang_cc1 -x objective-c -fmodules -fmodule-format=obj \
10992d820eSAdrian Prantl// RUN:   -fimplicit-module-maps -DMODULES -fmodules-cache-path=%t %s \
11992d820eSAdrian Prantl// RUN:   -I %S/Inputs -I %t -emit-llvm -o %t.ll \
12992d820eSAdrian Prantl// RUN:   -mllvm -debug-only=pchcontainer &>%t-mod.ll
13748a6cd1SAdrian Prantl// RUN: cat %t-mod.ll | FileCheck %s
14aa5d08d0SAdrian Prantl// RUN: cat %t-mod.ll | FileCheck %s --check-prefix=CHECK2
15748a6cd1SAdrian Prantl
16748a6cd1SAdrian Prantl// PCH:
17992d820eSAdrian Prantl// RUN: %clang_cc1 -x objective-c -emit-pch -fmodule-format=obj -I %S/Inputs \
18992d820eSAdrian Prantl// RUN:   -o %t.pch %S/Inputs/DebugObjC.h \
19992d820eSAdrian Prantl// RUN:   -mllvm -debug-only=pchcontainer &>%t-pch.ll
20748a6cd1SAdrian Prantl// RUN: cat %t-pch.ll | FileCheck %s
21aa5d08d0SAdrian Prantl// RUN: cat %t-pch.ll | FileCheck %s --check-prefix=CHECK2
22748a6cd1SAdrian Prantl
23748a6cd1SAdrian Prantl#ifdef MODULES
24748a6cd1SAdrian Prantl@import DebugObjC;
25748a6cd1SAdrian Prantl#endif
26748a6cd1SAdrian Prantl
279a1a1aa2SAdrian Prantl// CHECK: distinct !DICompileUnit(language: DW_LANG_ObjC, file: ![[FILE:[0-9]+]],
289a1a1aa2SAdrian Prantl// CHECK-SAME:                    isOptimized: false
299a1a1aa2SAdrian Prantl
309a1a1aa2SAdrian Prantl// CHECK: ![[FILE]] = !DIFile(filename: "{{DebugObjC|.*DebugObjC.h}}"
31aa5d08d0SAdrian Prantl
32aa5d08d0SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
33aa5d08d0SAdrian Prantl// CHECK-SAME:             scope: ![[MODULE:[0-9]+]],
343a2d4947SAdrian Prantl// CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugObjC
35aa5d08d0SAdrian Prantl
36aa5d08d0SAdrian Prantl// CHECK: ![[TD_ENUM:.*]] = !DICompositeType(tag: DW_TAG_enumeration_type,
37ae06ca0cSJustin Lebar// CHECK-NOT:              name:
38aa5d08d0SAdrian Prantl// CHECK-SAME:             elements:
39aa5d08d0SAdrian Prantl
4040a3fcb0SDjordje Todorovic// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDecl",
41aa5d08d0SAdrian Prantl// CHECK-SAME:             scope: ![[MODULE]],
42e76bda54SAdrian Prantl
43e76bda54SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass",
44e76bda54SAdrian Prantl// CHECK-SAME:             scope: ![[MODULE]],
4550fd1a87SAdrian Prantl// CHECK-SAME:             elements
46e76bda54SAdrian Prantl
4750fd1a87SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClassWithPrivateIVars",
4850fd1a87SAdrian Prantl// CHECK-SAME:             scope: ![[MODULE]],
4950fd1a87SAdrian Prantl// CHECK-SAME:             elements
5050fd1a87SAdrian Prantl
51aa5d08d0SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDeclared"
52aa5d08d0SAdrian Prantl// CHECK-SAME:             elements:
538c0e5051SAdrian Prantl
54f9521b0bSDuncan P. N. Exon Smith// CHECK: ![[TD_UNION:.*]] = distinct !DICompositeType(tag: DW_TAG_union_type,
55ae06ca0cSJustin Lebar// CHECK-NOT:              name:
56aa5d08d0SAdrian Prantl// CHECK-SAME:             elements:
578c0e5051SAdrian Prantl
58aa5d08d0SAdrian Prantl// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefUnion",
59aa5d08d0SAdrian Prantl// CHECK-SAME:           baseType: ![[TD_UNION]])
608c0e5051SAdrian Prantl
61aa5d08d0SAdrian Prantl// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefEnum",
62aa5d08d0SAdrian Prantl// CHECK-SAME:           baseType: ![[TD_ENUM:.*]])
638c0e5051SAdrian Prantl
64f9521b0bSDuncan P. N. Exon Smith// CHECK: ![[TD_STRUCT:.*]] = distinct !DICompositeType(tag: DW_TAG_structure_type,
65ae06ca0cSJustin Lebar// CHECK-NOT:              name:
66aa5d08d0SAdrian Prantl// CHECK-SAME:             elements:
67aa5d08d0SAdrian Prantl// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefStruct",
68aa5d08d0SAdrian Prantl// CHECK-SAME:           baseType: ![[TD_STRUCT]])
698c0e5051SAdrian Prantl
70aa5d08d0SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_union_type,
71ae06ca0cSJustin Lebar// CHECK-NOT:              name:
72ae06ca0cSJustin Lebar// CHECK-SAME:             )
738c0e5051SAdrian Prantl
74aa5d08d0SAdrian Prantl// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
75ae06ca0cSJustin Lebar// CHECK-NOT:              name:
76ae06ca0cSJustin Lebar// CHECK-SAME:             )
778c0e5051SAdrian Prantl
78aa5d08d0SAdrian Prantl// CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"
79aa5d08d0SAdrian Prantl
80aa5d08d0SAdrian Prantl// The output order is sublty different for module vs. pch,
81aa5d08d0SAdrian Prantl// so these are checked separately:
82aa5d08d0SAdrian Prantl//
8340a3fcb0SDjordje Todorovic// CHECK2: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDecl",
84e76bda54SAdrian Prantl// CHECK2: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass",
85e76bda54SAdrian Prantl// CHECK2: !DIObjCProperty(name: "property",
86e76bda54SAdrian Prantl// CHECK2: !DIDerivedType(tag: DW_TAG_member, name: "ivar"
87e76bda54SAdrian Prantl// CHECK2: !DIDerivedType(tag: DW_TAG_typedef, name: "InnerEnum"
88