Skip to content

Commit 708340e

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

File tree

8 files changed

+136
-0
lines changed

8 files changed

+136
-0
lines changed

clang/include/clang-c/Dependencies.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,56 @@ CINDEX_LINKAGE enum CXErrorCode
737737
clang_experimental_DependencyScanner_generateReproducer(
738738
CXDependencyScannerReproducerOptions CXOptions, CXString *MessageOut);
739739

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

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
@@ -44,6 +44,10 @@
4444
// CHECK-NEXT: [[PREFIX]]/Inputs/module/ModA.h
4545
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
4646
// CHECK-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
47+
// CHECK-NEXT: link libraries:
48+
// CHECK-NEXT: libModA(framework)
49+
// CHECK-NEXT: libModB
50+
// CHECK-NEXT: /absolute/path/to/a/lib/file
4751
// CHECK-NEXT: build-args:
4852
// CHECK-SAME: -cc1
4953
// CHECK-SAME: -fcas-path
@@ -85,6 +89,10 @@
8589
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/ModA.h
8690
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubModA.h
8791
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/SubSubModA.h
92+
// INCLUDE_TREE-NEXT: link libraries:
93+
// INCLUDE_TREE-NEXT: libModA(framework)
94+
// INCLUDE_TREE-NEXT: libModB
95+
// INCLUDE_TREE-NEXT: /absolute/path/to/a/lib/file
8896
// INCLUDE_TREE-NEXT: build-args:
8997
// INCLUDE_TREE-SAME: -cc1
9098
// 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
@@ -870,6 +870,25 @@ static int scanDeps(ArrayRef<const char *> Args, std::string WorkingDirectory,
870870
// (mostly) platform-agnostic.
871871
if (!StringRef(FileName).ends_with("SDKSettings.json"))
872872
llvm::outs() << " " << FileName << "\n";
873+
CXDepGraphModuleLinkLibrarySet LinkLibs =
874+
clang_experimental_DepGraphModule_getLinkLibrarySet(Mod);
875+
size_t NumLinkLibs =
876+
clang_experimental_DepGraphModuleLinkLibrarySet_getSize(LinkLibs);
877+
if (NumLinkLibs) {
878+
llvm::outs() << " link libraries:\n";
879+
for (size_t Idx = 0; Idx < NumLinkLibs; Idx++) {
880+
CXDepGraphModuleLinkLibrary Lib =
881+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary(
882+
LinkLibs, Idx);
883+
CXString Library =
884+
clang_experimental_DepGraphModuleLinkLibrary_getLibrary(Lib);
885+
bool IsFramework =
886+
clang_experimental_DepGraphModuleLinkLibrary_isFramework(Lib);
887+
const char *IsFrameworkStr = IsFramework ? "(framework)" : "";
888+
llvm::outs() << " " << clang_getCString(Library)
889+
<< IsFrameworkStr << "\n";
890+
}
891+
}
873892
llvm::outs() << " build-args:";
874893
for (const auto &Arg :
875894
ArrayRef(BuildArguments.Strings, BuildArguments.Count))

clang/tools/libclang/CDependencies.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,3 +882,45 @@ enum CXErrorCode clang_experimental_DependencyScanner_generateReproducer(
882882
"located at:\n "
883883
<< FileCachePath << "\n " << ReproScriptPath;
884884
}
885+
886+
namespace {
887+
typedef llvm::SmallVectorImpl<clang::Module::LinkLibrary>
888+
DepGraphModuleLinkLibrarySet;
889+
typedef clang::Module::LinkLibrary DepGraphModuleLinkLibrary;
890+
} // namespace
891+
892+
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrarySet,
893+
CXDepGraphModuleLinkLibrarySet)
894+
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DepGraphModuleLinkLibrary,
895+
CXDepGraphModuleLinkLibrary)
896+
897+
CXDepGraphModuleLinkLibrarySet
898+
clang_experimental_DepGraphModule_getLinkLibrarySet(CXDepGraphModule CXDepMod) {
899+
const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps;
900+
return wrap(&ModDeps.LinkLibraries);
901+
}
902+
903+
size_t clang_experimental_DepGraphModuleLinkLibrarySet_getSize(
904+
CXDepGraphModuleLinkLibrarySet S) {
905+
const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S);
906+
return LinkLibraries->size();
907+
}
908+
909+
CXDepGraphModuleLinkLibrary
910+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary(
911+
CXDepGraphModuleLinkLibrarySet S, size_t Idx) {
912+
const DepGraphModuleLinkLibrarySet *LinkLibraries = unwrap(S);
913+
return wrap(&(*LinkLibraries)[Idx]);
914+
}
915+
916+
CXString clang_experimental_DepGraphModuleLinkLibrary_getLibrary(
917+
CXDepGraphModuleLinkLibrary L) {
918+
const DepGraphModuleLinkLibrary *Lib = unwrap(L);
919+
return cxstring::createRef(Lib->Library.c_str());
920+
}
921+
922+
bool clang_experimental_DepGraphModuleLinkLibrary_isFramework(
923+
CXDepGraphModuleLinkLibrary L) {
924+
const DepGraphModuleLinkLibrary *Lib = unwrap(L);
925+
return Lib->IsFramework;
926+
}

clang/tools/libclang/libclang.map

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,11 @@ LLVM_21 {
597597
clang_experimental_DepScanFSCacheOutOfDateEntry_getCachedSize;
598598
clang_experimental_DepScanFSCacheOutOfDateEntry_getActualSize;
599599
clang_experimental_DepScanFSCacheOutOfDateEntrySet_disposeSet;
600+
clang_experimental_DepGraphModule_getLinkLibrarySet;
601+
clang_experimental_DepGraphModuleLinkLibrarySet_getSize;
602+
clang_experimental_DepGraphModuleLinkLibrarySet_getLinkLibrary;
603+
clang_experimental_DepGraphModuleLinkLibrary_getLibrary;
604+
clang_experimental_DepGraphModuleLinkLibrary_isFramework;
600605
};
601606

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

0 commit comments

Comments
 (0)