13#include "llvm/Demangle/Demangle.h"
14#include "llvm/TextAPI/DylibReader.h"
22 auto *It = llvm::find_if(LibraryAttributes, [&
Attr](
const auto &Input) {
23 return Attr == Input.first;
25 if (It != LibraryAttributes.end())
28 return LibraryAttributes.back().second;
32 auto *It = llvm::find_if(LibraryAttributes, [&
Attr](
const auto &Input) {
33 return Attr == Input.first;
35 if (It == LibraryAttributes.end())
69 return (Name.starts_with(
"_Z") || Name.starts_with(
"__Z") ||
70 Name.starts_with(
"___Z"));
77 char *
Result = llvm::itaniumDemangle(Name);
81 std::string Demangled(
Result);
86std::string DylibVerifier::getAnnotatedName(
const Record *R,
87 SymbolContext &SymCtx,
88 bool ValidSourceLoc) {
89 assert(!SymCtx.SymbolName.empty() &&
"Expected symbol name");
91 const StringRef SymbolName = SymCtx.SymbolName;
92 std::string PrettyName =
93 (Demangle && (SymCtx.Kind == EncodeKind::GlobalSymbol))
97 std::string Annotation;
98 if (R->isWeakDefined())
99 Annotation +=
"(weak-def) ";
100 if (R->isWeakReferenced())
101 Annotation +=
"(weak-ref) ";
102 if (R->isThreadLocalValue())
103 Annotation +=
"(tlv) ";
106 switch (SymCtx.ObjCIFKind) {
109 case ObjCIFSymbolKind::EHType:
110 return Annotation +
"Exception Type of " + PrettyName;
111 case ObjCIFSymbolKind::MetaClass:
112 return Annotation +
"Metaclass of " + PrettyName;
113 case ObjCIFSymbolKind::Class:
114 return Annotation +
"Class of " + PrettyName;
120 if (ValidSourceLoc) {
121 StringRef PrettyNameRef(PrettyName);
122 if ((SymCtx.Kind == EncodeKind::GlobalSymbol) &&
123 !
isCppMangled(SymbolName) && PrettyNameRef.starts_with(
"_"))
124 return Annotation + PrettyNameRef.drop_front(1).str();
125 return Annotation + PrettyName;
128 switch (SymCtx.Kind) {
129 case EncodeKind::GlobalSymbol:
130 return Annotation + PrettyName;
131 case EncodeKind::ObjectiveCInstanceVariable:
132 return Annotation +
"(ObjC IVar) " + PrettyName;
133 case EncodeKind::ObjectiveCClass:
134 return Annotation +
"(ObjC Class) " + PrettyName;
135 case EncodeKind::ObjectiveCClassEHType:
136 return Annotation +
"(ObjC Class EH) " + PrettyName;
139 llvm_unreachable(
"unexpected case for EncodeKind");
164 if (
const VarDecl *VD = cast<VarDecl>(
D))
173 case EncodeKind::GlobalSymbol:
174 return Slice->findGlobal(Name);
175 case EncodeKind::ObjectiveCInstanceVariable:
176 return Slice->findObjCIVar(Name.contains(
'.'), Name);
177 case EncodeKind::ObjectiveCClass:
178 case EncodeKind::ObjectiveCClassEHType:
179 return Slice->findObjCInterface(Name);
181 llvm_unreachable(
"unexpected end when finding record");
184void DylibVerifier::updateState(
Result State) {
188void DylibVerifier::addSymbol(
const Record *R, SymbolContext &SymCtx,
193 Exports->addGlobal(SymCtx.Kind, SymCtx.SymbolName, R->getFlags(), Targets);
196bool DylibVerifier::shouldIgnoreObsolete(
const Record *R, SymbolContext &SymCtx,
198 if (!SymCtx.FA->Avail.isObsoleted())
202 DeferredZipperedSymbols[SymCtx.SymbolName].emplace_back(ZipperedDeclSource{
207bool DylibVerifier::shouldIgnoreReexport(
const Record *R,
208 SymbolContext &SymCtx)
const {
209 StringRef SymName = SymCtx.SymbolName;
211 if (SymName.starts_with(
"$ld$"))
214 if (Reexports.empty())
218 if (!Lib.hasTarget(Ctx.
Target))
220 if (
auto Sym = Lib.getSymbol(SymCtx.Kind, SymName, SymCtx.ObjCIFKind))
221 if ((*Sym)->hasTarget(Ctx.
Target))
227bool DylibVerifier::shouldIgnoreInternalZipperedSymbol(
228 const Record *R,
const SymbolContext &SymCtx)
const {
232 return Exports->findSymbol(SymCtx.Kind, SymCtx.SymbolName,
233 SymCtx.ObjCIFKind) !=
nullptr;
236bool DylibVerifier::shouldIgnoreZipperedAvailability(
const Record *R,
237 SymbolContext &SymCtx) {
238 if (!(Zippered && SymCtx.FA->Avail.isUnavailable()))
243 DeferredZipperedSymbols[SymCtx.SymbolName].emplace_back(
244 ZipperedDeclSource{SymCtx.FA, SourceManagers.back().get(), Ctx.
Target});
249bool DylibVerifier::compareObjCInterfaceSymbols(
const Record *R,
250 SymbolContext &SymCtx,
252 const bool IsDeclVersionComplete =
253 ((SymCtx.ObjCIFKind & ObjCIFSymbolKind::Class) ==
254 ObjCIFSymbolKind::Class) &&
255 ((SymCtx.ObjCIFKind & ObjCIFSymbolKind::MetaClass) ==
256 ObjCIFSymbolKind::MetaClass);
258 const bool IsDylibVersionComplete = DR->isCompleteInterface();
261 if (IsDeclVersionComplete && IsDylibVersionComplete)
264 auto PrintDiagnostic = [&](
auto SymLinkage,
const Record *
Record,
265 StringRef SymName,
bool PrintAsWarning =
false) {
266 if (SymLinkage == RecordLinkage::Unknown)
268 Ctx.
Diag->
Report(SymCtx.FA->Loc, PrintAsWarning
269 ? diag::warn_library_missing_symbol
270 : diag::err_library_missing_symbol)
275 Ctx.
Diag->
Report(SymCtx.FA->Loc, PrintAsWarning
276 ? diag::warn_library_hidden_symbol
277 : diag::err_library_hidden_symbol)
282 if (IsDeclVersionComplete) {
286 if (!DR->isExportedSymbol(ObjCIFSymbolKind::Class)) {
287 SymCtx.ObjCIFKind = ObjCIFSymbolKind::Class;
288 PrintDiagnostic(DR->getLinkageForSymbol(ObjCIFSymbolKind::Class), R,
289 getAnnotatedName(R, SymCtx),
292 if (!DR->isExportedSymbol(ObjCIFSymbolKind::MetaClass)) {
293 SymCtx.ObjCIFKind = ObjCIFSymbolKind::MetaClass;
294 PrintDiagnostic(DR->getLinkageForSymbol(ObjCIFSymbolKind::MetaClass), R,
295 getAnnotatedName(R, SymCtx),
301 if (DR->isExportedSymbol(SymCtx.ObjCIFKind)) {
302 if (!IsDylibVersionComplete) {
304 SymCtx.Kind = EncodeKind::GlobalSymbol;
305 SymCtx.SymbolName = R->getName();
312 PrintDiagnostic(DR->getLinkageForSymbol(SymCtx.ObjCIFKind), R,
318 SymbolContext &SymCtx,
321 if (R->isExported()) {
324 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_library_missing_symbol)
325 << getAnnotatedName(R, SymCtx);
329 if (DR->isInternal()) {
331 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_library_hidden_symbol)
332 << getAnnotatedName(R, SymCtx);
340 if ((R->isInternal() && !SymCtx.Inlined) && DR && DR->isExported()) {
348 if (shouldIgnoreInternalZipperedSymbol(R, SymCtx))
354 ID = diag::warn_header_hidden_symbol;
357 ID = diag::err_header_hidden_symbol;
361 Ctx.
Diag->
Report(SymCtx.FA->Loc, ID) << getAnnotatedName(R, SymCtx);
373 SymbolContext &SymCtx,
375 if (!SymCtx.FA->Avail.isUnavailable())
378 if (shouldIgnoreZipperedAvailability(R, SymCtx))
381 const bool IsDeclAvailable = SymCtx.FA->Avail.isUnavailable();
386 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::warn_header_availability_mismatch)
387 << getAnnotatedName(R, SymCtx) << IsDeclAvailable << IsDeclAvailable;
392 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_availability_mismatch)
393 << getAnnotatedName(R, SymCtx) << IsDeclAvailable << IsDeclAvailable;
399 llvm_unreachable(
"Unexpected verification mode symbol verification");
401 llvm_unreachable(
"Unexpected verification mode symbol verification");
404bool DylibVerifier::compareSymbolFlags(
const Record *R, SymbolContext &SymCtx,
406 if (DR->isThreadLocalValue() && !R->isThreadLocalValue()) {
408 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_dylib_symbol_flags_mismatch)
409 << getAnnotatedName(DR, SymCtx) << DR->isThreadLocalValue();
413 if (!DR->isThreadLocalValue() && R->isThreadLocalValue()) {
415 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_symbol_flags_mismatch)
416 << getAnnotatedName(R, SymCtx) << R->isThreadLocalValue();
421 if (DR->isWeakDefined() && !R->isWeakDefined()) {
423 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_dylib_symbol_flags_mismatch)
424 << getAnnotatedName(DR, SymCtx) << R->isWeakDefined();
428 if (!DR->isWeakDefined() && R->isWeakDefined()) {
430 Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_symbol_flags_mismatch)
431 << getAnnotatedName(R, SymCtx) << R->isWeakDefined();
440 SymbolContext &SymCtx) {
444 if (R->isExported() && !SymCtx.FA->Avail.isUnavailable() &&
445 !SymCtx.FA->Avail.isObsoleted()) {
446 addSymbol(R, SymCtx);
451 if (shouldIgnoreReexport(R, SymCtx)) {
461 if (shouldIgnoreObsolete(R, SymCtx, DR)) {
467 if (SymCtx.FA->Avail.isUnavailable() && (!DR || DR->isInternal())) {
472 Result VisibilityCheck = compareVisibility(R, SymCtx, DR);
474 updateState(VisibilityCheck);
485 if (SymCtx.ObjCIFKind != ObjCIFSymbolKind::None) {
486 if (!compareObjCInterfaceSymbols(
487 R, SymCtx, Ctx.
DylibSlice->findObjCInterface(DR->getName()))) {
493 Result AvailabilityCheck = compareAvailability(R, SymCtx, DR);
495 updateState(AvailabilityCheck);
499 if (!compareSymbolFlags(R, SymCtx, DR)) {
504 addSymbol(R, SymCtx);
509bool DylibVerifier::canVerify() {
513void DylibVerifier::assignSlice(
const Target &
T) {
514 assert(
T == Ctx.
Target &&
"Active targets should match.");
521 Dylib, [&
T](
const auto &Slice) {
return T == Slice->getTarget(); });
523 assert(It != Dylib.end() &&
"Target slice should always exist.");
542 SourceManagers.push_back(std::move(SourceMgr));
548 const StringRef SuperClass) {
553 ObjCIVarRecord::createScopedName(SuperClass, R->getName());
555 return verifyImpl(R, SymCtx);
560 if (R->getLinkageForSymbol(ObjCIFSymbolKind::Class) != RecordLinkage::Unknown)
561 Result |= ObjCIFSymbolKind::Class;
562 if (R->getLinkageForSymbol(ObjCIFSymbolKind::MetaClass) !=
563 RecordLinkage::Unknown)
564 Result |= ObjCIFSymbolKind::MetaClass;
565 if (R->getLinkageForSymbol(ObjCIFSymbolKind::EHType) !=
566 RecordLinkage::Unknown)
567 Result |= ObjCIFSymbolKind::EHType;
579 SymCtx.
Kind = R->hasExceptionAttribute() ? EncodeKind::ObjectiveCClassEHType
580 : EncodeKind::ObjectiveCClass;
583 return verifyImpl(R, SymCtx);
595 SymCtx.
Kind = Sym.Kind;
597 SymCtx.
Inlined = R->isInlined();
598 return verifyImpl(R, SymCtx);
606 : getTargetTripleName(
Target));
609 if (
Loc &&
Loc->isValid())
610 llvm::errs() <<
Loc->File <<
":" <<
Loc->Line <<
":" << 0 <<
": ";
622 (Name.starts_with(
"__ZTI") || Name.starts_with(
"__ZTS")));
624void DylibVerifier::visitSymbolInDylib(
const Record &R, SymbolContext &SymCtx) {
626 if (R.isUndefined()) {
632 if (R.isInternal()) {
639 const StringRef SymbolName(SymCtx.SymbolName);
640 if (
const Symbol *Sym = Exports->findSymbol(SymCtx.Kind, SymCtx.SymbolName,
641 SymCtx.ObjCIFKind)) {
642 if (Sym->hasArchitecture(Ctx.
Target.Arch)) {
648 const bool IsLinkerSymbol = SymbolName.starts_with(
"$ld$");
650 if (R.isVerified()) {
654 auto It = DeferredZipperedSymbols.find(SymCtx.SymbolName);
655 if (It == DeferredZipperedSymbols.end()) {
661 for (
const ZipperedDeclSource &ZSource : It->second) {
662 if (ZSource.FA->Avail.isObsoleted()) {
666 if (ZSource.T.Arch != Ctx.
Target.Arch)
668 Locs.emplace_back(ZSource);
670 assert(Locs.size() == 2 &&
"Expected two decls for zippered symbol");
673 for (
const ZipperedDeclSource &ZSource : Locs) {
677 DiagID = diag::err_header_availability_mismatch;
680 DiagID = diag::warn_header_availability_mismatch;
687 Ctx.
Diag->
Report(diag::warn_target) << getTargetTripleName(ZSource.T);
689 << getAnnotatedName(&R, SymCtx) << ZSource.FA->Avail.isUnavailable()
690 << ZSource.FA->Avail.isUnavailable();
700 if (Aliases.count({SymbolName.str(), SymCtx.Kind})) {
709 accumulateSrcLocForDylibSymbols();
714 if (IsLinkerSymbol) {
717 Ctx.
Diag->
Report(diag::err_header_symbol_missing)
718 << getAnnotatedName(&R, SymCtx,
Loc.isValid());
729 Ctx.
Diag->
Report(diag::err_header_symbol_missing)
730 << getAnnotatedName(&R, SymCtx,
Loc.isValid());
742 Ctx.
Diag->
Report(diag::warn_header_symbol_missing)
743 << getAnnotatedName(&R, SymCtx,
Loc.isValid());
756 SymbolContext SymCtx;
758 SymCtx.SymbolName = Sym.Name;
759 SymCtx.Kind = Sym.Kind;
760 visitSymbolInDylib(R, SymCtx);
764 const StringRef Super) {
765 SymbolContext SymCtx;
766 SymCtx.SymbolName = ObjCIVarRecord::createScopedName(Super, R.getName());
767 SymCtx.Kind = EncodeKind::ObjectiveCInstanceVariable;
768 visitSymbolInDylib(R, SymCtx);
771void DylibVerifier::accumulateSrcLocForDylibSymbols() {
772 if (DSYMPath.empty())
775 assert(DWARFCtx !=
nullptr &&
"Expected an initialized DWARFContext");
780 DylibReader::accumulateSourceLocFromDSYM(DSYMPath, Ctx.
Target);
784 SymbolContext SymCtx;
785 SymCtx.SymbolName = R.getName();
787 if (SymCtx.ObjCIFKind > ObjCIFSymbolKind::EHType) {
788 if (R.hasExceptionAttribute()) {
789 SymCtx.Kind = EncodeKind::ObjectiveCClassEHType;
790 visitSymbolInDylib(R, SymCtx);
792 SymCtx.Kind = EncodeKind::ObjectiveCClass;
793 visitSymbolInDylib(R, SymCtx);
795 SymCtx.Kind = R.hasExceptionAttribute() ? EncodeKind::ObjectiveCClassEHType
796 : EncodeKind::ObjectiveCClass;
797 visitSymbolInDylib(R, SymCtx);
801 visitObjCIVar(*IV, R.getName());
806 visitObjCIVar(*IV, R.getSuperClassName());
812 assert(!Dylib.empty() &&
"No binary to verify against");
815 DWARFCtx = &DWARFInfo;
816 Ctx.
Target =
Target(Architecture::AK_unknown, PlatformType::PLATFORM_UNKNOWN);
817 for (std::shared_ptr<RecordsSlice> Slice : Dylib) {
818 if (Ctx.
Target.Arch == Slice->getTarget().Arch)
822 Ctx.
Target = Slice->getTarget();
835 assert(!Dylib.empty() &&
"Need dylib to verify.");
842 for (
const std::shared_ptr<RecordsSlice> &RS : Dylib) {
843 DylibTargets.push_back(RS->getTarget());
845 for (
const StringRef LibName : BinInfo.RexportedLibraries)
846 DylibReexports.
getArchSet(LibName).set(DylibTargets.back().Arch);
847 for (
const StringRef LibName : BinInfo.AllowableClients)
848 DylibClients.
getArchSet(LibName).set(DylibTargets.back().Arch);
850 if (FT >= FileType::TBD_V5)
851 for (
const StringRef Name : BinInfo.RPaths)
852 DylibRPaths.
getArchSet(Name).set(DylibTargets.back().Arch);
858 if (ProvidedArchs != DylibArchs) {
859 Ctx.
Diag->
Report(diag::err_architecture_mismatch)
860 << ProvidedArchs << DylibArchs;
863 auto ProvidedPlatforms = mapToPlatformVersionSet(ProvidedTargets);
864 auto DylibPlatforms = mapToPlatformVersionSet(DylibTargets);
865 if (ProvidedPlatforms != DylibPlatforms) {
866 const bool DiffMinOS =
867 mapToPlatformSet(ProvidedTargets) == mapToPlatformSet(DylibTargets);
869 Ctx.
Diag->
Report(diag::warn_platform_mismatch)
870 << ProvidedPlatforms << DylibPlatforms;
873 << ProvidedPlatforms << DylibPlatforms;
880 const BinaryAttrs &DylibBA = (*Dylib.begin())->getBinaryAttrs();
882 if (ProvidedBA.InstallName != DylibBA.InstallName) {
883 Ctx.
Diag->
Report(diag::err_install_name_mismatch)
884 << ProvidedBA.InstallName << DylibBA.InstallName;
888 if (ProvidedBA.CurrentVersion != DylibBA.CurrentVersion) {
889 Ctx.
Diag->
Report(diag::err_current_version_mismatch)
890 << ProvidedBA.CurrentVersion << DylibBA.CurrentVersion;
894 if (ProvidedBA.CompatVersion != DylibBA.CompatVersion) {
895 Ctx.
Diag->
Report(diag::err_compatibility_version_mismatch)
896 << ProvidedBA.CompatVersion << DylibBA.CompatVersion;
900 if (ProvidedBA.AppExtensionSafe != DylibBA.AppExtensionSafe) {
901 Ctx.
Diag->
Report(diag::err_appextension_safe_mismatch)
902 << (ProvidedBA.AppExtensionSafe ?
"true" :
"false")
903 << (DylibBA.AppExtensionSafe ?
"true" :
"false");
907 if (!DylibBA.TwoLevelNamespace) {
908 Ctx.
Diag->
Report(diag::err_no_twolevel_namespace);
912 if (ProvidedBA.OSLibNotForSharedCache != DylibBA.OSLibNotForSharedCache) {
913 Ctx.
Diag->
Report(diag::err_shared_cache_eligiblity_mismatch)
914 << (ProvidedBA.OSLibNotForSharedCache ?
"true" :
"false")
915 << (DylibBA.OSLibNotForSharedCache ?
"true" :
"false");
919 if (ProvidedBA.ParentUmbrella.empty() && !DylibBA.ParentUmbrella.empty()) {
920 Ctx.
Diag->
Report(diag::err_parent_umbrella_missing)
921 <<
"installAPI option" << DylibBA.ParentUmbrella;
925 if (!ProvidedBA.ParentUmbrella.empty() && DylibBA.ParentUmbrella.empty()) {
926 Ctx.
Diag->
Report(diag::err_parent_umbrella_missing)
927 <<
"binary file" << ProvidedBA.ParentUmbrella;
931 if ((!ProvidedBA.ParentUmbrella.empty()) &&
932 (ProvidedBA.ParentUmbrella != DylibBA.ParentUmbrella)) {
933 Ctx.
Diag->
Report(diag::err_parent_umbrella_mismatch)
934 << ProvidedBA.ParentUmbrella << DylibBA.ParentUmbrella;
938 auto CompareLibraries = [&](
const LibAttrs &Provided,
const LibAttrs &Dylib,
939 unsigned DiagID_missing,
unsigned DiagID_mismatch,
941 if (Provided == Dylib)
945 const auto &[PAttr, PArchSet] = PEntry;
946 auto DAttrEntry = Dylib.find(PAttr);
948 Ctx.
Diag->
Report(DiagID_missing) <<
"binary file" << PEntry;
953 if (PArchSet != DAttrEntry->second) {
954 Ctx.
Diag->
Report(DiagID_mismatch) << PEntry << *DAttrEntry;
961 const auto &[DAttr, DArchSet] = DEntry;
962 const auto &PAttrEntry = Provided.
find(DAttr);
964 Ctx.
Diag->
Report(DiagID_missing) <<
"installAPI option" << DEntry;
970 if (PAttrEntry->second != DArchSet) {
972 llvm_unreachable(
"this case was already covered above.");
978 if (!CompareLibraries(ProvidedReexports, DylibReexports,
979 diag::err_reexported_libraries_missing,
980 diag::err_reexported_libraries_mismatch))
983 if (!CompareLibraries(ProvidedClients, DylibClients,
984 diag::err_allowable_clients_missing,
985 diag::err_allowable_clients_mismatch))
988 if (FT >= FileType::TBD_V5) {
993 if (!ProvidedBA.InstallName.ends_with(
"_asan")) {
994 if (!CompareLibraries(ProvidedRPaths, DylibRPaths,
995 diag::warn_rpaths_missing,
996 diag::warn_rpaths_mismatch,
1006 for (
const auto &[Alias,
Base] : Aliases) {
1009 if (
const Symbol *Sym = Exports->findSymbol(
Base.second,
Base.first)) {
1010 Flags = Sym->getFlags();
1011 Targets = {Sym->targets().begin(), Sym->targets().end()};
1014 Record R(Alias.first, RecordLinkage::Exported, Flags);
1017 SymCtx.
Kind = Alias.second;
1018 addSymbol(&R, SymCtx, std::move(Targets));
1021 return std::move(Exports);
llvm::MachO::ObjCIVarRecord ObjCIVarRecord
llvm::MachO::SymbolFlags SymbolFlags
llvm::MachO::RecordLoc RecordLoc
llvm::MachO::InterfaceFile InterfaceFile
llvm::MachO::ObjCCategoryRecord ObjCCategoryRecord
llvm::MachO::GlobalRecord GlobalRecord
llvm::MachO::ArchitectureSet ArchitectureSet
llvm::MachO::EncodeKind EncodeKind
llvm::MachO::ObjCInterfaceRecord ObjCInterfaceRecord
llvm::MachO::ObjCIFSymbolKind ObjCIFSymbolKind
llvm::MachO::FileType FileType
llvm::MachO::Target Target
llvm::MachO::RecordsSlice::BinaryAttrs BinaryAttrs
llvm::MachO::Record Record
llvm::MachO::TargetList TargetList
llvm::MachO::SimpleSymbol SimpleSymbol
Attr - This represents one attribute.
Decl - This represents one declaration (or definition), e.g.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
void setSourceManager(SourceManager *SrcMgr)
SourceManager & getSourceManager() const
Represents a function declaration or definition.
Represents a variable declaration or definition.
Result verify(GlobalRecord *R, const FrontendAttrs *FA)
Result getState() const
Get result of verification.
void setSourceManager(IntrusiveRefCntPtr< SourceManager > SourceMgr)
Set different source managers to the same diagnostics engine.
std::unique_ptr< SymbolSet > takeExports()
Release ownership over exports.
bool verifyBinaryAttrs(const ArrayRef< Target > ProvidedTargets, const BinaryAttrs &ProvidedBA, const LibAttrs &ProvidedReexports, const LibAttrs &ProvidedClients, const LibAttrs &ProvidedRPaths, const FileType &FT)
Compare and report the attributes represented as load commands in the dylib to the attributes provide...
void setTarget(const Target &T)
Initialize target for verification.
Result verifyRemainingSymbols()
Represents dynamic library specific attributes that are tied to architecture slices.
std::pair< std::string, ArchitectureSet > Entry
std::optional< Entry > find(StringRef Attr) const
const AttrsToArchs & get() const
ArchitectureSet & getArchSet(StringRef Attr)
Record * findRecordFromSlice(const RecordsSlice *Slice, StringRef Name, EncodeKind Kind)
static bool isCppMangled(StringRef Name)
static std::string demangle(StringRef Name)
static DylibVerifier::Result updateResult(const DylibVerifier::Result Prev, const DylibVerifier::Result Curr)
static ObjCIFSymbolKind assignObjCIFSymbolKind(const ObjCInterfaceRecord *R)
static bool shouldIgnorePrivateExternAttr(const Decl *D)
std::vector< ZipperedDeclSource > ZipperedDeclSources
static bool shouldIgnoreCpp(StringRef Name, bool IsWeakDef)
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T
DylibReader::SymbolToSourceLocMap SourceLocs
Metadata stored about a mapping of a declaration to a symbol.
ObjCIFSymbolKind ObjCIFKind
bool DiscoveredFirstError
void emitDiag(llvm::function_ref< void()> Report, RecordLoc *Loc=nullptr)
RecordsSlice * DylibSlice
llvm::MachO::Target Target
Frontend information captured about records.