Skip to content

Commit c56cc49

Browse files
authored
[libclang][Dependency Scanning] Implementing C-APIs to Report a Module's Link Libraries (#10994) (#11008)
This PR implements the C-APIs for a client can query a module's link libraries. rdar://154807137 (cherry picked from commit 708340e)
1 parent 78bbaa7 commit c56cc49

File tree

8 files changed

+137
-0
lines changed

8 files changed

+137
-0
lines changed

clang/include/clang-c/Dependencies.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,56 @@ const char *clang_experimental_DepGraph_getTUContextHash(CXDepGraph);
735735
CINDEX_LINKAGE
736736
CXDiagnosticSet clang_experimental_DepGraph_getDiagnostics(CXDepGraph);
737737

738+
/**
739+
* An opaque object that contains a \c CXDepGraphModule 's list of link
740+
* libraries.
741+
*/
742+
typedef struct CXOpaqueDepGraphModuleLinkLibrarySet
743+
*CXDepGraphModuleLinkLibrarySet;
744+
745+
/**
746+
* An opaque object that contains information about a link library.
747+
*/
748+
typedef struct CXOpaqueDepGraphModuleLinkLibrary *CXDepGraphModuleLinkLibrary;
749+
750+
/**
751+
* Get the set of link libraries given a \c CXDepGraphModule instance.
752+
* The returned set is a pointer into memory that the \c CXDepGraphModule
753+
* instance owns. Therefore the set does not need to be disposed.
754+
*/
755+
CINDEX_LINKAGE CXDepGraphModuleLinkLibrarySet
756+
clang_experimental_DepGraphModule_getLinkLibrarySet(CXDepGraphModule);
757+
758+
/**
759+
* Get the size of \c CXDepGraphModuleLinkLibrarySet .
760+
*/
761+
CINDEX_LINKAGE size_t clang_experimental_DepGraphModuleLinkLibrarySet_getSize(
762+
CXDepGraphModuleLinkLibrarySet);
763+
764+
/**
765+
* Retrieve the \c CXDepGraphModuleLinkLibrary instance at index \p Idx from the
766+
* \c CXDepGraphModuleLinkLibrarySet instance.
767+
*/
768+
CINDEX_LINKAGE CXDepGraphModuleLinkLibrary
769+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary(
770+
CXDepGraphModuleLinkLibrarySet, size_t Idx);
771+
772+
/**
773+
* Get the `Library` string from the \c CXDepGraphModuleLinkLibrary instance.
774+
* `Library` could be a library name, or an absolute path to a library or a
775+
* framework, as specified in the corresponding \c CXDepGraphModule instance's
776+
* modulemap.
777+
*/
778+
CINDEX_LINKAGE CXString clang_experimental_DepGraphModuleLinkLibrary_getLibrary(
779+
CXDepGraphModuleLinkLibrary);
780+
781+
/**
782+
* Returns true if the \c CXDepGraphModuleLinkLibrary is a framework, false
783+
* otherwise.
784+
*/
785+
CINDEX_LINKAGE bool clang_experimental_DepGraphModuleLinkLibrary_isFramework(
786+
CXDepGraphModuleLinkLibrary);
787+
738788
/**
739789
* @}
740790
*/

clang/test/Index/Core/Inputs/module/module.modulemap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ module ModA {
88
header "SubSubModA.h"
99
}
1010
}
11+
12+
link framework "libModA"
13+
link "libModB"
14+
link "/absolute/path/to/a/lib/file"
1115
}

clang/test/Index/Core/scan-deps-by-mod-name.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
// CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h
2222
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
2323
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
24+
// CHECK-NEXT: link libraries:
25+
// CHECK-NEXT: libModA(framework)
26+
// CHECK-NEXT: libModB
27+
// CHECK-NEXT: /absolute/path/to/a/lib/file
2428
// CHECK-NEXT: build-args: {{.*}} -emit-module {{.*}} -fmodule-name=ModA {{.*}} -fno-implicit-modules {{.*}}
2529
// CHECK-NEXT: dependencies:
2630
// CHECK-NEXT: command 0:

clang/test/Index/Core/scan-deps-cas.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
// CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h
4242
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
4343
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
44+
// CHECK-NEXT: link libraries:
45+
// CHECK-NEXT: libModA(framework)
46+
// CHECK-NEXT: libModB
47+
// CHECK-NEXT: /absolute/path/to/a/lib/file
4448
// CHECK-NEXT: build-args:
4549
// CHECK-SAME: -cc1
4650
// CHECK-SAME: -fcas-path
@@ -81,6 +85,10 @@
8185
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/ModA.h
8286
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
8387
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
88+
// INCLUDE_TREE-NEXT: link libraries:
89+
// INCLUDE_TREE-NEXT: libModA(framework)
90+
// INCLUDE_TREE-NEXT: libModB
91+
// INCLUDE_TREE-NEXT: /absolute/path/to/a/lib/file
8492
// INCLUDE_TREE-NEXT: build-args:
8593
// INCLUDE_TREE-SAME: -cc1
8694
// INCLUDE_TREE-SAME: -fcas-path

clang/test/Index/Core/scan-deps.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
// CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h
3030
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
3131
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
32+
// CHECK-NEXT: link libraries:
33+
// CHECK-NEXT: libModA(framework)
34+
// CHECK-NEXT: libModB
35+
// CHECK-NEXT: /absolute/path/to/a/lib/file
3236
// CHECK-NEXT: build-args: {{.*}} -emit-module {{.*}} -fmodule-name=ModA {{.*}} -fno-implicit-modules {{.*}}
3337

3438
// CHECK-NEXT: dependencies:

clang/tools/c-index-test/core_main.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,25 @@ static int scanDeps(ArrayRef<const char *> Args, std::string WorkingDirectory,
854854
// (mostly) platform-agnostic.
855855
if (!StringRef(FileName).ends_with("SDKSettings.json"))
856856
llvm::outs() << " " << FileName << "\n";
857+
CXDepGraphModuleLinkLibrarySet LinkLibs =
858+
clang_experimental_DepGraphModule_getLinkLibrarySet(Mod);
859+
size_t NumLinkLibs =
860+
clang_experimental_DepGraphModuleLinkLibrarySet_getSize(LinkLibs);
861+
if (NumLinkLibs) {
862+
llvm::outs() << " link libraries:\n";
863+
for (size_t Idx = 0; Idx < NumLinkLibs; Idx++) {
864+
CXDepGraphModuleLinkLibrary Lib =
865+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary(
866+
LinkLibs, Idx);
867+
CXString Library =
868+
clang_experimental_DepGraphModuleLinkLibrary_getLibrary(Lib);
869+
bool IsFramework =
870+
clang_experimental_DepGraphModuleLinkLibrary_isFramework(Lib);
871+
const char *IsFrameworkStr = IsFramework ? "(framework)" : "";
872+
llvm::outs() << " " << clang_getCString(Library)
873+
<< IsFrameworkStr << "\n";
874+
}
875+
}
857876
llvm::outs() << " build-args:";
858877
for (const auto &Arg :
859878
ArrayRef(BuildArguments.Strings, BuildArguments.Count))

clang/tools/libclang/CDependencies.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,3 +773,46 @@ std::string OutputLookup::lookupModuleOutput(const ModuleDeps &MD,
773773
PCMPath.first->second = ::lookupModuleOutput(MD, MOK, MLOContext, MLO);
774774
return PCMPath.first->second;
775775
}
776+
777+
namespace {
778+
typedef llvm::SmallVectorImpl<clang::Module::LinkLibrary>
779+
DepGraphModuleLinkLibrarySet;
780+
typedef clang::Module::LinkLibrary DepGraphModuleLinkLibrary;
781+
} // namespace
782+
783+
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrarySet,
784+
CXDepGraphModuleLinkLibrarySet)
785+
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrary,
786+
CXDepGraphModuleLinkLibrary)
787+
788+
CXDepGraphModuleLinkLibrarySet
789+
clang_experimental_DepGraphModule_getLinkLibrarySet(CXDepGraphModule CXDepMod) {
790+
const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps;
791+
return wrap(&ModDeps.LinkLibraries);
792+
}
793+
794+
size_t clang_experimental_DepGraphModuleLinkLibrarySet_getSize(
795+
CXDepGraphModuleLinkLibrarySet S) {
796+
const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S);
797+
return LinkLibraries->size();
798+
}
799+
800+
CXDepGraphModuleLinkLibrary
801+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary(
802+
CXDepGraphModuleLinkLibrarySet S, size_t Idx) {
803+
const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S);
804+
return wrap(&(*LinkLibraries)[Idx]);
805+
}
806+
807+
CXString clang_experimental_DepGraphModuleLinkLibrary_getLibrary(
808+
CXDepGraphModuleLinkLibrary L) {
809+
const DepGraphModuleLinkLibrary *Lib = unwrap(L);
810+
return cxstring::createRef(Lib->Library.c_str());
811+
}
812+
813+
bool clang_experimental_DepGraphModuleLinkLibrary_isFramework(
814+
CXDepGraphModuleLinkLibrary L) {
815+
const DepGraphModuleLinkLibrary *Lib = unwrap(L);
816+
return Lib->IsFramework;
817+
}
818+

clang/tools/libclang/libclang.map

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,11 @@ LLVM_21 {
575575
clang_experimental_DependencyScannerServiceOptions_setCWDOptimization;
576576
clang_experimental_DepGraphModule_isCWDIgnored;
577577
clang_experimental_DepGraphModule_isInStableDirs;
578+
clang_experimental_DepGraphModule_getLinkLibrarySet;
579+
clang_experimental_DepGraphModuleLinkLibrarySet_getSize;
580+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary;
581+
clang_experimental_DepGraphModuleLinkLibrary_getLibrary;
582+
clang_experimental_DepGraphModuleLinkLibrary_isFramework;
578583
};
579584

580585
# Example of how to add a new symbol version entry. If you do add a new symbol

0 commit comments

Comments
 (0)