(Name.starts_with(
"_Z") || Name.starts_with(
"__Z") ||
51Name.starts_with(
"___Z"));
58 char*
Result= llvm::itaniumDemangle(Name);
62std::string Demangled(
Result);
67std::string DylibVerifier::getAnnotatedName(
const Record*R,
68SymbolContext &SymCtx,
69 boolValidSourceLoc) {
70assert(!SymCtx.SymbolName.empty() &&
"Expected symbol name");
72 constStringRef SymbolName = SymCtx.SymbolName;
73std::string PrettyName =
74(Demangle && (SymCtx.Kind == EncodeKind::GlobalSymbol))
78std::string Annotation;
79 if(R->isWeakDefined())
80Annotation +=
"(weak-def) ";
81 if(R->isWeakReferenced())
82Annotation +=
"(weak-ref) ";
83 if(R->isThreadLocalValue())
84Annotation +=
"(tlv) ";
87 switch(SymCtx.ObjCIFKind) {
90 caseObjCIFSymbolKind::EHType:
91 returnAnnotation +
"Exception Type of "+ PrettyName;
92 caseObjCIFSymbolKind::MetaClass:
93 returnAnnotation +
"Metaclass of "+ PrettyName;
94 caseObjCIFSymbolKind::Class:
95 returnAnnotation +
"Class of "+ PrettyName;
101 if(ValidSourceLoc) {
102StringRef PrettyNameRef(PrettyName);
103 if((SymCtx.Kind == EncodeKind::GlobalSymbol) &&
104!
isCppMangled(SymbolName) && PrettyNameRef.starts_with(
"_"))
105 returnAnnotation + PrettyNameRef.drop_front(1).str();
106 returnAnnotation + PrettyName;
109 switch(SymCtx.Kind) {
110 caseEncodeKind::GlobalSymbol:
111 returnAnnotation + PrettyName;
112 caseEncodeKind::ObjectiveCInstanceVariable:
113 returnAnnotation +
"(ObjC IVar) "+ PrettyName;
114 caseEncodeKind::ObjectiveCClass:
115 returnAnnotation +
"(ObjC Class) "+ PrettyName;
116 caseEncodeKind::ObjectiveCClassEHType:
117 returnAnnotation +
"(ObjC Class EH) "+ PrettyName;
120llvm_unreachable(
"unexpected case for EncodeKind");
145 if(
const VarDecl*VD = cast<VarDecl>(
D))
154 caseEncodeKind::GlobalSymbol:
155 returnSlice->findGlobal(Name);
156 caseEncodeKind::ObjectiveCInstanceVariable:
157 returnSlice->findObjCIVar(Name.contains(
'.'), Name);
158 caseEncodeKind::ObjectiveCClass:
159 caseEncodeKind::ObjectiveCClassEHType:
160 returnSlice->findObjCInterface(Name);
162llvm_unreachable(
"unexpected end when finding record");
165voidDylibVerifier::updateState(
ResultState) {
169voidDylibVerifier::addSymbol(
const Record*R, SymbolContext &SymCtx,
174Exports->addGlobal(SymCtx.Kind, SymCtx.SymbolName, R->getFlags(), Targets);
177boolDylibVerifier::shouldIgnoreObsolete(
const Record*R, SymbolContext &SymCtx,
179 if(!SymCtx.FA->Avail.isObsoleted())
183DeferredZipperedSymbols[SymCtx.SymbolName].emplace_back(ZipperedDeclSource{
188boolDylibVerifier::shouldIgnoreReexport(
const Record*R,
189SymbolContext &SymCtx)
const{
190StringRef SymName = SymCtx.SymbolName;
192 if(SymName.starts_with(
"$ld$"))
195 if(Reexports.empty())
199 if(!Lib.hasTarget(Ctx.
Target))
201 if(
autoSym = Lib.getSymbol(SymCtx.Kind, SymName, SymCtx.ObjCIFKind))
202 if((*Sym)->hasTarget(Ctx.
Target))
208boolDylibVerifier::shouldIgnoreInternalZipperedSymbol(
209 const Record*R,
constSymbolContext &SymCtx)
const{
213 returnExports->findSymbol(SymCtx.Kind, SymCtx.SymbolName,
214SymCtx.ObjCIFKind) !=
nullptr;
217boolDylibVerifier::shouldIgnoreZipperedAvailability(
const Record*R,
218SymbolContext &SymCtx) {
219 if(!(Zippered && SymCtx.FA->Avail.isUnavailable()))
224DeferredZipperedSymbols[SymCtx.SymbolName].emplace_back(
225ZipperedDeclSource{SymCtx.FA, SourceManagers.back().get(), Ctx.
Target});
230boolDylibVerifier::compareObjCInterfaceSymbols(
const Record*R,
231SymbolContext &SymCtx,
233 const boolIsDeclVersionComplete =
234((SymCtx.ObjCIFKind & ObjCIFSymbolKind::Class) ==
235ObjCIFSymbolKind::Class) &&
236((SymCtx.ObjCIFKind & ObjCIFSymbolKind::MetaClass) ==
237ObjCIFSymbolKind::MetaClass);
239 const boolIsDylibVersionComplete = DR->isCompleteInterface();
242 if(IsDeclVersionComplete && IsDylibVersionComplete)
245 autoPrintDiagnostic = [&](
autoSymLinkage,
const Record*
Record,
246StringRef SymName,
boolPrintAsWarning =
false) {
247 if(SymLinkage == RecordLinkage::Unknown)
249Ctx.
Diag->
Report(SymCtx.FA->Loc, PrintAsWarning
250? diag::warn_library_missing_symbol
251: diag::err_library_missing_symbol)
256Ctx.
Diag->
Report(SymCtx.FA->Loc, PrintAsWarning
257? diag::warn_library_hidden_symbol
258: diag::err_library_hidden_symbol)
263 if(IsDeclVersionComplete) {
267 if(!DR->isExportedSymbol(ObjCIFSymbolKind::Class)) {
268SymCtx.ObjCIFKind = ObjCIFSymbolKind::Class;
269PrintDiagnostic(DR->getLinkageForSymbol(ObjCIFSymbolKind::Class), R,
270getAnnotatedName(R, SymCtx),
273 if(!DR->isExportedSymbol(ObjCIFSymbolKind::MetaClass)) {
274SymCtx.ObjCIFKind = ObjCIFSymbolKind::MetaClass;
275PrintDiagnostic(DR->getLinkageForSymbol(ObjCIFSymbolKind::MetaClass), R,
276getAnnotatedName(R, SymCtx),
282 if(DR->isExportedSymbol(SymCtx.ObjCIFKind)) {
283 if(!IsDylibVersionComplete) {
285SymCtx.Kind = EncodeKind::GlobalSymbol;
286SymCtx.SymbolName = R->getName();
293PrintDiagnostic(DR->getLinkageForSymbol(SymCtx.ObjCIFKind), R,
299SymbolContext &SymCtx,
302 if(R->isExported()) {
305Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_library_missing_symbol)
306<< getAnnotatedName(R, SymCtx);
310 if(DR->isInternal()) {
312Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_library_hidden_symbol)
313<< getAnnotatedName(R, SymCtx);
321 if((R->isInternal() && !SymCtx.Inlined) && DR && DR->isExported()) {
329 if(shouldIgnoreInternalZipperedSymbol(R, SymCtx))
335 ID= diag::warn_header_hidden_symbol;
338 ID= diag::err_header_hidden_symbol;
342Ctx.
Diag->
Report(SymCtx.FA->Loc, ID) << getAnnotatedName(R, SymCtx);
354SymbolContext &SymCtx,
356 if(!SymCtx.FA->Avail.isUnavailable())
359 if(shouldIgnoreZipperedAvailability(R, SymCtx))
362 const boolIsDeclAvailable = SymCtx.FA->Avail.isUnavailable();
367Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::warn_header_availability_mismatch)
368<< getAnnotatedName(R, SymCtx) << IsDeclAvailable << IsDeclAvailable;
373Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_availability_mismatch)
374<< getAnnotatedName(R, SymCtx) << IsDeclAvailable << IsDeclAvailable;
380llvm_unreachable(
"Unexpected verification mode symbol verification");
382llvm_unreachable(
"Unexpected verification mode symbol verification");
385boolDylibVerifier::compareSymbolFlags(
const Record*R, SymbolContext &SymCtx,
387 if(DR->isThreadLocalValue() && !R->isThreadLocalValue()) {
389Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_dylib_symbol_flags_mismatch)
390<< getAnnotatedName(DR, SymCtx) << DR->isThreadLocalValue();
394 if(!DR->isThreadLocalValue() && R->isThreadLocalValue()) {
396Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_symbol_flags_mismatch)
397<< getAnnotatedName(R, SymCtx) << R->isThreadLocalValue();
402 if(DR->isWeakDefined() && !R->isWeakDefined()) {
404Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_dylib_symbol_flags_mismatch)
405<< getAnnotatedName(DR, SymCtx) << R->isWeakDefined();
409 if(!DR->isWeakDefined() && R->isWeakDefined()) {
411Ctx.
Diag->
Report(SymCtx.FA->Loc, diag::err_header_symbol_flags_mismatch)
412<< getAnnotatedName(R, SymCtx) << R->isWeakDefined();
421SymbolContext &SymCtx) {
425 if(R->isExported() && !SymCtx.FA->Avail.isUnavailable() &&
426!SymCtx.FA->Avail.isObsoleted()) {
427addSymbol(R, SymCtx);
432 if(shouldIgnoreReexport(R, SymCtx)) {
442 if(shouldIgnoreObsolete(R, SymCtx, DR)) {
448 if(SymCtx.FA->Avail.isUnavailable() && (!DR || DR->isInternal())) {
453 ResultVisibilityCheck = compareVisibility(R, SymCtx, DR);
455updateState(VisibilityCheck);
466 if(SymCtx.ObjCIFKind != ObjCIFSymbolKind::None) {
467 if(!compareObjCInterfaceSymbols(
468R, SymCtx, Ctx.
DylibSlice->findObjCInterface(DR->getName()))) {
474 ResultAvailabilityCheck = compareAvailability(R, SymCtx, DR);
476updateState(AvailabilityCheck);
480 if(!compareSymbolFlags(R, SymCtx, DR)) {
485addSymbol(R, SymCtx);
490boolDylibVerifier::canVerify() {
494voidDylibVerifier::assignSlice(
const Target&
T) {
495assert(
T== Ctx.
Target&&
"Active targets should match.");
502Dylib, [&
T](
const auto&Slice) {
return T== Slice->getTarget(); });
504assert(It != Dylib.end() &&
"Target slice should always exist.");
523SourceManagers.push_back(std::move(SourceMgr));
529 constStringRef SuperClass) {
534ObjCIVarRecord::createScopedName(SuperClass, R->getName());
536 returnverifyImpl(R, SymCtx);
541 if(R->getLinkageForSymbol(ObjCIFSymbolKind::Class) != RecordLinkage::Unknown)
542 Result|= ObjCIFSymbolKind::Class;
543 if(R->getLinkageForSymbol(ObjCIFSymbolKind::MetaClass) !=
544RecordLinkage::Unknown)
545 Result|= ObjCIFSymbolKind::MetaClass;
546 if(R->getLinkageForSymbol(ObjCIFSymbolKind::EHType) !=
547RecordLinkage::Unknown)
548 Result|= ObjCIFSymbolKind::EHType;
560SymCtx.
Kind= R->hasExceptionAttribute() ? EncodeKind::ObjectiveCClassEHType
561: EncodeKind::ObjectiveCClass;
564 returnverifyImpl(R, SymCtx);
576SymCtx.
Kind= Sym.Kind;
578SymCtx.
Inlined= R->isInlined();
579 returnverifyImpl(R, SymCtx);
587: getTargetTripleName(
Target));
590 if(
Loc&&
Loc->isValid())
591llvm::errs() <<
Loc->File <<
":"<<
Loc->Line <<
":"<< 0 <<
": ";
603(Name.starts_with(
"__ZTI") || Name.starts_with(
"__ZTS")));
605voidDylibVerifier::visitSymbolInDylib(
const Record&R, SymbolContext &SymCtx) {
607 if(R.isUndefined()) {
613 if(R.isInternal()) {
620 constStringRef SymbolName(SymCtx.SymbolName);
621 if(
constSymbol *Sym = Exports->findSymbol(SymCtx.Kind, SymCtx.SymbolName,
622SymCtx.ObjCIFKind)) {
623 if(Sym->hasArchitecture(Ctx.
Target.Arch)) {
629 const boolIsLinkerSymbol = SymbolName.starts_with(
"$ld$");
631 if(R.isVerified()) {
635 autoIt = DeferredZipperedSymbols.find(SymCtx.SymbolName);
636 if(It == DeferredZipperedSymbols.end()) {
642 for(
constZipperedDeclSource &ZSource : It->second) {
643 if(ZSource.FA->Avail.isObsoleted()) {
647 if(ZSource.T.Arch != Ctx.
Target.Arch)
649Locs.emplace_back(ZSource);
651assert(Locs.size() == 2 &&
"Expected two decls for zippered symbol");
654 for(
constZipperedDeclSource &ZSource : Locs) {
658DiagID = diag::err_header_availability_mismatch;
661DiagID = diag::warn_header_availability_mismatch;
668Ctx.
Diag->
Report(diag::warn_target) << getTargetTripleName(ZSource.T);
670<< getAnnotatedName(&R, SymCtx) << ZSource.FA->Avail.isUnavailable()
671<< ZSource.FA->Avail.isUnavailable();
681 if(Aliases.count({SymbolName.str(), SymCtx.Kind})) {
690accumulateSrcLocForDylibSymbols();
695 if(IsLinkerSymbol) {
698Ctx.
Diag->
Report(diag::err_header_symbol_missing)
699<< getAnnotatedName(&R, SymCtx,
Loc.isValid());
710Ctx.
Diag->
Report(diag::err_header_symbol_missing)
711<< getAnnotatedName(&R, SymCtx,
Loc.isValid());
723Ctx.
Diag->
Report(diag::warn_header_symbol_missing)
724<< getAnnotatedName(&R, SymCtx,
Loc.isValid());
737voidDylibVerifier::visitGlobal(
const GlobalRecord&R) {
738SymbolContext SymCtx;
740SymCtx.SymbolName = Sym.Name;
741SymCtx.Kind = Sym.Kind;
742visitSymbolInDylib(R, SymCtx);
746 constStringRef Super) {
747SymbolContext SymCtx;
748SymCtx.SymbolName = ObjCIVarRecord::createScopedName(Super, R.getName());
749SymCtx.Kind = EncodeKind::ObjectiveCInstanceVariable;
750visitSymbolInDylib(R, SymCtx);
753voidDylibVerifier::accumulateSrcLocForDylibSymbols() {
754 if(DSYMPath.empty())
757assert(DWARFCtx !=
nullptr&&
"Expected an initialized DWARFContext");
762DylibReader::accumulateSourceLocFromDSYM(DSYMPath, Ctx.
Target);
766SymbolContext SymCtx;
767SymCtx.SymbolName = R.getName();
769 if(SymCtx.ObjCIFKind > ObjCIFSymbolKind::EHType) {
770 if(R.hasExceptionAttribute()) {
771SymCtx.Kind = EncodeKind::ObjectiveCClassEHType;
772visitSymbolInDylib(R, SymCtx);
774SymCtx.Kind = EncodeKind::ObjectiveCClass;
775visitSymbolInDylib(R, SymCtx);
777SymCtx.Kind = R.hasExceptionAttribute() ? EncodeKind::ObjectiveCClassEHType
778: EncodeKind::ObjectiveCClass;
779visitSymbolInDylib(R, SymCtx);
783visitObjCIVar(*IV, R.getName());
788visitObjCIVar(*IV, R.getSuperClassName());
794assert(!Dylib.empty() &&
"No binary to verify against");
797DWARFCtx = &DWARFInfo;
798Ctx.
Target=
Target(Architecture::AK_unknown, PlatformType::PLATFORM_UNKNOWN);
799 for(std::shared_ptr<RecordsSlice> Slice : Dylib) {
800 if(Ctx.
Target.Arch == Slice->getTarget().Arch)
804Ctx.
Target= Slice->getTarget();
806Slice->visit(*
this);
817assert(!Dylib.empty() &&
"Need dylib to verify.");
824 for(
conststd::shared_ptr<RecordsSlice> &RS : Dylib) {
825DylibTargets.push_back(RS->getTarget());
827 for(
constStringRef LibName : BinInfo.RexportedLibraries)
828DylibReexports[LibName].set(DylibTargets.back().Arch);
829 for(
constStringRef LibName : BinInfo.AllowableClients)
830DylibClients[LibName].set(DylibTargets.back().Arch);
832 if(FT >= FileType::TBD_V5)
833 for(
constStringRef Name : BinInfo.RPaths)
834DylibRPaths[Name].set(DylibTargets.back().Arch);
840 if(ProvidedArchs != DylibArchs) {
841Ctx.
Diag->
Report(diag::err_architecture_mismatch)
842<< ProvidedArchs << DylibArchs;
845 autoProvidedPlatforms = mapToPlatformVersionSet(ProvidedTargets);
846 autoDylibPlatforms = mapToPlatformVersionSet(DylibTargets);
847 if(ProvidedPlatforms != DylibPlatforms) {
848 const boolDiffMinOS =
849mapToPlatformSet(ProvidedTargets) == mapToPlatformSet(DylibTargets);
851Ctx.
Diag->
Report(diag::warn_platform_mismatch)
852<< ProvidedPlatforms << DylibPlatforms;
854Ctx.
Diag->
Report(diag::err_platform_mismatch)
855<< ProvidedPlatforms << DylibPlatforms;
862 const BinaryAttrs&DylibBA = (*Dylib.begin())->getBinaryAttrs();
864 if(ProvidedBA.InstallName != DylibBA.InstallName) {
865Ctx.
Diag->
Report(diag::err_install_name_mismatch)
866<< ProvidedBA.InstallName << DylibBA.InstallName;
870 if(ProvidedBA.CurrentVersion != DylibBA.CurrentVersion) {
871Ctx.
Diag->
Report(diag::err_current_version_mismatch)
872<< ProvidedBA.CurrentVersion << DylibBA.CurrentVersion;
876 if(ProvidedBA.CompatVersion != DylibBA.CompatVersion) {
877Ctx.
Diag->
Report(diag::err_compatibility_version_mismatch)
878<< ProvidedBA.CompatVersion << DylibBA.CompatVersion;
882 if(ProvidedBA.AppExtensionSafe != DylibBA.AppExtensionSafe) {
883Ctx.
Diag->
Report(diag::err_appextension_safe_mismatch)
884<< (ProvidedBA.AppExtensionSafe ?
"true":
"false")
885<< (DylibBA.AppExtensionSafe ?
"true":
"false");
889 if(!DylibBA.TwoLevelNamespace) {
890Ctx.
Diag->
Report(diag::err_no_twolevel_namespace);
894 if(ProvidedBA.OSLibNotForSharedCache != DylibBA.OSLibNotForSharedCache) {
895Ctx.
Diag->
Report(diag::err_shared_cache_eligiblity_mismatch)
896<< (ProvidedBA.OSLibNotForSharedCache ?
"true":
"false")
897<< (DylibBA.OSLibNotForSharedCache ?
"true":
"false");
901 if(ProvidedBA.ParentUmbrella.empty() && !DylibBA.ParentUmbrella.empty()) {
902Ctx.
Diag->
Report(diag::err_parent_umbrella_missing)
903<<
"installAPI option"<< DylibBA.ParentUmbrella;
907 if(!ProvidedBA.ParentUmbrella.empty() && DylibBA.ParentUmbrella.empty()) {
908Ctx.
Diag->
Report(diag::err_parent_umbrella_missing)
909<<
"binary file"<< ProvidedBA.ParentUmbrella;
913 if((!ProvidedBA.ParentUmbrella.empty()) &&
914(ProvidedBA.ParentUmbrella != DylibBA.ParentUmbrella)) {
915Ctx.
Diag->
Report(diag::err_parent_umbrella_mismatch)
916<< ProvidedBA.ParentUmbrella << DylibBA.ParentUmbrella;
920 autoCompareLibraries = [&](
const LibAttrs&Provided,
const LibAttrs&Dylib,
921 unsignedDiagID_missing,
unsignedDiagID_mismatch,
922 boolFatal =
true) {
923 if(Provided == Dylib)
926 for(
constllvm::StringMapEntry<ArchitectureSet> &PAttr : Provided) {
927 const autoDAttrIt = Dylib.find(PAttr.getKey());
928 if(DAttrIt == Dylib.end()) {
929Ctx.
Diag->
Report(DiagID_missing) <<
"binary file"<< PAttr;
934 if(PAttr.getValue() != DAttrIt->getValue()) {
935Ctx.
Diag->
Report(DiagID_mismatch) << PAttr << *DAttrIt;
941 for(
constllvm::StringMapEntry<ArchitectureSet> &DAttr : Dylib) {
942 const autoPAttrIt = Provided.find(DAttr.getKey());
943 if(PAttrIt == Provided.end()) {
944Ctx.
Diag->
Report(DiagID_missing) <<
"installAPI option"<< DAttr;
950 if(PAttrIt->getValue() != DAttr.getValue()) {
952llvm_unreachable(
"this case was already covered above.");
958 if(!CompareLibraries(ProvidedReexports, DylibReexports,
959diag::err_reexported_libraries_missing,
960diag::err_reexported_libraries_mismatch))
963 if(!CompareLibraries(ProvidedClients, DylibClients,
964diag::err_allowable_clients_missing,
965diag::err_allowable_clients_mismatch))
968 if(FT >= FileType::TBD_V5) {
973 if(!ProvidedBA.InstallName.ends_with(
"_asan")) {
974 if(!CompareLibraries(ProvidedRPaths, DylibRPaths,
975diag::warn_rpaths_missing,
976diag::warn_rpaths_mismatch,
986 for(
const auto&[Alias,
Base] : Aliases) {
989 if(
constSymbol *Sym = Exports->findSymbol(
Base.second,
Base.first)) {
990Flags = Sym->getFlags();
991Targets = {Sym->targets().begin(), Sym->targets().end()};
994 RecordR(Alias.first, RecordLinkage::Exported, Flags);
997SymCtx.
Kind= Alias.second;
998addSymbol(&R, SymCtx, std::move(Targets));
1001 returnstd::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
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()
Record * findRecordFromSlice(const RecordsSlice *Slice, StringRef Name, EncodeKind Kind)
llvm::StringMap< ArchitectureSet > LibAttrs
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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4