File indexing completed on 2026-05-10 08:36:56
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CLANG_INSTALLAPI_DYLIBVERIFIER_H
0010 #define LLVM_CLANG_INSTALLAPI_DYLIBVERIFIER_H
0011
0012 #include "clang/Basic/Diagnostic.h"
0013 #include "clang/Basic/SourceManager.h"
0014 #include "clang/InstallAPI/MachO.h"
0015
0016 namespace clang {
0017 namespace installapi {
0018 struct FrontendAttrs;
0019
0020
0021 enum class VerificationMode {
0022 Invalid,
0023 ErrorsOnly,
0024 ErrorsAndWarnings,
0025 Pedantic,
0026 };
0027
0028 using LibAttrs = llvm::StringMap<ArchitectureSet>;
0029 using ReexportedInterfaces = llvm::SmallVector<llvm::MachO::InterfaceFile, 8>;
0030
0031
0032
0033
0034 struct ZipperedDeclSource {
0035 const FrontendAttrs *FA;
0036 clang::SourceManager *SrcMgr;
0037 Target T;
0038 };
0039 using ZipperedDeclSources = std::vector<ZipperedDeclSource>;
0040
0041
0042
0043
0044
0045 class DylibVerifier : llvm::MachO::RecordVisitor {
0046 private:
0047 struct SymbolContext;
0048 struct DWARFContext;
0049
0050 public:
0051 enum class Result { NoVerify, Ignore, Valid, Invalid };
0052 struct VerifierContext {
0053
0054 llvm::MachO::Target Target;
0055
0056
0057 RecordsSlice *DylibSlice = nullptr;
0058
0059
0060 Result FrontendState = Result::Ignore;
0061
0062
0063 bool DiscoveredFirstError = false;
0064
0065
0066 bool PrintArch = false;
0067
0068
0069 DiagnosticsEngine *Diag = nullptr;
0070
0071
0072 void emitDiag(llvm::function_ref<void()> Report, RecordLoc *Loc = nullptr);
0073
0074 VerifierContext() = default;
0075 VerifierContext(DiagnosticsEngine *Diag) : Diag(Diag) {}
0076 };
0077
0078 DylibVerifier() = default;
0079
0080 DylibVerifier(llvm::MachO::Records &&Dylib, ReexportedInterfaces &&Reexports,
0081 AliasMap Aliases, DiagnosticsEngine *Diag,
0082 VerificationMode Mode, bool Zippered, bool Demangle,
0083 StringRef DSYMPath)
0084 : Dylib(std::move(Dylib)), Reexports(std::move(Reexports)),
0085 Aliases(std::move(Aliases)), Mode(Mode), Zippered(Zippered),
0086 Demangle(Demangle), DSYMPath(DSYMPath),
0087 Exports(std::make_unique<SymbolSet>()), Ctx(VerifierContext{Diag}) {}
0088
0089 Result verify(GlobalRecord *R, const FrontendAttrs *FA);
0090 Result verify(ObjCInterfaceRecord *R, const FrontendAttrs *FA);
0091 Result verify(ObjCIVarRecord *R, const FrontendAttrs *FA,
0092 const StringRef SuperClass);
0093
0094
0095 Result verifyRemainingSymbols();
0096
0097
0098
0099 bool verifyBinaryAttrs(const ArrayRef<Target> ProvidedTargets,
0100 const BinaryAttrs &ProvidedBA,
0101 const LibAttrs &ProvidedReexports,
0102 const LibAttrs &ProvidedClients,
0103 const LibAttrs &ProvidedRPaths, const FileType &FT);
0104
0105
0106 void setTarget(const Target &T);
0107
0108
0109 std::unique_ptr<SymbolSet> takeExports();
0110
0111
0112 Result getState() const { return Ctx.FrontendState; }
0113
0114
0115 void setSourceManager(IntrusiveRefCntPtr<SourceManager> SourceMgr);
0116
0117 private:
0118
0119 bool canVerify();
0120
0121
0122 Result verifyImpl(Record *R, SymbolContext &SymCtx);
0123
0124
0125
0126 bool shouldIgnoreObsolete(const Record *R, SymbolContext &SymCtx,
0127 const Record *DR);
0128
0129
0130
0131 bool shouldIgnoreReexport(const Record *R, SymbolContext &SymCtx) const;
0132
0133
0134 bool shouldIgnoreZipperedAvailability(const Record *R, SymbolContext &SymCtx);
0135
0136
0137
0138
0139 bool shouldIgnoreInternalZipperedSymbol(const Record *R,
0140 const SymbolContext &SymCtx) const;
0141
0142
0143
0144 Result compareVisibility(const Record *R, SymbolContext &SymCtx,
0145 const Record *DR);
0146
0147
0148
0149 bool compareObjCInterfaceSymbols(const Record *R, SymbolContext &SymCtx,
0150 const ObjCInterfaceRecord *DR);
0151
0152
0153 Result compareAvailability(const Record *R, SymbolContext &SymCtx,
0154 const Record *DR);
0155
0156
0157 bool compareSymbolFlags(const Record *R, SymbolContext &SymCtx,
0158 const Record *DR);
0159
0160
0161 void updateState(Result State);
0162
0163
0164 void addSymbol(const Record *R, SymbolContext &SymCtx,
0165 TargetList &&Targets = {});
0166
0167
0168 void assignSlice(const Target &T);
0169
0170
0171 void visitSymbolInDylib(const Record &R, SymbolContext &SymCtx);
0172
0173 void visitGlobal(const GlobalRecord &R) override;
0174 void visitObjCInterface(const ObjCInterfaceRecord &R) override;
0175 void visitObjCCategory(const ObjCCategoryRecord &R) override;
0176 void visitObjCIVar(const ObjCIVarRecord &R, const StringRef Super);
0177
0178
0179 std::string getAnnotatedName(const Record *R, SymbolContext &SymCtx,
0180 bool ValidSourceLoc = true);
0181
0182
0183
0184
0185
0186 void accumulateSrcLocForDylibSymbols();
0187
0188
0189 llvm::MachO::Records Dylib;
0190
0191
0192 ReexportedInterfaces Reexports;
0193
0194
0195 AliasMap Aliases;
0196
0197
0198 VerificationMode Mode = VerificationMode::Invalid;
0199
0200
0201 bool Zippered = false;
0202
0203
0204 bool Demangle = false;
0205
0206
0207 StringRef DSYMPath;
0208
0209
0210 std::unique_ptr<SymbolSet> Exports = std::make_unique<SymbolSet>();
0211
0212
0213
0214 llvm::StringMap<ZipperedDeclSources> DeferredZipperedSymbols;
0215
0216
0217 VerifierContext Ctx;
0218
0219
0220 DWARFContext *DWARFCtx = nullptr;
0221
0222
0223 llvm::SmallVector<IntrusiveRefCntPtr<SourceManager>, 12> SourceManagers;
0224 };
0225
0226 }
0227 }
0228 #endif