diff --git a/clang/include/clang-c/Dependencies.h b/clang/include/clang-c/Dependencies.h index 827b1bef3ed4b..cdf1e6624e8ed 100644 --- a/clang/include/clang-c/Dependencies.h +++ b/clang/include/clang-c/Dependencies.h @@ -733,6 +733,56 @@ CINDEX_LINKAGE enum CXErrorCode clang_experimental_DependencyScanner_generateReproducer( CXDependencyScannerReproducerOptions CXOptions, CXString *MessageOut); +/** + * An opaque object that contains a \c CXDepGraphModule 's list of link + * libraries. + */ +typedef struct CXOpaqueDepGraphModuleLinkLibrarySet + *CXDepGraphModuleLinkLibrarySet; + +/** + * An opaque object that contains information about a link library. + */ +typedef struct CXOpaqueDepGraphModuleLinkLibrary *CXDepGraphModuleLinkLibrary; + +/** + * Get the set of link libraries given a \c CXDepGraphModule instance. + * The returned set is a pointer into memory that the \c CXDepGraphModule + * instance owns. Therefore the set does not need to be disposed. + */ +CINDEX_LINKAGE CXDepGraphModuleLinkLibrarySet + clang_experimental_DepGraphModule_getLinkLibrarySet(CXDepGraphModule); + +/** + * Get the size of \c CXDepGraphModuleLinkLibrarySet . + */ +CINDEX_LINKAGE size_t clang_experimental_DepGraphModuleLinkLibrarySet_getSize( + CXDepGraphModuleLinkLibrarySet); + +/** + * Retrieve the \c CXDepGraphModuleLinkLibrary instance at index \p Idx from the + * \c CXDepGraphModuleLinkLibrarySet instance. + */ +CINDEX_LINKAGE CXDepGraphModuleLinkLibrary +clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary( + CXDepGraphModuleLinkLibrarySet, size_t Idx); + +/** + * Get the `Library` string from the \c CXDepGraphModuleLinkLibrary instance. + * `Library` could be a library name, or an absolute path to a library or a + * framework, as specified in the corresponding \c CXDepGraphModule instance's + * modulemap. + */ +CINDEX_LINKAGE CXString clang_experimental_DepGraphModuleLinkLibrary_getLibrary( + CXDepGraphModuleLinkLibrary); + +/** + * Returns true if the \c CXDepGraphModuleLinkLibrary is a framework, false + * otherwise. + */ +CINDEX_LINKAGE bool clang_experimental_DepGraphModuleLinkLibrary_isFramework( + CXDepGraphModuleLinkLibrary); + /** * @} */ diff --git a/clang/test/Index/Core/Inputs/module/module.modulemap b/clang/test/Index/Core/Inputs/module/module.modulemap index 180a4aad36dcd..bb3cf022b61ad 100644 --- a/clang/test/Index/Core/Inputs/module/module.modulemap +++ b/clang/test/Index/Core/Inputs/module/module.modulemap @@ -8,4 +8,8 @@ module ModA { header "SubSubModA.h" } } + + link framework "libModA" + link "libModB" + link "/absolute/path/to/a/lib/file" } diff --git a/clang/test/Index/Core/scan-deps-by-mod-name.m b/clang/test/Index/Core/scan-deps-by-mod-name.m index 805c7069029b1..b809352e4fe8f 100644 --- a/clang/test/Index/Core/scan-deps-by-mod-name.m +++ b/clang/test/Index/Core/scan-deps-by-mod-name.m @@ -21,6 +21,10 @@ // CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h +// CHECK-NEXT: link libraries: +// CHECK-NEXT: libModA(framework) +// CHECK-NEXT: libModB +// CHECK-NEXT: /absolute/path/to/a/lib/file // CHECK-NEXT: build-args: {{.*}} -emit-module {{.*}} -fmodule-name=ModA {{.*}} -fno-implicit-modules {{.*}} // CHECK-NEXT: dependencies: // CHECK-NEXT: command 0: diff --git a/clang/test/Index/Core/scan-deps-cas.m b/clang/test/Index/Core/scan-deps-cas.m index cfbf1974b547f..07e737a5864d2 100644 --- a/clang/test/Index/Core/scan-deps-cas.m +++ b/clang/test/Index/Core/scan-deps-cas.m @@ -44,6 +44,10 @@ // CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h +// CHECK-NEXT: link libraries: +// CHECK-NEXT: libModA(framework) +// CHECK-NEXT: libModB +// CHECK-NEXT: /absolute/path/to/a/lib/file // CHECK-NEXT: build-args: // CHECK-SAME: -cc1 // CHECK-SAME: -fcas-path @@ -85,6 +89,10 @@ // INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/ModA.h // INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubModA.h // INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h +// INCLUDE_TREE-NEXT: link libraries: +// INCLUDE_TREE-NEXT: libModA(framework) +// INCLUDE_TREE-NEXT: libModB +// INCLUDE_TREE-NEXT: /absolute/path/to/a/lib/file // INCLUDE_TREE-NEXT: build-args: // INCLUDE_TREE-SAME: -cc1 // INCLUDE_TREE-SAME: -fcas-path diff --git a/clang/test/Index/Core/scan-deps.m b/clang/test/Index/Core/scan-deps.m index f9dd2c4d07152..673863f005ac9 100644 --- a/clang/test/Index/Core/scan-deps.m +++ b/clang/test/Index/Core/scan-deps.m @@ -29,6 +29,10 @@ // CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h // CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h +// CHECK-NEXT: link libraries: +// CHECK-NEXT: libModA(framework) +// CHECK-NEXT: libModB +// CHECK-NEXT: /absolute/path/to/a/lib/file // CHECK-NEXT: build-args: {{.*}} -emit-module {{.*}} -fmodule-name=ModA {{.*}} -fno-implicit-modules {{.*}} // CHECK-NEXT: dependencies: diff --git a/clang/tools/c-index-test/core_main.cpp b/clang/tools/c-index-test/core_main.cpp index 0d24df3a67955..100e708feb721 100644 --- a/clang/tools/c-index-test/core_main.cpp +++ b/clang/tools/c-index-test/core_main.cpp @@ -870,6 +870,25 @@ static int scanDeps(ArrayRef Args, std::string WorkingDirectory, // (mostly) platform-agnostic. if (!StringRef(FileName).ends_with("SDKSettings.json")) llvm::outs() << " " << FileName << "\n"; + CXDepGraphModuleLinkLibrarySet LinkLibs = + clang_experimental_DepGraphModule_getLinkLibrarySet(Mod); + size_t NumLinkLibs = + clang_experimental_DepGraphModuleLinkLibrarySet_getSize(LinkLibs); + if (NumLinkLibs) { + llvm::outs() << " link libraries:\n"; + for (size_t Idx = 0; Idx < NumLinkLibs; Idx++) { + CXDepGraphModuleLinkLibrary Lib = + clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary( + LinkLibs, Idx); + CXString Library = + clang_experimental_DepGraphModuleLinkLibrary_getLibrary(Lib); + bool IsFramework = + clang_experimental_DepGraphModuleLinkLibrary_isFramework(Lib); + const char *IsFrameworkStr = IsFramework ? "(framework)" : ""; + llvm::outs() << " " << clang_getCString(Library) + << IsFrameworkStr << "\n"; + } + } llvm::outs() << " build-args:"; for (const auto &Arg : ArrayRef(BuildArguments.Strings, BuildArguments.Count)) diff --git a/clang/tools/libclang/CDependencies.cpp b/clang/tools/libclang/CDependencies.cpp index fc3ad283a13b1..6f765c281c07d 100644 --- a/clang/tools/libclang/CDependencies.cpp +++ b/clang/tools/libclang/CDependencies.cpp @@ -882,3 +882,45 @@ enum CXErrorCode clang_experimental_DependencyScanner_generateReproducer( "located at:\n " << FileCachePath << "\n " << ReproScriptPath; } + +namespace { +typedef llvm::SmallVectorImpl + DepGraphModuleLinkLibrarySet; +typedef clang::Module::LinkLibrary DepGraphModuleLinkLibrary; +} // namespace + +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrarySet, + CXDepGraphModuleLinkLibrarySet) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrary, + CXDepGraphModuleLinkLibrary) + +CXDepGraphModuleLinkLibrarySet +clang_experimental_DepGraphModule_getLinkLibrarySet(CXDepGraphModule CXDepMod) { + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; + return wrap(&ModDeps.LinkLibraries); +} + +size_t clang_experimental_DepGraphModuleLinkLibrarySet_getSize( + CXDepGraphModuleLinkLibrarySet S) { + const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S); + return LinkLibraries->size(); +} + +CXDepGraphModuleLinkLibrary +clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary( + CXDepGraphModuleLinkLibrarySet S, size_t Idx) { + const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S); + return wrap(&(*LinkLibraries)[Idx]); +} + +CXString clang_experimental_DepGraphModuleLinkLibrary_getLibrary( + CXDepGraphModuleLinkLibrary L) { + const DepGraphModuleLinkLibrary *Lib = unwrap(L); + return cxstring::createRef(Lib->Library.c_str()); +} + +bool clang_experimental_DepGraphModuleLinkLibrary_isFramework( + CXDepGraphModuleLinkLibrary L) { + const DepGraphModuleLinkLibrary *Lib = unwrap(L); + return Lib->IsFramework; +} diff --git a/clang/tools/libclang/libclang.map b/clang/tools/libclang/libclang.map index 21a61c9d9fa28..fabacecab50c9 100644 --- a/clang/tools/libclang/libclang.map +++ b/clang/tools/libclang/libclang.map @@ -597,6 +597,11 @@ LLVM_21 { clang_experimental_DepScanFSCacheOutOfDateEntry_getCachedSize; clang_experimental_DepScanFSCacheOutOfDateEntry_getActualSize; clang_experimental_DepScanFSCacheOutOfDateEntrySet_disposeSet; + clang_experimental_DepGraphModule_getLinkLibrarySet; + clang_experimental_DepGraphModuleLinkLibrarySet_getSize; + clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary; + clang_experimental_DepGraphModuleLinkLibrary_getLibrary; + clang_experimental_DepGraphModuleLinkLibrary_isFramework; }; # Example of how to add a new symbol version entry. If you do add a new symbol