diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:03:47 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:04:23 +0000 |
commit | 7fa27ce4a07f19b07799a767fc29416f3b625afb (patch) | |
tree | 27825c83636c4de341eb09a74f49f5d38a15d165 /llvm/lib/TextAPI/TextStub.cpp | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'llvm/lib/TextAPI/TextStub.cpp')
-rw-r--r-- | llvm/lib/TextAPI/TextStub.cpp | 113 |
1 files changed, 66 insertions, 47 deletions
diff --git a/llvm/lib/TextAPI/TextStub.cpp b/llvm/lib/TextAPI/TextStub.cpp index ff93e43356f7..78de3ebf3f3a 100644 --- a/llvm/lib/TextAPI/TextStub.cpp +++ b/llvm/lib/TextAPI/TextStub.cpp @@ -258,16 +258,6 @@ struct UUIDv4 { UUIDv4(const Target &TargetID, const std::string &Value) : TargetID(TargetID), Value(Value) {} }; - -// clang-format off -enum TBDFlags : unsigned { - None = 0U, - FlatNamespace = 1U << 0, - NotApplicationExtensionSafe = 1U << 1, - InstallAPI = 1U << 2, - LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/InstallAPI), -}; -// clang-format on } // end anonymous namespace. LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(Architecture) @@ -437,7 +427,6 @@ template <> struct MappingTraits<const InterfaceFile *> { explicit NormalizedTBD(IO &IO) {} NormalizedTBD(IO &IO, const InterfaceFile *&File) { Architectures = File->getArchitectures(); - UUIDs = File->uuids(); Platforms = File->getPlatforms(); InstallName = File->getInstallName(); CurrentVersion = PackedVersion(File->getCurrentVersion()); @@ -452,9 +441,6 @@ template <> struct MappingTraits<const InterfaceFile *> { if (!File->isTwoLevelNamespace()) Flags |= TBDFlags::FlatNamespace; - if (File->isInstallAPI()) - Flags |= TBDFlags::InstallAPI; - if (!File->umbrellas().empty()) ParentUmbrella = File->umbrellas().begin()->second; @@ -466,7 +452,7 @@ template <> struct MappingTraits<const InterfaceFile *> { ArchSet.insert(Library.getArchitectures()); std::map<const Symbol *, ArchitectureSet> SymbolToArchSet; - for (const auto *Symbol : File->exports()) { + for (const auto *Symbol : File->symbols()) { auto Architectures = Symbol->getArchitectures(); SymbolToArchSet[Symbol] = Architectures; ArchSet.insert(Architectures); @@ -617,8 +603,6 @@ template <> struct MappingTraits<const InterfaceFile *> { File->setPath(Ctx->Path); File->setFileType(Ctx->FileKind); File->addTargets(synthesizeTargets(Architectures, Platforms)); - for (auto &ID : UUIDs) - File->addUUID(ID.first, ID.second); File->setInstallName(InstallName); File->setCurrentVersion(CurrentVersion); File->setCompatibilityVersion(CompatibilityVersion); @@ -634,7 +618,6 @@ template <> struct MappingTraits<const InterfaceFile *> { File->setTwoLevelNamespace(!(Flags & TBDFlags::FlatNamespace)); File->setApplicationExtensionSafe( !(Flags & TBDFlags::NotApplicationExtensionSafe)); - File->setInstallAPI(Flags & TBDFlags::InstallAPI); } for (const auto &Section : Exports) { @@ -807,8 +790,6 @@ template <> struct MappingTraits<const InterfaceFile *> { TBDVersion = Ctx->FileKind >> 1; Targets.insert(Targets.begin(), File->targets().begin(), File->targets().end()); - for (const auto &IT : File->uuids()) - UUIDs.emplace_back(IT.first, IT.second); InstallName = File->getInstallName(); CurrentVersion = File->getCurrentVersion(); CompatibilityVersion = File->getCompatibilityVersion(); @@ -821,9 +802,6 @@ template <> struct MappingTraits<const InterfaceFile *> { if (!File->isTwoLevelNamespace()) Flags |= TBDFlags::FlatNamespace; - if (File->isInstallAPI()) - Flags |= TBDFlags::InstallAPI; - { std::map<std::string, TargetList> valueToTargetList; for (const auto &it : File->umbrellas()) @@ -843,13 +821,10 @@ template <> struct MappingTraits<const InterfaceFile *> { auto handleSymbols = [](SectionList &CurrentSections, - InterfaceFile::const_filtered_symbol_range Symbols, - std::function<bool(const Symbol *)> Pred) { + InterfaceFile::const_filtered_symbol_range Symbols) { std::set<TargetList> TargetSet; std::map<const Symbol *, TargetList> SymbolToTargetList; for (const auto *Symbol : Symbols) { - if (!Pred(Symbol)) - continue; TargetList Targets(Symbol->targets()); SymbolToTargetList[Symbol] = Targets; TargetSet.emplace(std::move(Targets)); @@ -894,14 +869,9 @@ template <> struct MappingTraits<const InterfaceFile *> { } }; - handleSymbols(Exports, File->exports(), [](const Symbol *Symbol) { - return !Symbol->isReexported(); - }); - handleSymbols(Reexports, File->exports(), [](const Symbol *Symbol) { - return Symbol->isReexported(); - }); - handleSymbols(Undefineds, File->undefineds(), - [](const Symbol *Symbol) { return true; }); + handleSymbols(Exports, File->exports()); + handleSymbols(Reexports, File->reexports()); + handleSymbols(Undefineds, File->undefineds()); } const InterfaceFile *denormalize(IO &IO) { @@ -911,8 +881,6 @@ template <> struct MappingTraits<const InterfaceFile *> { auto *File = new InterfaceFile; File->setPath(Ctx->Path); File->setFileType(Ctx->FileKind); - for (auto &id : UUIDs) - File->addUUID(id.TargetID, id.Value); File->addTargets(Targets); File->setInstallName(InstallName); File->setCurrentVersion(CurrentVersion); @@ -924,7 +892,6 @@ template <> struct MappingTraits<const InterfaceFile *> { File->setTwoLevelNamespace(!(Flags & TBDFlags::FlatNamespace)); File->setApplicationExtensionSafe( !(Flags & TBDFlags::NotApplicationExtensionSafe)); - File->setInstallAPI(Flags & TBDFlags::InstallAPI); for (const auto &CurrentSection : AllowableClients) { for (const auto &lib : CurrentSection.Values) @@ -947,24 +914,28 @@ template <> struct MappingTraits<const InterfaceFile *> { for (auto &sym : CurrentSection.Classes) File->addSymbol(SymbolKind::ObjectiveCClass, sym, - CurrentSection.Targets); + CurrentSection.Targets, Flag); for (auto &sym : CurrentSection.ClassEHs) File->addSymbol(SymbolKind::ObjectiveCClassEHType, sym, - CurrentSection.Targets); + CurrentSection.Targets, Flag); for (auto &sym : CurrentSection.Ivars) File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, sym, - CurrentSection.Targets); + CurrentSection.Targets, Flag); - for (auto &sym : CurrentSection.WeakSymbols) + SymbolFlags SymFlag = (Flag == SymbolFlags::Undefined) + ? SymbolFlags::WeakReferenced + : SymbolFlags::WeakDefined; + for (auto &sym : CurrentSection.WeakSymbols) { File->addSymbol(SymbolKind::GlobalSymbol, sym, - CurrentSection.Targets, SymbolFlags::WeakDefined); + CurrentSection.Targets, Flag | SymFlag); + } for (auto &sym : CurrentSection.TlvSymbols) File->addSymbol(SymbolKind::GlobalSymbol, sym, CurrentSection.Targets, - SymbolFlags::ThreadLocalValue); + Flag | SymbolFlags::ThreadLocalValue); } }; @@ -1021,9 +992,10 @@ template <> struct MappingTraits<const InterfaceFile *> { static void mapKeysToValues(FileType FileKind, IO &IO, const InterfaceFile *&File) { MappingNormalization<NormalizedTBD, const InterfaceFile *> Keys(IO, File); + std::vector<UUID> EmptyUUID; IO.mapRequired("archs", Keys->Architectures); if (FileKind != FileType::TBD_V1) - IO.mapOptional("uuids", Keys->UUIDs); + IO.mapOptional("uuids", EmptyUUID); IO.mapRequired("platform", Keys->Platforms); if (FileKind != FileType::TBD_V1) IO.mapOptional("flags", Keys->Flags, TBDFlags::None); @@ -1051,10 +1023,11 @@ template <> struct MappingTraits<const InterfaceFile *> { static void mapKeysToValuesV4(IO &IO, const InterfaceFile *&File) { MappingNormalization<NormalizedTBD_V4, const InterfaceFile *> Keys(IO, File); + std::vector<UUIDv4> EmptyUUID; IO.mapTag("!tapi-tbd", true); IO.mapRequired("tbd-version", Keys->TBDVersion); IO.mapRequired("targets", Keys->Targets); - IO.mapOptional("uuids", Keys->UUIDs); + IO.mapOptional("uuids", EmptyUUID); IO.mapOptional("flags", Keys->Flags, TBDFlags::None); IO.mapRequired("install-name", Keys->InstallName); IO.mapOptional("current-version", Keys->CurrentVersion, @@ -1105,10 +1078,49 @@ static void DiagHandler(const SMDiagnostic &Diag, void *Context) { File->ErrorMessage = ("malformed file\n" + Message).str(); } +namespace { + +Expected<FileType> canReadFileType(MemoryBufferRef InputBuffer) { + auto TAPIFile = InputBuffer.getBuffer().trim(); + if (TAPIFile.startswith("{") && TAPIFile.endswith("}")) + return FileType::TBD_V5; + + if (!TAPIFile.endswith("...")) + return createStringError(std::errc::not_supported, "unsupported file type"); + + if (TAPIFile.startswith("--- !tapi-tbd\n")) + return FileType::TBD_V4; + + if (TAPIFile.startswith("--- !tapi-tbd-v3\n")) + return FileType::TBD_V3; + + if (TAPIFile.startswith("--- !tapi-tbd-v2\n")) + return FileType::TBD_V2; + + if (TAPIFile.startswith("--- !tapi-tbd-v1\n") || + TAPIFile.startswith("---\narchs:")) + return FileType::TBD_V1; + + return createStringError(std::errc::not_supported, "unsupported file type"); +} +} // namespace + Expected<std::unique_ptr<InterfaceFile>> TextAPIReader::get(MemoryBufferRef InputBuffer) { TextAPIContext Ctx; Ctx.Path = std::string(InputBuffer.getBufferIdentifier()); + if (auto FTOrErr = canReadFileType(InputBuffer)) + Ctx.FileKind = *FTOrErr; + else + return FTOrErr.takeError(); + + // Handle JSON Format. + if (Ctx.FileKind >= FileType::TBD_V5) { + auto FileOrErr = getInterfaceFileFromJSON(InputBuffer.getBuffer()); + if (!FileOrErr) + return FileOrErr.takeError(); + return std::move(*FileOrErr); + } yaml::Input YAMLIn(InputBuffer.getBuffer(), &Ctx, DiagHandler, &Ctx); // Fill vector with interface file objects created by parsing the YAML file. @@ -1130,10 +1142,17 @@ TextAPIReader::get(MemoryBufferRef InputBuffer) { return std::move(File); } -Error TextAPIWriter::writeToStream(raw_ostream &OS, const InterfaceFile &File) { +Error TextAPIWriter::writeToStream(raw_ostream &OS, const InterfaceFile &File, + bool Compact) { TextAPIContext Ctx; Ctx.Path = std::string(File.getPath()); Ctx.FileKind = File.getFileType(); + + // Write out in JSON format. + if (Ctx.FileKind >= FileType::TBD_V5) { + return serializeInterfaceFileToJSON(OS, File, Compact); + } + llvm::yaml::Output YAMLOut(OS, &Ctx, /*WrapColumn=*/80); std::vector<const InterfaceFile *> Files; |