1 | //===- InstallAPI/Context.h -------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_CLANG_INSTALLAPI_CONTEXT_H |
10 | #define LLVM_CLANG_INSTALLAPI_CONTEXT_H |
11 | |
12 | #include "clang/Basic/Diagnostic.h" |
13 | #include "clang/Basic/FileManager.h" |
14 | #include "clang/InstallAPI/DylibVerifier.h" |
15 | #include "clang/InstallAPI/HeaderFile.h" |
16 | #include "clang/InstallAPI/MachO.h" |
17 | #include "llvm/ADT/DenseMap.h" |
18 | |
19 | namespace clang { |
20 | namespace installapi { |
21 | class FrontendRecordsSlice; |
22 | |
23 | /// Struct used for generating validating InstallAPI. |
24 | /// The attributes captured represent all necessary information |
25 | /// to generate TextAPI output. |
26 | struct InstallAPIContext { |
27 | |
28 | /// Library attributes that are typically passed as linker inputs. |
29 | BinaryAttrs BA; |
30 | |
31 | /// Install names of reexported libraries of a library. |
32 | LibAttrs Reexports; |
33 | |
34 | /// All headers that represent a library. |
35 | HeaderSeq ; |
36 | |
37 | /// Active language mode to parse in. |
38 | Language LangMode = Language::ObjC; |
39 | |
40 | /// Active header access type. |
41 | HeaderType Type = HeaderType::Unknown; |
42 | |
43 | /// Active TargetSlice for symbol record collection. |
44 | std::shared_ptr<FrontendRecordsSlice> Slice; |
45 | |
46 | /// FileManager for all I/O operations. |
47 | FileManager *FM = nullptr; |
48 | |
49 | /// DiagnosticsEngine for all error reporting. |
50 | DiagnosticsEngine *Diags = nullptr; |
51 | |
52 | /// Verifier when binary dylib is passed as input. |
53 | std::unique_ptr<DylibVerifier> Verifier = nullptr; |
54 | |
55 | /// File Path of output location. |
56 | llvm::StringRef OutputLoc{}; |
57 | |
58 | /// What encoding to write output as. |
59 | FileType FT = FileType::TBD_V5; |
60 | |
61 | /// Populate entries of headers that should be included for TextAPI |
62 | /// generation. |
63 | void (const HeaderFile &H); |
64 | |
65 | /// Record visited files during frontend actions to determine whether to |
66 | /// include their declarations for TextAPI generation. |
67 | /// |
68 | /// \param FE Header that is being parsed. |
69 | /// \param PP Preprocesser used for querying how header was imported. |
70 | /// \return Access level of header if it should be included for TextAPI |
71 | /// generation. |
72 | std::optional<HeaderType> findAndRecordFile(const FileEntry *FE, |
73 | const Preprocessor &PP); |
74 | |
75 | private: |
76 | using = llvm::DenseMap<const FileEntry *, HeaderType>; |
77 | |
78 | // Collection of parsed header files and their access level. If set to |
79 | // HeaderType::Unknown, they are not used for TextAPI generation. |
80 | HeaderMap KnownFiles; |
81 | |
82 | // Collection of expected header includes and the access level for them. |
83 | llvm::DenseMap<StringRef, HeaderType> KnownIncludes; |
84 | }; |
85 | |
86 | /// Lookup the dylib or TextAPI file location for a system library or framework. |
87 | /// The search paths provided are searched in order. |
88 | /// @rpath based libraries are not supported. |
89 | /// |
90 | /// \param InstallName The install name for the library. |
91 | /// \param FrameworkSearchPaths Search paths to look up frameworks with. |
92 | /// \param LibrarySearchPaths Search paths to look up dylibs with. |
93 | /// \param SearchPaths Fallback search paths if library was not found in earlier |
94 | /// paths. |
95 | /// \return The full path of the library. |
96 | std::string findLibrary(StringRef InstallName, FileManager &FM, |
97 | ArrayRef<std::string> FrameworkSearchPaths, |
98 | ArrayRef<std::string> LibrarySearchPaths, |
99 | ArrayRef<std::string> SearchPaths); |
100 | } // namespace installapi |
101 | } // namespace clang |
102 | |
103 | #endif // LLVM_CLANG_INSTALLAPI_CONTEXT_H |
104 | |