jansvoboda11 created this revision. jansvoboda11 added reviewers: Bigcheese, dexonsmith. Herald added a subscriber: mgorny. jansvoboda11 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
When a project uses PCH with explicit modules, the build will look like this: 1. scan PCH dependencies 2. explicitly build PCH 3. scan TU dependencies 4. explicitly build TU Step 2 produces an object file for the PCH, which the dependency scanner needs to read in step 3. This patch adds support for object files to the dependency scanner. The `clang-scan-deps` invocation in the attached test would fail without this change. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103519 Files: clang/lib/Tooling/DependencyScanning/CMakeLists.txt clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json clang/test/ClangScanDeps/Inputs/modules-pch/mod_tu.h clang/test/ClangScanDeps/Inputs/modules-pch/module.modulemap clang/test/ClangScanDeps/Inputs/modules-pch/pch.h clang/test/ClangScanDeps/Inputs/modules-pch/tu.c clang/test/ClangScanDeps/modules-pch.c
Index: clang/test/ClangScanDeps/modules-pch.c =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/modules-pch.c @@ -0,0 +1,13 @@ +// RUN: rm -rf %t && mkdir %t +// RUN: cp %S/Inputs/modules-pch/* %t + +// Explicitly build the PCH: +// +// RUN: %clang -x c-header %t/pch.h -fmodules -gmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t/cache -o %t/pch.h.gch + +// Scan dependencies of the TU: +// +// RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu.json > %t/cdb_tu.json +// RUN: clang-scan-deps -compilation-database %t/cdb_tu.json -format experimental-full \ +// RUN: -generate-modules-path-args -build-dir %t/build Index: clang/test/ClangScanDeps/Inputs/modules-pch/tu.c =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/Inputs/modules-pch/tu.c @@ -0,0 +1,3 @@ +// tu.c + +#include "mod_tu.h" Index: clang/test/ClangScanDeps/Inputs/modules-pch/pch.h =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/Inputs/modules-pch/pch.h @@ -0,0 +1 @@ +// pch.h Index: clang/test/ClangScanDeps/Inputs/modules-pch/module.modulemap =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/Inputs/modules-pch/module.modulemap @@ -0,0 +1,3 @@ +module ModTU { + header "mod_tu.h" +} Index: clang/test/ClangScanDeps/Inputs/modules-pch/mod_tu.h =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/Inputs/modules-pch/mod_tu.h @@ -0,0 +1 @@ +// mod_tu.h Index: clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json =================================================================== --- /dev/null +++ clang/test/ClangScanDeps/Inputs/modules-pch/cdb_tu.json @@ -0,0 +1,7 @@ +[ + { + "directory": "DIR", + "command": "clang -fsyntax-only DIR/tu.c -fmodules -gmodules -fimplicit-module-maps -fmodules-cache-path=DIR/cache -include DIR/pch.h -o DIR/tu.o", + "file": "DIR/tu.c" + } +] Index: clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/DependencyScanning/DependencyScanningWorker.h" +#include "clang/CodeGen/ObjectFilePCHContainerOperations.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/CompilerInvocation.h" #include "clang/Frontend/FrontendActions.h" @@ -153,7 +154,13 @@ DependencyScanningService &Service) : Format(Service.getFormat()) { DiagOpts = new DiagnosticOptions(); + PCHContainerOps = std::make_shared<PCHContainerOperations>(); + PCHContainerOps->registerReader( + std::make_unique<ObjectFilePCHContainerReader>()); + PCHContainerOps->registerWriter( + std::make_unique<ObjectFilePCHContainerWriter>()); + RealFS = llvm::vfs::createPhysicalFileSystem(); if (Service.canSkipExcludedPPRanges()) PPSkipMappings = Index: clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp +++ clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/DependencyScanning/DependencyScanningService.h" +#include "llvm/Support/TargetSelect.h" using namespace clang; using namespace tooling; @@ -16,4 +17,10 @@ ScanningMode Mode, ScanningOutputFormat Format, bool ReuseFileManager, bool SkipExcludedPPRanges) : Mode(Mode), Format(Format), ReuseFileManager(ReuseFileManager), - SkipExcludedPPRanges(SkipExcludedPPRanges) {} + SkipExcludedPPRanges(SkipExcludedPPRanges) { + // Initialize targets for object file support. + llvm::InitializeAllTargets(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllAsmPrinters(); + llvm::InitializeAllAsmParsers(); +} Index: clang/lib/Tooling/DependencyScanning/CMakeLists.txt =================================================================== --- clang/lib/Tooling/DependencyScanning/CMakeLists.txt +++ clang/lib/Tooling/DependencyScanning/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_LINK_COMPONENTS + ${LLVM_TARGETS_TO_BUILD} Core Support ) @@ -16,6 +17,7 @@ LINK_LIBS clangAST clangBasic + clangCodeGen clangDriver clangFrontend clangFrontendTool
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits