aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/TextAPI/TextStub.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-07-26 19:03:47 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-07-26 19:04:23 +0000
commit7fa27ce4a07f19b07799a767fc29416f3b625afb (patch)
tree27825c83636c4de341eb09a74f49f5d38a15d165 /llvm/lib/TextAPI/TextStub.cpp
parente3b557809604d036af6e00c60f012c2025b59a5e (diff)
Diffstat (limited to 'llvm/lib/TextAPI/TextStub.cpp')
-rw-r--r--llvm/lib/TextAPI/TextStub.cpp113
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;