1 // Unsupported on AIX because we don't support the requisite "__clangast"
2 // section in XCOFF yet.
3 // UNSUPPORTED: aix
4 
5 // Check that when depending on a precompiled module, we depend on the
6 // **top-level** module. Submodules don't have some information present (for
7 // example the path to the modulemap file) and depending on them might cause
8 // problems in the dependency scanner (e.g. generating empty `-fmodule-map-file=`
9 // arguments).
10 
11 // RUN: rm -rf %t && mkdir %t
12 // RUN: cp %S/Inputs/modules-pch-common-submodule/* %t
13 
14 // Scan dependencies of the PCH:
15 //
16 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-submodule/cdb_pch.json > %t/cdb.json
17 // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \
18 // RUN:   -generate-modules-path-args -module-files-dir %t/build > %t/result_pch.json
19 // RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH
20 //
21 // CHECK-PCH:      {
22 // CHECK-PCH-NEXT:   "modules": [
23 // CHECK-PCH-NEXT:     {
24 // CHECK-PCH-NEXT:       "clang-module-deps": [],
25 // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
26 // CHECK-PCH-NEXT:       "command-line": [
27 // CHECK-PCH-NEXT:         "-cc1"
28 // CHECK-PCH:              "-emit-module"
29 // CHECK-PCH:              "-fmodules"
30 // CHECK-PCH:              "-fmodule-name=ModCommon"
31 // CHECK-PCH:              "-fno-implicit-modules"
32 // CHECK-PCH:            ],
33 // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_COMMON:.*]]",
34 // CHECK-PCH-NEXT:       "file-deps": [
35 // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common.h",
36 // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common_sub.h",
37 // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap"
38 // CHECK-PCH-NEXT:       ],
39 // CHECK-PCH-NEXT:       "name": "ModCommon"
40 // CHECK-PCH-NEXT:     }
41 // CHECK-PCH-NEXT:   ],
42 // CHECK-PCH-NEXT:   "translation-units": [
43 // CHECK-PCH-NEXT:     {
44 // CHECK-PCH-NEXT:       "clang-context-hash": "[[HASH_PCH:.*]]",
45 // CHECK-PCH-NEXT:       "clang-module-deps": [
46 // CHECK-PCH-NEXT:         {
47 // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_COMMON]]",
48 // CHECK-PCH-NEXT:           "module-name": "ModCommon"
49 // CHECK-PCH-NEXT:         }
50 // CHECK-PCH-NEXT:       ],
51 // CHECK-PCH-NEXT:       "command-line": [
52 // CHECK-PCH:              "-fno-implicit-modules"
53 // CHECK-PCH-NEXT:         "-fno-implicit-module-maps"
54 // CHECK-PCH-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON]]/ModCommon-{{.*}}.pcm"
55 // CHECK-PCH-NEXT:       ],
56 // CHECK-PCH-NEXT:       "file-deps": [
57 // CHECK-PCH-NEXT:         "[[PREFIX]]/pch.h"
58 // CHECK-PCH-NEXT:       ],
59 // CHECK-PCH-NEXT:       "input-file": "[[PREFIX]]/pch.h"
60 // CHECK-PCH-NEXT:     }
61 // CHECK-PCH-NEXT:   ]
62 // CHECK-PCH-NEXT: }
63 
64 // Explicitly build the PCH:
65 //
66 // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModCommon > %t/mod_common.cc1.rsp
67 // RUN: %deps-to-rsp %t/result_pch.json --tu-index=0 > %t/pch.rsp
68 //
69 // RUN: %clang @%t/mod_common.cc1.rsp
70 // RUN: %clang @%t/pch.rsp
71 
72 // Scan dependencies of the TU:
73 //
74 // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-submodule/cdb_tu.json > %t/cdb.json
75 // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \
76 // RUN:   -generate-modules-path-args -module-files-dir %t/build > %t/result_tu.json
77 // RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU
78 //
79 // CHECK-TU:      {
80 // CHECK-TU-NEXT:   "modules": [
81 // CHECK-TU-NEXT:     {
82 // CHECK-TU-NEXT:       "clang-module-deps": [],
83 // CHECK-TU-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
84 // CHECK-TU-NEXT:       "command-line": [
85 // CHECK-TU-NEXT:         "-cc1"
86 // CHECK-TU:              "-emit-module"
87 // CHECK-TU:              "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_COMMON:.*]]/ModCommon-{{.*}}.pcm"
88 // CHECK-TU:              "-fmodules"
89 // CHECK-TU:              "-fmodule-name=ModTU"
90 // CHECK-TU:              "-fno-implicit-modules"
91 // CHECK-TU:            ],
92 // CHECK-TU-NEXT:       "context-hash": "[[HASH_MOD_TU:.*]]",
93 // CHECK-TU-NEXT:       "file-deps": [
94 // CHECK-TU-NEXT:         "[[PREFIX]]/mod_tu.h",
95 // CHECK-TU-NEXT:         "[[PREFIX]]/module.modulemap"
96 // CHECK-TU-NEXT:       ],
97 // CHECK-TU-NEXT:       "name": "ModTU"
98 // CHECK-TU-NEXT:     }
99 // CHECK-TU-NEXT:   ],
100 // CHECK-TU-NEXT:   "translation-units": [
101 // CHECK-TU-NEXT:     {
102 // CHECK-TU-NEXT:       "clang-context-hash": "[[HASH_TU:.*]]",
103 // CHECK-TU-NEXT:       "clang-module-deps": [
104 // CHECK-TU-NEXT:         {
105 // CHECK-TU-NEXT:           "context-hash": "[[HASH_MOD_TU]]"
106 // CHECK-TU-NEXT:           "module-name": "ModTU"
107 // CHECK-TU-NEXT:         }
108 // CHECK-TU-NEXT:       ],
109 // CHECK-TU-NEXT:       "command-line": [
110 // CHECK-TU:              "-fno-implicit-modules",
111 // CHECK-TU-NEXT:         "-fno-implicit-module-maps",
112 // CHECK-TU-NEXT:         "-fmodule-file=[[PREFIX]]/build/[[HASH_MOD_TU:.*]]/ModTU-{{.*}}.pcm"
113 // CHECK-TU-NEXT:       ],
114 // CHECK-TU-NEXT:       "file-deps": [
115 // CHECK-TU-NEXT:         "[[PREFIX]]/tu.c",
116 // CHECK-TU-NEXT:         "[[PREFIX]]/pch.h.gch"
117 // CHECK-TU-NEXT:       ],
118 // CHECK-TU-NEXT:       "input-file": "[[PREFIX]]/tu.c"
119 // CHECK-TU-NEXT:     }
120 // CHECK-TU-NEXT:   ]
121 // CHECK-TU-NEXT: }
122 
123 // Explicitly build the TU:
124 //
125 // RUN: %deps-to-rsp %t/result_tu.json --module-name=ModTU > %t/mod_tu.cc1.rsp
126 // RUN: %deps-to-rsp %t/result_tu.json --tu-index=0 > %t/tu.rsp
127 //
128 // RUN: %clang @%t/mod_tu.cc1.rsp
129 // RUN: %clang @%t/tu.rsp
130