xref: /llvm-project/clang/test/ClangScanDeps/modules-pch.c (revision 9d4837f47c48c634d4a0ac799188e1f5332495ef)
106d4a763SSteven Wan // Unsupported on AIX because we don't support the requisite "__clangast"
206d4a763SSteven Wan // section in XCOFF yet.
364e4d03cSPaul Robinson // UNSUPPORTED: target={{.*}}-aix{{.*}}
406d4a763SSteven Wan 
5de07b1e8SJan Svoboda // RUN: rm -rf %t && mkdir %t
6de07b1e8SJan Svoboda // RUN: cp %S/Inputs/modules-pch/* %t
7de07b1e8SJan Svoboda 
84629554fSJan Svoboda // Scan dependencies of the PCH:
94629554fSJan Svoboda //
10ef1b22a2SDmitri Gribenko // RUN: rm -f %t/cdb_pch.json
1165c01348SJan Svoboda // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_pch.json > %t/cdb_pch.json
1265c01348SJan Svoboda // RUN: clang-scan-deps -compilation-database %t/cdb_pch.json -format experimental-full \
1371e32d5cSJan Svoboda // RUN:   -module-files-dir %t/build > %t/result_pch.json
14c4b13f7aSJan Svoboda // RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH
154629554fSJan Svoboda //
16d8bab69eSJan Svoboda // Check we didn't build the PCH during dependency scanning.
17f726da11SFangrui Song // RUN: not cat %/t/pch.h.pch
18d8bab69eSJan Svoboda //
19c4b13f7aSJan Svoboda // CHECK-PCH:      {
204629554fSJan Svoboda // CHECK-PCH-NEXT:   "modules": [
214629554fSJan Svoboda // CHECK-PCH-NEXT:     {
224629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-module-deps": [],
234629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
244629554fSJan Svoboda // CHECK-PCH-NEXT:       "command-line": [
254629554fSJan Svoboda // CHECK-PCH:            ],
264629554fSJan Svoboda // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_COMMON_1:.*]]",
274629554fSJan Svoboda // CHECK-PCH-NEXT:       "file-deps": [
28*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap",
29*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common_1.h"
304629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
3168eb3b20SArtem Chikin // CHECK-PCH-NEXT:       "link-libraries": [],
324629554fSJan Svoboda // CHECK-PCH-NEXT:       "name": "ModCommon1"
334629554fSJan Svoboda // CHECK-PCH-NEXT:     },
344629554fSJan Svoboda // CHECK-PCH-NEXT:     {
354629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-module-deps": [],
364629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
374629554fSJan Svoboda // CHECK-PCH-NEXT:       "command-line": [
384629554fSJan Svoboda // CHECK-PCH:            ],
394629554fSJan Svoboda // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_COMMON_2:.*]]",
404629554fSJan Svoboda // CHECK-PCH-NEXT:       "file-deps": [
41*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap",
42*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_common_2.h"
434629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
4468eb3b20SArtem Chikin // CHECK-PCH-NEXT:       "link-libraries": [],
454629554fSJan Svoboda // CHECK-PCH-NEXT:       "name": "ModCommon2"
464629554fSJan Svoboda // CHECK-PCH-NEXT:     },
474629554fSJan Svoboda // CHECK-PCH-NEXT:     {
484629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-module-deps": [
494629554fSJan Svoboda // CHECK-PCH-NEXT:         {
504629554fSJan Svoboda // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_COMMON_2]]",
514629554fSJan Svoboda // CHECK-PCH-NEXT:           "module-name": "ModCommon2"
524629554fSJan Svoboda // CHECK-PCH-NEXT:         }
534629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
544629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
554629554fSJan Svoboda // CHECK-PCH-NEXT:       "command-line": [
564629554fSJan Svoboda // CHECK-PCH:            ],
574629554fSJan Svoboda // CHECK-PCH-NEXT:       "context-hash": "[[HASH_MOD_PCH:.*]]",
584629554fSJan Svoboda // CHECK-PCH-NEXT:       "file-deps": [
59*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/module.modulemap",
60*9d4837f4SJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/mod_pch.h"
614629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
6268eb3b20SArtem Chikin // CHECK-PCH-NEXT:       "link-libraries": [],
634629554fSJan Svoboda // CHECK-PCH-NEXT:       "name": "ModPCH"
644629554fSJan Svoboda // CHECK-PCH-NEXT:     }
654629554fSJan Svoboda // CHECK-PCH-NEXT:   ],
664629554fSJan Svoboda // CHECK-PCH-NEXT:   "translation-units": [
674629554fSJan Svoboda // CHECK-PCH-NEXT:     {
6883902c40SBen Langmuir // CHECK-PCH:            "clang-context-hash": "[[HASH_PCH:.*]]",
694629554fSJan Svoboda // CHECK-PCH-NEXT:       "clang-module-deps": [
704629554fSJan Svoboda // CHECK-PCH-NEXT:         {
714629554fSJan Svoboda // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_COMMON_1]]",
724629554fSJan Svoboda // CHECK-PCH-NEXT:           "module-name": "ModCommon1"
734629554fSJan Svoboda // CHECK-PCH-NEXT:         },
744629554fSJan Svoboda // CHECK-PCH-NEXT:         {
754629554fSJan Svoboda // CHECK-PCH-NEXT:           "context-hash": "[[HASH_MOD_PCH]]",
764629554fSJan Svoboda // CHECK-PCH-NEXT:           "module-name": "ModPCH"
774629554fSJan Svoboda // CHECK-PCH-NEXT:         }
784629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
794629554fSJan Svoboda // CHECK-PCH-NEXT:       "command-line": [
80be795ee1SJan Svoboda // CHECK-PCH:            ],
8183902c40SBen Langmuir // CHECK-PCH:            "file-deps": [
824629554fSJan Svoboda // CHECK-PCH-NEXT:         "[[PREFIX]]/pch.h"
834629554fSJan Svoboda // CHECK-PCH-NEXT:       ],
844629554fSJan Svoboda // CHECK-PCH-NEXT:       "input-file": "[[PREFIX]]/pch.h"
854629554fSJan Svoboda // CHECK-PCH-NEXT:     }
864629554fSJan Svoboda 
87de07b1e8SJan Svoboda // Explicitly build the PCH:
88de07b1e8SJan Svoboda //
8926053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModCommon1 > %t/mod_common_1.cc1.rsp
9026053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModCommon2 > %t/mod_common_2.cc1.rsp
9126053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_pch.json --module-name=ModPCH > %t/mod_pch.cc1.rsp
9226053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_pch.json --tu-index=0 > %t/pch.rsp
934629554fSJan Svoboda //
944629554fSJan Svoboda // RUN: %clang @%t/mod_common_1.cc1.rsp
954629554fSJan Svoboda // RUN: %clang @%t/mod_common_2.cc1.rsp
964629554fSJan Svoboda // RUN: %clang @%t/mod_pch.cc1.rsp
9719017c24SJan Svoboda // RUN: %clang @%t/pch.rsp
98de07b1e8SJan Svoboda 
99de07b1e8SJan Svoboda // Scan dependencies of the TU:
100de07b1e8SJan Svoboda //
101ef1b22a2SDmitri Gribenko // RUN: rm -f %t/cdb_tu.json
10265c01348SJan Svoboda // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu.json > %t/cdb_tu.json
10365c01348SJan Svoboda // RUN: clang-scan-deps -compilation-database %t/cdb_tu.json -format experimental-full \
10471e32d5cSJan Svoboda // RUN:   -module-files-dir %t/build > %t/result_tu.json
105c4b13f7aSJan Svoboda // RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU
1069223209bSJan Svoboda //
107c4b13f7aSJan Svoboda // CHECK-TU:      {
1089223209bSJan Svoboda // CHECK-TU-NEXT:   "modules": [
1099223209bSJan Svoboda // CHECK-TU-NEXT:     {
1109223209bSJan Svoboda // CHECK-TU-NEXT:       "clang-module-deps": [],
1119223209bSJan Svoboda // CHECK-TU-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
1129223209bSJan Svoboda // CHECK-TU-NEXT:       "command-line": [
1139223209bSJan Svoboda // CHECK-TU:            ],
1149223209bSJan Svoboda // CHECK-TU-NEXT:       "context-hash": "[[HASH_MOD_TU:.*]]",
1159223209bSJan Svoboda // CHECK-TU-NEXT:       "file-deps": [
116*9d4837f4SJan Svoboda // CHECK-TU-NEXT:         "[[PREFIX]]/module.modulemap",
117*9d4837f4SJan Svoboda // CHECK-TU-NEXT:         "[[PREFIX]]/mod_tu.h"
1189223209bSJan Svoboda // CHECK-TU-NEXT:       ],
11968eb3b20SArtem Chikin // CHECK-TU-NEXT:       "link-libraries": [],
1209223209bSJan Svoboda // CHECK-TU-NEXT:       "name": "ModTU"
1219223209bSJan Svoboda // CHECK-TU-NEXT:     }
1229223209bSJan Svoboda // CHECK-TU-NEXT:   ],
1239223209bSJan Svoboda // CHECK-TU-NEXT:   "translation-units": [
1249223209bSJan Svoboda // CHECK-TU-NEXT:     {
12583902c40SBen Langmuir // CHECK-TU:            "clang-context-hash": "[[HASH_TU:.*]]",
1269223209bSJan Svoboda // CHECK-TU-NEXT:       "clang-module-deps": [
1279223209bSJan Svoboda // CHECK-TU-NEXT:         {
1289223209bSJan Svoboda // CHECK-TU-NEXT:           "context-hash": "[[HASH_MOD_TU]]",
1299223209bSJan Svoboda // CHECK-TU-NEXT:           "module-name": "ModTU"
1309223209bSJan Svoboda // CHECK-TU-NEXT:         }
1319223209bSJan Svoboda // CHECK-TU-NEXT:       ],
1329223209bSJan Svoboda // CHECK-TU-NEXT:       "command-line": [
133be795ee1SJan Svoboda // CHECK-TU:            ],
13483902c40SBen Langmuir // CHECK-TU:            "file-deps": [
1359223209bSJan Svoboda // CHECK-TU-NEXT:         "[[PREFIX]]/tu.c",
136f726da11SFangrui Song // CHECK-TU-NEXT:         "[[PREFIX]]/pch.h.pch"
1379223209bSJan Svoboda // CHECK-TU-NEXT:       ],
1389223209bSJan Svoboda // CHECK-TU-NEXT:       "input-file": "[[PREFIX]]/tu.c"
1399223209bSJan Svoboda // CHECK-TU-NEXT:     }
1404629554fSJan Svoboda 
1414629554fSJan Svoboda // Explicitly build the TU:
1424629554fSJan Svoboda //
14326053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_tu.json --module-name=ModTU > %t/mod_tu.cc1.rsp
14426053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_tu.json --tu-index=0 > %t/tu.rsp
1454629554fSJan Svoboda //
1464629554fSJan Svoboda // RUN: %clang @%t/mod_tu.cc1.rsp
14719017c24SJan Svoboda // RUN: %clang @%t/tu.rsp
1484629554fSJan Svoboda 
1494629554fSJan Svoboda // Scan dependencies of the TU that has common modules with the PCH:
1504629554fSJan Svoboda //
151ef1b22a2SDmitri Gribenko // RUN: rm -f %t/cdb_tu_with_common.json
15265c01348SJan Svoboda // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu_with_common.json > %t/cdb_tu_with_common.json
15365c01348SJan Svoboda // RUN: clang-scan-deps -compilation-database %t/cdb_tu_with_common.json -format experimental-full \
15471e32d5cSJan Svoboda // RUN:   -module-files-dir %t/build > %t/result_tu_with_common.json
155c4b13f7aSJan Svoboda // RUN: cat %t/result_tu_with_common.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU-WITH-COMMON
1564629554fSJan Svoboda //
157c4b13f7aSJan Svoboda // CHECK-TU-WITH-COMMON:      {
1584629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:   "modules": [
1594629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:     {
1604629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "clang-module-deps": [],
1614629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
1624629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "command-line": [
1634629554fSJan Svoboda // CHECK-TU-WITH-COMMON:            ],
1644629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "context-hash": "[[HASH_MOD_TU_WITH_COMMON:.*]]",
1654629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "file-deps": [
166*9d4837f4SJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/module.modulemap",
167*9d4837f4SJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/mod_tu_with_common.h"
1684629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       ],
16968eb3b20SArtem Chikin // CHECK-TU-WITH-COMMON-NEXT:       "link-libraries": [],
1704629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "name": "ModTUWithCommon"
1714629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:     }
1724629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:   ],
1734629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:   "translation-units": [
1744629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:     {
17583902c40SBen Langmuir // CHECK-TU-WITH-COMMON:            "clang-context-hash": "[[HASH_TU_WITH_COMMON:.*]]",
1764629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "clang-module-deps": [
1774629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:         {
1784629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:           "context-hash": "[[HASH_MOD_TU_WITH_COMMON]]",
1794629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:           "module-name": "ModTUWithCommon"
1804629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:         }
1814629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       ],
1824629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "command-line": [
183be795ee1SJan Svoboda // CHECK-TU-WITH-COMMON:              "-fmodule-file=[[PREFIX]]/build/{{.*}}/ModCommon2-{{.*}}.pcm"
184be795ee1SJan Svoboda // CHECK-TU-WITH-COMMON:            ],
18583902c40SBen Langmuir // CHECK-TU-WITH-COMMON:            "file-deps": [
1864629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/tu_with_common.c",
187f726da11SFangrui Song // CHECK-TU-WITH-COMMON-NEXT:         "[[PREFIX]]/pch.h.pch"
1884629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       ],
1894629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:       "input-file": "[[PREFIX]]/tu_with_common.c"
1904629554fSJan Svoboda // CHECK-TU-WITH-COMMON-NEXT:     }
1914629554fSJan Svoboda 
1924629554fSJan Svoboda // Explicitly build the TU that has common modules with the PCH:
1934629554fSJan Svoboda //
19426053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_tu_with_common.json --module-name=ModTUWithCommon > %t/mod_tu_with_common.cc1.rsp
19526053ce0SJan Svoboda // RUN: %deps-to-rsp %t/result_tu_with_common.json --tu-index=0 > %t/tu_with_common.rsp
1964629554fSJan Svoboda //
1974629554fSJan Svoboda // RUN: %clang @%t/mod_tu_with_common.cc1.rsp
19819017c24SJan Svoboda // RUN: %clang @%t/tu_with_common.rsp
199