diff --git a/Sources/SWBCSupport/CLibclang.cpp b/Sources/SWBCSupport/CLibclang.cpp index ffc1af1b..5d2779c6 100644 --- a/Sources/SWBCSupport/CLibclang.cpp +++ b/Sources/SWBCSupport/CLibclang.cpp @@ -867,6 +867,9 @@ extern "C" { int argc, const char *const *argv, const char *ModuleName, const char *WorkingDirectory, const char *ReproducerLocation, bool UseUniqueReproducerName); + void (*clang_experimental_DependencyScannerReproducerOptions_setCASOptions)( + CXDependencyScannerReproducerOptions, CXCASDatabases, CXCASOptions); + void (*clang_experimental_DependencyScannerReproducerOptions_dispose)(CXDependencyScannerReproducerOptions); /** @@ -1449,6 +1452,7 @@ struct LibclangWrapper { LOOKUP_OPTIONAL(clang_experimental_cas_ReplayResult_getStderr); LOOKUP_OPTIONAL(clang_experimental_DependencyScanner_generateReproducer); LOOKUP_OPTIONAL(clang_experimental_DependencyScannerReproducerOptions_create); + LOOKUP_OPTIONAL(clang_experimental_DependencyScannerReproducerOptions_setCASOptions); LOOKUP_OPTIONAL(clang_experimental_DependencyScannerReproducerOptions_dispose); LOOKUP_OPTIONAL(clang_experimental_DependencyScannerServiceOptions_create); LOOKUP_OPTIONAL(clang_experimental_DependencyScannerServiceOptions_dispose); @@ -2214,11 +2218,16 @@ extern "C" { int argc, char *const *argv, const char *workingDirectory, const char *reproducerLocation, + libclang_casdatabases_t casDBs, + libclang_casoptions_t casOpts, const char **message) { auto lib = scanner->scanner->lib; LibclangFunctions::CXString messageString; auto reproducerOpts = lib->fns.clang_experimental_DependencyScannerReproducerOptions_create( argc, argv, /*ModuleName=*/nullptr, workingDirectory, reproducerLocation, /*UseUniqueReproducerName=*/true); + if (lib->fns.clang_experimental_DependencyScannerReproducerOptions_setCASOptions) + lib->fns.clang_experimental_DependencyScannerReproducerOptions_setCASOptions( + reproducerOpts, casDBs ? casDBs->dbs.casDBs : nullptr, casOpts ? casOpts->opts.casOpts : nullptr); auto result = lib->fns.clang_experimental_DependencyScanner_generateReproducer( reproducerOpts, &messageString); lib->fns.clang_experimental_DependencyScannerReproducerOptions_dispose(reproducerOpts); diff --git a/Sources/SWBCSupport/CLibclang.h b/Sources/SWBCSupport/CLibclang.h index 4cda6fc5..f13a20a0 100644 --- a/Sources/SWBCSupport/CLibclang.h +++ b/Sources/SWBCSupport/CLibclang.h @@ -222,7 +222,8 @@ CSUPPORT_EXPORT bool libclang_scanner_scan_dependencies( /// \returns True on success, false if something failed (see \p message for more details). CSUPPORT_EXPORT bool libclang_scanner_generate_reproducer( libclang_scanner_t scanner, int argc, char *const *argv, const char *workingDirectory, - const char *reproducerLocation, const char **message); + const char *reproducerLocation, + libclang_casdatabases_t, libclang_casoptions_t, const char **message); /// Get the list of commands invoked by the given Clang driver command line. /// diff --git a/Sources/SWBCore/LibclangVendored/Libclang.swift b/Sources/SWBCore/LibclangVendored/Libclang.swift index 06125dd9..8257432c 100644 --- a/Sources/SWBCore/LibclangVendored/Libclang.swift +++ b/Sources/SWBCore/LibclangVendored/Libclang.swift @@ -292,13 +292,14 @@ public final class DependencyScanner { public func generateReproducer( commandLine: [String], workingDirectory: String, - location: String? + location: String?, + casDBs: ClangCASDatabases?, casOpts: ClangCASOptions? ) throws -> String { let args = CStringArray(commandLine) var messageUnsafe: UnsafePointer! defer { messageUnsafe?.deallocate() } // The count is `- 1` here, because CStringArray appends a trailing nullptr. - let success = libclang_scanner_generate_reproducer(scanner, CInt(args.cArray.count - 1), args.cArray, workingDirectory, location, &messageUnsafe); + let success = libclang_scanner_generate_reproducer(scanner, CInt(args.cArray.count - 1), args.cArray, workingDirectory, location, casDBs?.dbs, casOpts?.options, &messageUnsafe); let message = String(cString: messageUnsafe) guard success else { throw message.isEmpty ? Error.dependencyScanUnknownError : Error.dependencyScanErrorString(message) diff --git a/Sources/SWBTaskExecution/DynamicTaskSpecs/ClangModuleDependencyGraph.swift b/Sources/SWBTaskExecution/DynamicTaskSpecs/ClangModuleDependencyGraph.swift index 2f787667..dcdfad2b 100644 --- a/Sources/SWBTaskExecution/DynamicTaskSpecs/ClangModuleDependencyGraph.swift +++ b/Sources/SWBTaskExecution/DynamicTaskSpecs/ClangModuleDependencyGraph.swift @@ -213,11 +213,13 @@ package final class ClangModuleDependencyGraph { let libclang: Libclang let scanner: DependencyScanner let casDBs: ClangCASDatabases? + let casOptsForInvocations: ClangCASOptions? init(libclang: Libclang, casDBs: ClangCASDatabases?, casOptsForInvocations: ClangCASOptions?) throws { self.libclang = libclang self.scanner = try libclang.createScanner(casDBs: casDBs, casOpts: casOptsForInvocations) self.casDBs = casDBs + self.casOptsForInvocations = casOptsForInvocations } } @@ -583,7 +585,8 @@ package final class ClangModuleDependencyGraph { return nil } return try clangWithScanner.scanner.generateReproducer( - commandLine: dependency.scanningCommandLine, workingDirectory: dependency.workingDirectory.str, location: location) + commandLine: dependency.scanningCommandLine, workingDirectory: dependency.workingDirectory.str, location: location, + casDBs: clangWithScanner.casDBs, casOpts: clangWithScanner.casOptsForInvocations) } package var isEmpty: Bool {