82using AttrToTargets = std::map<std::string, TargetList>;
83using TargetsToSymbols =
89class InOrderAttrToTargets {
90 using EntryT = std::pair<std::string, TargetList>;
93 void insert(EntryT &&Entry) {
95 Element.second =
Entry.second;
98 const EntryT *
begin() {
return Container.begin(); }
99 const EntryT *
end() {
return Container.end(); }
102 EntryT &
get(std::string &
Key) {
104 [&
Key](EntryT &Input) {
return Input.first ==
Key; });
105 if (It != Container.end())
107 Container.push_back(EntryT(
Key, {}));
108 return Container.back();
113enum TBDKey :
size_t {
125 CompatibilityVersion,
151std::array<StringRef, 64> Keys = {
163 "compatibility_versions",
171 "reexported_libraries",
175 "reexported_symbols",
190 return {
"invalid ", Keys[
Key],
" section"};
194 return {
"missing ", Keys[
Key],
" information"};
199 JSONStubError(Twine ErrMsg) : Message(ErrMsg.str()) {}
201 void log(llvm::raw_ostream &OS)
const override { OS << Message <<
"\n"; }
202 std::error_code convertToErrorCode()
const override {
210template <
typename JsonT,
typename StubT = JsonT>
213 std::function<std::optional<JsonT>(
const Object *,
StringRef)> GetValue,
214 std::function<std::optional<StubT>(JsonT)> Validate =
nullptr) {
215 std::optional<JsonT> Val = GetValue(Obj, Keys[
Key]);
219 if (Validate ==
nullptr)
220 return static_cast<StubT
>(*Val);
222 std::optional<StubT>
Result = Validate(*Val);
228template <
typename JsonT,
typename StubT = JsonT>
233 StubT DefaultValue,
function_ref<std::optional<StubT>(JsonT)> Validate) {
234 std::optional<JsonT> Val = GetValue(Obj, Keys[
Key]);
238 std::optional<StubT>
Result;
247 bool IsRequired =
false) {
255 for (
const Value &Val : *Values) {
256 auto ValStr = Val.getAsString();
257 if (!ValStr.has_value())
259 Append(ValStr.value());
268 auto VersionOrErr = getRequiredValue<int64_t, FileType>(
270 [](int64_t Val) -> std::optional<FileType> {
271 unsigned Result = Val;
279 return *VersionOrErr;
283 const auto *Targets = Section->getArray(Keys[TBDKey::Targets]);
288 for (
const Value &JSONTarget : *Targets) {
289 auto TargetStr = JSONTarget.getAsString();
290 if (!TargetStr.has_value())
297 return std::move(IFTargets);
301 const Array *Targets = Section->getArray(Keys[TBDKey::TargetInfo]);
306 for (
const Value &JSONTarget : *Targets) {
307 const auto *Obj = JSONTarget.getAsObject();
318 auto VersionStr = Obj->
getString(Keys[TBDKey::Deployment]);
320 if (VersionStr && Version.tryParse(*VersionStr))
322 TargetOrErr->MinDeployment = Version;
329 return std::move(IFTargets);
332Error collectSymbolsFromSegment(
const Object *Segment, TargetsToSymbols &Result,
334 auto Err = collectFromArray(
335 TBDKey::Globals, Segment, [&Result, &SectionFlag](
StringRef Name) {
337 Result.back().second.emplace_back(Sym);
342 Err = collectFromArray(
343 TBDKey::ObjCClass, Segment, [&Result, &SectionFlag](
StringRef Name) {
345 Result.back().second.emplace_back(Sym);
350 Err = collectFromArray(TBDKey::ObjCEHType, Segment,
351 [&Result, &SectionFlag](
StringRef Name) {
353 Name.str(), SectionFlag};
354 Result.back().second.emplace_back(Sym);
359 Err = collectFromArray(
360 TBDKey::ObjCIvar, Segment, [&Result, &SectionFlag](
StringRef Name) {
363 Result.back().second.emplace_back(Sym);
373 Err = collectFromArray(
374 TBDKey::Weak, Segment, [&Result, WeakFlag](
StringRef Name) {
376 Result.back().second.emplace_back(Sym);
381 Err = collectFromArray(
382 TBDKey::ThreadLocal, Segment, [&Result, SectionFlag](
StringRef Name) {
385 Result.back().second.emplace_back(Sym);
394 const Array *Section = File->getArray(Keys[TBDKey::InstallName]);
398 assert(!Section->empty() &&
"unexpected missing install name");
400 const auto *Obj = Section->front().getAsObject();
410 const Array *Section = File->getArray(Keys[
Key]);
412 return TargetsToSymbols();
416 case TBDKey::Reexports:
419 case TBDKey::Undefineds:
427 TargetsToSymbols Result;
429 for (
auto Val : *Section) {
430 auto *Obj = Val.getAsObject();
434 auto TargetsOrErr = getTargets(Obj);
436 MappedTargets = Targets;
439 MappedTargets = *TargetsOrErr;
442 std::make_pair(std::move(MappedTargets), std::vector<JSONSymbol>()));
444 auto *DataSection = Obj->
getObject(Keys[TBDKey::Data]);
445 auto *TextSection = Obj->
getObject(Keys[TBDKey::Text]);
447 if (!DataSection && !TextSection)
451 auto Err = collectSymbolsFromSegment(DataSection, Result,
454 return std::move(Err);
457 auto Err = collectSymbolsFromSegment(TextSection, Result,
460 return std::move(Err);
464 return std::move(Result);
467template <
typename ReturnT = AttrToTargets>
470 auto *Section = File->getArray(Keys[
Key]);
476 for (
auto Val : *Section) {
477 auto *Obj = Val.getAsObject();
481 auto TargetsOrErr = getTargets(Obj);
483 MappedTargets = Targets;
486 MappedTargets = *TargetsOrErr;
489 collectFromArray(SubKey, Obj, [&Result, &MappedTargets](
StringRef Key) {
490 Result.insert({
Key.str(), MappedTargets});
493 return std::move(Err);
496 return std::move(Result);
501 const auto *Umbrella = File->getArray(Keys[TBDKey::ParentUmbrella]);
503 return AttrToTargets();
505 AttrToTargets Result;
507 for (
auto Val : *Umbrella) {
508 auto *Obj = Val.getAsObject();
511 getParseErrorMsg(TBDKey::ParentUmbrella));
514 auto TargetsOrErr = getTargets(Obj);
516 MappedTargets = Targets;
519 MappedTargets = *TargetsOrErr;
525 return UmbrellaOrErr.takeError();
526 Result[UmbrellaOrErr->str()] = Targets;
528 return std::move(Result);
532 const Array *Versions = File->getArray(Keys[TBDKey::SwiftABI]);
536 for (
const auto &Val : *Versions) {
537 const auto *Obj = Val.getAsObject();
542 return getRequiredValue<int64_t, uint8_t>(TBDKey::ABI, Obj,
550 const Array *Versions = File->getArray(Keys[
Key]);
554 for (
const auto &Val : *Versions) {
555 const auto *Obj = Val.getAsObject();
559 auto ValidatePV = [](
StringRef Version) -> std::optional<PackedVersion> {
567 return getRequiredValue<StringRef, PackedVersion>(
577 const Array *Section = File->getArray(Keys[TBDKey::Flags]);
578 if (!Section || Section->empty())
581 for (
auto &Val : *Section) {
583 const auto *Obj = Val.getAsObject();
588 collectFromArray(TBDKey::Attributes, Obj, [&Flags](
StringRef Flag) {
592 .
Case(
"not_app_extension_safe",
595 .
Case(
"not_for_dyld_shared_cache",
602 return std::move(FlagsOrErr);
610using IFPtr = std::unique_ptr<InterfaceFile>;
612 auto TargetsOrErr = getTargetsSection(File);
614 return TargetsOrErr.takeError();
617 auto NameOrErr = getNameSection(File);
619 return NameOrErr.takeError();
622 auto CurrVersionOrErr = getPackedVersion(File, TBDKey::CurrentVersion);
623 if (!CurrVersionOrErr)
624 return CurrVersionOrErr.takeError();
627 auto CompVersionOrErr = getPackedVersion(File, TBDKey::CompatibilityVersion);
628 if (!CompVersionOrErr)
629 return CompVersionOrErr.takeError();
632 auto SwiftABIOrErr = getSwiftVersion(File);
634 return SwiftABIOrErr.takeError();
635 uint8_t SwiftABI = *SwiftABIOrErr;
639 return FlagsOrErr.takeError();
640 TBDFlags Flags = *FlagsOrErr;
642 auto UmbrellasOrErr = getUmbrellaSection(File, Targets);
644 return UmbrellasOrErr.takeError();
645 AttrToTargets Umbrellas = *UmbrellasOrErr;
648 getLibSection(File, TBDKey::AllowableClients, TBDKey::Clients, Targets);
650 return ClientsOrErr.takeError();
651 AttrToTargets Clients = *ClientsOrErr;
654 getLibSection(File, TBDKey::ReexportLibs, TBDKey::Names, Targets);
656 return RLOrErr.takeError();
657 AttrToTargets ReexportLibs = std::move(*RLOrErr);
659 auto RPathsOrErr = getLibSection<InOrderAttrToTargets>(
660 File, TBDKey::RPath, TBDKey::Paths, Targets);
662 return RPathsOrErr.takeError();
663 InOrderAttrToTargets RPaths = std::move(*RPathsOrErr);
665 auto ExportsOrErr = getSymbolSection(File, TBDKey::Exports, Targets);
667 return ExportsOrErr.takeError();
668 TargetsToSymbols Exports = std::move(*ExportsOrErr);
670 auto ReexportsOrErr = getSymbolSection(File, TBDKey::Reexports, Targets);
672 return ReexportsOrErr.takeError();
673 TargetsToSymbols Reexports = std::move(*ReexportsOrErr);
675 auto UndefinedsOrErr = getSymbolSection(File, TBDKey::Undefineds, Targets);
676 if (!UndefinedsOrErr)
677 return UndefinedsOrErr.takeError();
678 TargetsToSymbols Undefineds = std::move(*UndefinedsOrErr);
681 F->setInstallName(Name);
682 F->setCurrentVersion(CurrVersion);
683 F->setCompatibilityVersion(CompVersion);
684 F->setSwiftABIVersion(SwiftABI);
686 F->setApplicationExtensionSafe(
690 for (
auto &T : Targets)
692 for (
auto &[
Lib, Targets] : Clients)
693 for (
auto Target : Targets)
695 for (
auto &[
Lib, Targets] : ReexportLibs)
696 for (
auto Target : Targets)
698 for (
auto &[
Lib, Targets] : Umbrellas)
699 for (
auto Target : Targets)
701 for (
auto &[
Path, Targets] : RPaths)
702 for (
auto Target : Targets)
704 for (
auto &[Targets, Symbols] : Exports)
705 for (
auto &Sym : Symbols)
706 F->addSymbol(Sym.Kind, Sym.Name, Targets, Sym.Flags);
707 for (
auto &[Targets, Symbols] : Reexports)
708 for (
auto &Sym : Symbols)
709 F->addSymbol(Sym.Kind, Sym.Name, Targets, Sym.Flags);
710 for (
auto &[Targets, Symbols] : Undefineds)
711 for (
auto &Sym : Symbols)
712 F->addSymbol(Sym.Kind, Sym.Name, Targets, Sym.Flags);
718 std::vector<IFPtr> IFs;
719 const Array *Files = File->getArray(Keys[TBDKey::Documents]);
721 return std::move(IFs);
723 for (
auto Lib : *Files) {
724 auto IFOrErr = parseToInterfaceFile(
Lib.getAsObject());
726 return IFOrErr.takeError();
727 auto IF = std::move(*IFOrErr);
728 IFs.emplace_back(std::move(IF));
730 return std::move(IFs);
738 auto ValOrErr =
parse(JSON);
740 return ValOrErr.takeError();
742 auto *Root = ValOrErr->getAsObject();
743 auto VersionOrErr = StubParser::getVersion(Root);
745 return VersionOrErr.takeError();
749 auto IFOrErr = StubParser::parseToInterfaceFile(MainLib);
751 return IFOrErr.takeError();
752 (*IFOrErr)->setFileType(
Version);
753 std::unique_ptr<InterfaceFile> IF(std::move(*IFOrErr));
755 auto IFsOrErr = StubParser::getInlinedLibs(Root);
757 return IFsOrErr.takeError();
758 for (
auto &File : *IFsOrErr) {
760 IF->addDocument(std::shared_ptr<InterfaceFile>(std::move(File)));
762 return std::move(IF);
767template <
typename ContainerT = Array>
768bool insertNonEmptyValues(
Object &Obj, TBDKey
Key, ContainerT &&Contents) {
769 if (Contents.empty())
771 Obj[Keys[
Key]] = std::move(Contents);
776 std::string PlatformStr = Targ.
Platform == PLATFORM_MACCATALYST
782template <
typename AggregateT>
783std::vector<std::string> serializeTargets(
const AggregateT Targets,
785 std::vector<std::string> TargetsStr;
786 if (Targets.size() == ActiveTargets.
size())
790 TargetsStr.emplace_back(getFormattedStr(
Target));
797 for (
const auto Targ : ActiveTargets) {
801 TargetInfo[Keys[TBDKey::Target]] = getFormattedStr(Targ);
807template <
typename ValueT,
typename EntryT = ValueT>
818using TargetsToValuesMap =
819 std::map<std::vector<std::string>, std::vector<std::string>>;
821template <
typename AggregateT = TargetsToValuesMap>
822Array serializeAttrToTargets(AggregateT &Entries, TBDKey
Key) {
824 for (
const auto &[Targets, Values] : Entries) {
826 insertNonEmptyValues(Obj, TBDKey::Targets, std::move(Targets));
827 Obj[Keys[
Key]] = Values;
835template <
typename ValueT = std::string,
836 typename AggregateT = std::vector<std::pair<MachO::Target, ValueT>>>
837Array serializeField(TBDKey
Key,
const AggregateT &Values,
838 const TargetList &ActiveTargets,
bool IsArray =
true) {
839 std::map<ValueT, std::set<MachO::Target>> Entries;
840 for (
const auto &[
Target, Val] : Values)
844 std::map<std::vector<std::string>, std::string> FinalEntries;
845 for (
const auto &[Val, Targets] : Entries)
846 FinalEntries[serializeTargets(Targets, ActiveTargets)] = Val;
847 return serializeAttrToTargets(FinalEntries,
Key);
850 TargetsToValuesMap FinalEntries;
851 for (
const auto &[Val, Targets] : Entries)
852 FinalEntries[serializeTargets(Targets, ActiveTargets)].emplace_back(Val);
853 return serializeAttrToTargets(FinalEntries,
Key);
856Array serializeField(TBDKey
Key,
const std::vector<InterfaceFileRef> &Values,
858 TargetsToValuesMap FinalEntries;
859 for (
const auto &
Ref : Values) {
861 FinalEntries[serializeTargets(Targets, ActiveTargets)].
emplace_back(
862 Ref.getInstallName());
864 return serializeAttrToTargets(FinalEntries,
Key);
868 typename AggregateT = std::vector<std::pair<MachO::Target, std::string>>>
869Array serializeFieldInInsertionOrder(TBDKey
Key,
const AggregateT &Values,
872 for (
const auto &[
Target, Val] : Values)
875 TargetsToValuesMap FinalEntries;
876 for (
const auto &[Val, Targets] : Entries)
877 FinalEntries[serializeTargets(Targets, ActiveTargets)].emplace_back(
879 return serializeAttrToTargets(FinalEntries,
Key);
884 std::vector<StringRef> Weaks;
885 std::vector<StringRef> Globals;
886 std::vector<StringRef> TLV;
887 std::vector<StringRef> ObjCClasses;
888 std::vector<StringRef> IVars;
889 std::vector<StringRef> EHTypes;
892 return Weaks.empty() && Globals.empty() && TLV.empty() &&
893 ObjCClasses.empty() && IVars.empty() && EHTypes.empty();
902 auto AssignForSymbolType = [](SymbolFields::SymbolTypes &Assignment,
904 switch (Sym->getKind()) {
906 Assignment.ObjCClasses.emplace_back(Sym->getName());
909 Assignment.EHTypes.emplace_back(Sym->getName());
912 Assignment.IVars.emplace_back(Sym->getName());
915 if (Sym->isWeakReferenced() || Sym->isWeakDefined())
916 Assignment.Weaks.emplace_back(Sym->getName());
917 else if (Sym->isThreadLocalValue())
918 Assignment.TLV.emplace_back(Sym->getName());
920 Assignment.Globals.emplace_back(Sym->getName());
926 std::map<std::vector<std::string>, SymbolFields> Entries;
927 for (
const auto *Sym : Symbols) {
928 std::set<MachO::Target> Targets{Sym->targets().begin(),
929 Sym->targets().end()};
930 auto JSONTargets = serializeTargets(Targets, ActiveTargets);
932 AssignForSymbolType(Entries[std::move(JSONTargets)].
Data, Sym);
933 else if (Sym->isText())
934 AssignForSymbolType(Entries[std::move(JSONTargets)].
Text, Sym);
939 auto InsertSymbolsToJSON = [](
Object &SymSection, TBDKey SegmentKey,
940 SymbolFields::SymbolTypes &SymField) {
941 if (SymField.empty())
950 insertNonEmptyValues(Segment, TBDKey::Globals, std::move(SymField.Globals));
951 insertNonEmptyValues(Segment, TBDKey::ThreadLocal, std::move(SymField.TLV));
952 insertNonEmptyValues(Segment, TBDKey::Weak, std::move(SymField.Weaks));
953 insertNonEmptyValues(Segment, TBDKey::ObjCClass,
954 std::move(SymField.ObjCClasses));
955 insertNonEmptyValues(Segment, TBDKey::ObjCEHType,
956 std::move(SymField.EHTypes));
957 insertNonEmptyValues(Segment, TBDKey::ObjCIvar, std::move(SymField.IVars));
958 insertNonEmptyValues(SymSection, SegmentKey, std::move(Segment));
962 for (
auto &[Targets, Fields] : Entries) {
964 insertNonEmptyValues(AllSyms, TBDKey::Targets, std::move(Targets));
965 InsertSymbolsToJSON(AllSyms, TBDKey::Data, Fields.Data);
966 InsertSymbolsToJSON(AllSyms, TBDKey::Text, Fields.Text);
967 SymbolSection.emplace_back(std::move(AllSyms));
970 return SymbolSection;
976 if (!
File->isTwoLevelNamespace())
978 if (!
File->isApplicationExtensionSafe())
979 Flags.emplace_back(
"not_app_extension_safe");
980 if (
File->hasSimulatorSupport())
981 Flags.emplace_back(
"sim_support");
982 if (
File->isOSLibNotForSharedCache())
983 Flags.emplace_back(
"not_for_dyld_shared_cache");
984 return serializeScalar(TBDKey::Attributes, std::move(Flags));
992 if (!insertNonEmptyValues(Library, TBDKey::TargetInfo,
993 serializeTargetInfo(ActiveTargets)))
996 Array Name = serializeScalar<StringRef>(TBDKey::Name,
File->getInstallName());
997 if (!insertNonEmptyValues(Library, TBDKey::InstallName, std::move(Name)))
1001 Array Flags = serializeFlags(File);
1002 insertNonEmptyValues(Library, TBDKey::Flags, std::move(Flags));
1004 Array CurrentV = serializeScalar<PackedVersion, std::string>(
1006 insertNonEmptyValues(Library, TBDKey::CurrentVersion, std::move(CurrentV));
1008 Array CompatV = serializeScalar<PackedVersion, std::string>(
1010 insertNonEmptyValues(Library, TBDKey::CompatibilityVersion,
1011 std::move(CompatV));
1013 Array SwiftABI = serializeScalar<uint8_t, int64_t>(
1014 TBDKey::ABI,
File->getSwiftABIVersion(), 0u);
1015 insertNonEmptyValues(Library, TBDKey::SwiftABI, std::move(SwiftABI));
1017 Array RPaths = serializeFieldInInsertionOrder(TBDKey::Paths,
File->rpaths(),
1019 insertNonEmptyValues(Library, TBDKey::RPath, std::move(RPaths));
1021 Array Umbrellas = serializeField(TBDKey::Umbrella,
File->umbrellas(),
1022 ActiveTargets,
false);
1023 insertNonEmptyValues(Library, TBDKey::ParentUmbrella, std::move(Umbrellas));
1026 serializeField(TBDKey::Clients,
File->allowableClients(), ActiveTargets);
1027 insertNonEmptyValues(Library, TBDKey::AllowableClients, std::move(Clients));
1029 Array ReexportLibs =
1030 serializeField(TBDKey::Names,
File->reexportedLibraries(), ActiveTargets);
1031 insertNonEmptyValues(Library, TBDKey::ReexportLibs, std::move(ReexportLibs));
1034 Array Exports = serializeSymbols(
File->exports(), ActiveTargets);
1035 insertNonEmptyValues(Library, TBDKey::Exports, std::move(Exports));
1037 Array Reexports = serializeSymbols(
File->reexports(), ActiveTargets);
1038 insertNonEmptyValues(Library, TBDKey::Reexports, std::move(Reexports));
1040 if (!
File->isTwoLevelNamespace()) {
1041 Array Undefineds = serializeSymbols(
File->undefineds(), ActiveTargets);
1042 insertNonEmptyValues(Library, TBDKey::Undefineds, std::move(Undefineds));
1045 return std::move(Library);
1052 auto MainLibOrErr = serializeIF(File);
1054 return MainLibOrErr;
1055 Root[Keys[TBDKey::MainLibrary]] = std::move(*MainLibOrErr);
1057 for (
const auto &Doc :
File->documents()) {
1058 auto LibOrErr = serializeIF(Doc.get());
1064 Root[Keys[TBDKey::TBDVersion]] = 5;
1065 insertNonEmptyValues(Root, TBDKey::Documents, std::move(Documents));
1066 return std::move(Root);
1075 auto TextFile = getJSON(&File, FileKind);
1077 return TextFile.takeError();
1079 OS <<
formatv(
"{0}",
Value(std::move(*TextFile))) <<
"\n";
1081 OS <<
formatv(
"{0:2}",
Value(std::move(*TextFile))) <<
"\n";
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file supports working with JSON data.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
static uint32_t getFlags(const Symbol *Sym)
@ NotApplicationExtensionSafe
Base class for user error types.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
Defines the interface file.
SymbolSet::const_filtered_symbol_range const_filtered_symbol_range
LLVM_ABI std::pair< bool, bool > parse64(StringRef Str)
static LLVM_ABI llvm::Expected< Target > create(StringRef Target)
VersionTuple MinDeployment
This class implements a map that also provides access to all stored values in a deterministic order.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
LLVM Value Representation.
Represents a version number in the form major[.minor[.subminor[.build]]].
LLVM_ABI std::string getAsString() const
Retrieve a string representation of the version number.
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
An efficient, type-erasing, non-owning reference to a callable.
An Array is a JSON array, which contains heterogeneous JSON values.
void emplace_back(Args &&...A)
iterator insert(const_iterator P, const Value &E)
An Object is a JSON object, which maps strings to heterogenous JSON values.
LLVM_ABI const json::Object * getObject(StringRef K) const
LLVM_ABI std::optional< llvm::StringRef > getString(StringRef K) const
LLVM_ABI std::optional< int64_t > getInteger(StringRef K) const
LLVM_ABI const json::Array * getArray(StringRef K) const
A "cursor" marking a position within a Value.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI std::string getTargetTripleName(const Target &Targ)
FileType
Defines the file type TextAPI files can represent.
@ TBD_V5
Text-based stub file (.tbd) version 5.0.
LLVM_ABI StringRef getArchitectureName(Architecture Arch)
Convert an architecture slice to a string.
LLVM_ABI std::string getOSAndEnvironmentName(PlatformType Platform, std::string Version="")
Error serializeInterfaceFileToJSON(raw_ostream &OS, const InterfaceFile &File, const FileType FileKind, bool Compact)
Expected< std::unique_ptr< InterfaceFile > > getInterfaceFileFromJSON(StringRef JSON)
EncodeKind
Mapping of entry types in TextStubs.
@ ObjectiveCInstanceVariable
@ ThreadLocalValue
Thread-local value symbol.
@ WeakReferenced
Weak referenced symbol.
@ WeakDefined
Weak defined symbol.
SmallVector< Target, 5 > TargetList
LLVM_ABI llvm::Expected< Value > parse(llvm::StringRef JSON)
Parses the provided JSON source, or returns a ParseError.
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
FunctionAddr VTableAddr uintptr_t uintptr_t Version
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
@ Ref
The access may reference the value stored in memory.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
LogicalResult success(bool IsSuccess=true)
Utility function to generate a LogicalResult.
void consumeError(Error Err)
Consume a Error without doing anything.