aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp136
1 files changed, 66 insertions, 70 deletions
diff --git a/contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp b/contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp
index 78de3ebf3f3a..9fa1459e9557 100644
--- a/contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp
+++ b/contrib/llvm-project/llvm/lib/TextAPI/TextStub.cpp
@@ -360,6 +360,8 @@ template <> struct ScalarBitSetTraits<TBDFlags> {
IO.bitSetCase(Flags, "not_app_extension_safe",
TBDFlags::NotApplicationExtensionSafe);
IO.bitSetCase(Flags, "installapi", TBDFlags::InstallAPI);
+ IO.bitSetCase(Flags, "not_for_dyld_shared_cache",
+ TBDFlags::OSLibNotForSharedCache);
}
};
@@ -367,39 +369,12 @@ template <> struct ScalarTraits<Target> {
static void output(const Target &Value, void *, raw_ostream &OS) {
OS << Value.Arch << "-";
switch (Value.Platform) {
- default:
- OS << "unknown";
- break;
- case PLATFORM_MACOS:
- OS << "macos";
- break;
- case PLATFORM_IOS:
- OS << "ios";
- break;
- case PLATFORM_TVOS:
- OS << "tvos";
- break;
- case PLATFORM_WATCHOS:
- OS << "watchos";
- break;
- case PLATFORM_BRIDGEOS:
- OS << "bridgeos";
- break;
- case PLATFORM_MACCATALYST:
- OS << "maccatalyst";
- break;
- case PLATFORM_IOSSIMULATOR:
- OS << "ios-simulator";
- break;
- case PLATFORM_TVOSSIMULATOR:
- OS << "tvos-simulator";
- break;
- case PLATFORM_WATCHOSSIMULATOR:
- OS << "watchos-simulator";
- break;
- case PLATFORM_DRIVERKIT:
- OS << "driverkit";
- break;
+#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
+ marketing) \
+ case PLATFORM_##platform: \
+ OS << #tapi_target; \
+ break;
+#include "llvm/BinaryFormat/MachO.def"
}
}
@@ -620,6 +595,11 @@ template <> struct MappingTraits<const InterfaceFile *> {
!(Flags & TBDFlags::NotApplicationExtensionSafe));
}
+ // For older file formats, the segment where the symbol
+ // comes from is unknown, treat all symbols as Data
+ // in these cases.
+ const auto Flags = SymbolFlags::Data;
+
for (const auto &Section : Exports) {
const auto Targets =
synthesizeTargets(Section.Architectures, Platforms);
@@ -634,33 +614,34 @@ template <> struct MappingTraits<const InterfaceFile *> {
for (const auto &Symbol : Section.Symbols) {
if (Ctx->FileKind != FileType::TBD_V3 &&
- Symbol.value.startswith("_OBJC_EHTYPE_$_"))
+ Symbol.value.starts_with(ObjC2EHTypePrefix))
File->addSymbol(SymbolKind::ObjectiveCClassEHType,
- Symbol.value.drop_front(15), Targets);
+ Symbol.value.drop_front(15), Targets, Flags);
else
- File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets);
+ File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets, Flags);
}
for (auto &Symbol : Section.Classes) {
auto Name = Symbol.value;
if (Ctx->FileKind != FileType::TBD_V3)
Name = Name.drop_front();
- File->addSymbol(SymbolKind::ObjectiveCClass, Name, Targets);
+ File->addSymbol(SymbolKind::ObjectiveCClass, Name, Targets, Flags);
}
for (auto &Symbol : Section.ClassEHs)
- File->addSymbol(SymbolKind::ObjectiveCClassEHType, Symbol, Targets);
+ File->addSymbol(SymbolKind::ObjectiveCClassEHType, Symbol, Targets,
+ Flags);
for (auto &Symbol : Section.IVars) {
auto Name = Symbol.value;
if (Ctx->FileKind != FileType::TBD_V3)
Name = Name.drop_front();
- File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, Name,
- Targets);
+ File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, Name, Targets,
+ Flags);
}
for (auto &Symbol : Section.WeakDefSymbols)
File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets,
- SymbolFlags::WeakDefined);
+ SymbolFlags::WeakDefined | Flags);
for (auto &Symbol : Section.TLVSymbols)
File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets,
- SymbolFlags::ThreadLocalValue);
+ SymbolFlags::ThreadLocalValue | Flags);
}
for (const auto &Section : Undefineds) {
@@ -668,34 +649,35 @@ template <> struct MappingTraits<const InterfaceFile *> {
synthesizeTargets(Section.Architectures, Platforms);
for (auto &Symbol : Section.Symbols) {
if (Ctx->FileKind != FileType::TBD_V3 &&
- Symbol.value.startswith("_OBJC_EHTYPE_$_"))
+ Symbol.value.starts_with(ObjC2EHTypePrefix))
File->addSymbol(SymbolKind::ObjectiveCClassEHType,
Symbol.value.drop_front(15), Targets,
- SymbolFlags::Undefined);
+ SymbolFlags::Undefined | Flags);
else
File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets,
- SymbolFlags::Undefined);
+ SymbolFlags::Undefined | Flags);
}
for (auto &Symbol : Section.Classes) {
auto Name = Symbol.value;
if (Ctx->FileKind != FileType::TBD_V3)
Name = Name.drop_front();
File->addSymbol(SymbolKind::ObjectiveCClass, Name, Targets,
- SymbolFlags::Undefined);
+ SymbolFlags::Undefined | Flags);
}
for (auto &Symbol : Section.ClassEHs)
File->addSymbol(SymbolKind::ObjectiveCClassEHType, Symbol, Targets,
- SymbolFlags::Undefined);
+ SymbolFlags::Undefined | Flags);
for (auto &Symbol : Section.IVars) {
auto Name = Symbol.value;
if (Ctx->FileKind != FileType::TBD_V3)
Name = Name.drop_front();
File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, Name, Targets,
- SymbolFlags::Undefined);
+ SymbolFlags::Undefined | Flags);
}
for (auto &Symbol : Section.WeakRefSymbols)
File->addSymbol(SymbolKind::GlobalSymbol, Symbol, Targets,
- SymbolFlags::Undefined | SymbolFlags::WeakReferenced);
+ SymbolFlags::Undefined | SymbolFlags::WeakReferenced |
+ Flags);
}
return File;
@@ -787,7 +769,7 @@ template <> struct MappingTraits<const InterfaceFile *> {
NormalizedTBD_V4(IO &IO, const InterfaceFile *&File) {
auto Ctx = reinterpret_cast<TextAPIContext *>(IO.getContext());
assert(Ctx);
- TBDVersion = Ctx->FileKind >> 1;
+ TBDVersion = Ctx->FileKind >> 4;
Targets.insert(Targets.begin(), File->targets().begin(),
File->targets().end());
InstallName = File->getInstallName();
@@ -802,6 +784,9 @@ template <> struct MappingTraits<const InterfaceFile *> {
if (!File->isTwoLevelNamespace())
Flags |= TBDFlags::FlatNamespace;
+ if (File->isOSLibNotForSharedCache())
+ Flags |= TBDFlags::OSLibNotForSharedCache;
+
{
std::map<std::string, TargetList> valueToTargetList;
for (const auto &it : File->umbrellas())
@@ -892,6 +877,8 @@ template <> struct MappingTraits<const InterfaceFile *> {
File->setTwoLevelNamespace(!(Flags & TBDFlags::FlatNamespace));
File->setApplicationExtensionSafe(
!(Flags & TBDFlags::NotApplicationExtensionSafe));
+ File->setOSLibNotForSharedCache(
+ (Flags & TBDFlags::OSLibNotForSharedCache));
for (const auto &CurrentSection : AllowableClients) {
for (const auto &lib : CurrentSection.Values)
@@ -906,7 +893,12 @@ template <> struct MappingTraits<const InterfaceFile *> {
}
auto handleSymbols = [File](const SectionList &CurrentSections,
- SymbolFlags Flag = SymbolFlags::None) {
+ SymbolFlags InputFlag = SymbolFlags::None) {
+ // For older file formats, the segment where the symbol
+ // comes from is unknown, treat all symbols as Data
+ // in these cases.
+ const SymbolFlags Flag = InputFlag | SymbolFlags::Data;
+
for (const auto &CurrentSection : CurrentSections) {
for (auto &sym : CurrentSection.Symbols)
File->addSymbol(SymbolKind::GlobalSymbol, sym,
@@ -924,9 +916,10 @@ template <> struct MappingTraits<const InterfaceFile *> {
File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, sym,
CurrentSection.Targets, Flag);
- SymbolFlags SymFlag = (Flag == SymbolFlags::Undefined)
- ? SymbolFlags::WeakReferenced
- : SymbolFlags::WeakDefined;
+ SymbolFlags SymFlag =
+ ((Flag & SymbolFlags::Undefined) == SymbolFlags::Undefined)
+ ? SymbolFlags::WeakReferenced
+ : SymbolFlags::WeakDefined;
for (auto &sym : CurrentSection.WeakSymbols) {
File->addSymbol(SymbolKind::GlobalSymbol, sym,
CurrentSection.Targets, Flag | SymFlag);
@@ -1078,38 +1071,35 @@ static void DiagHandler(const SMDiagnostic &Diag, void *Context) {
File->ErrorMessage = ("malformed file\n" + Message).str();
}
-namespace {
-
-Expected<FileType> canReadFileType(MemoryBufferRef InputBuffer) {
+Expected<FileType> TextAPIReader::canRead(MemoryBufferRef InputBuffer) {
auto TAPIFile = InputBuffer.getBuffer().trim();
- if (TAPIFile.startswith("{") && TAPIFile.endswith("}"))
+ if (TAPIFile.starts_with("{") && TAPIFile.ends_with("}"))
return FileType::TBD_V5;
- if (!TAPIFile.endswith("..."))
+ if (!TAPIFile.ends_with("..."))
return createStringError(std::errc::not_supported, "unsupported file type");
- if (TAPIFile.startswith("--- !tapi-tbd\n"))
+ if (TAPIFile.starts_with("--- !tapi-tbd\n"))
return FileType::TBD_V4;
- if (TAPIFile.startswith("--- !tapi-tbd-v3\n"))
+ if (TAPIFile.starts_with("--- !tapi-tbd-v3\n"))
return FileType::TBD_V3;
- if (TAPIFile.startswith("--- !tapi-tbd-v2\n"))
+ if (TAPIFile.starts_with("--- !tapi-tbd-v2\n"))
return FileType::TBD_V2;
- if (TAPIFile.startswith("--- !tapi-tbd-v1\n") ||
- TAPIFile.startswith("---\narchs:"))
+ if (TAPIFile.starts_with("--- !tapi-tbd-v1\n") ||
+ TAPIFile.starts_with("---\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))
+ if (auto FTOrErr = canRead(InputBuffer))
Ctx.FileKind = *FTOrErr;
else
return FTOrErr.takeError();
@@ -1119,6 +1109,8 @@ TextAPIReader::get(MemoryBufferRef InputBuffer) {
auto FileOrErr = getInterfaceFileFromJSON(InputBuffer.getBuffer());
if (!FileOrErr)
return FileOrErr.takeError();
+
+ (*FileOrErr)->setPath(Ctx.Path);
return std::move(*FileOrErr);
}
yaml::Input YAMLIn(InputBuffer.getBuffer(), &Ctx, DiagHandler, &Ctx);
@@ -1143,14 +1135,18 @@ TextAPIReader::get(MemoryBufferRef InputBuffer) {
}
Error TextAPIWriter::writeToStream(raw_ostream &OS, const InterfaceFile &File,
- bool Compact) {
+ const FileType FileKind, bool Compact) {
TextAPIContext Ctx;
Ctx.Path = std::string(File.getPath());
- Ctx.FileKind = File.getFileType();
+
+ // Prefer parameter for format if passed, otherwise fallback to the File
+ // FileType.
+ Ctx.FileKind =
+ (FileKind == FileType::Invalid) ? File.getFileType() : FileKind;
// Write out in JSON format.
if (Ctx.FileKind >= FileType::TBD_V5) {
- return serializeInterfaceFileToJSON(OS, File, Compact);
+ return serializeInterfaceFileToJSON(OS, File, Ctx.FileKind, Compact);
}
llvm::yaml::Output YAMLOut(OS, &Ctx, /*WrapColumn=*/80);
@@ -1158,7 +1154,7 @@ Error TextAPIWriter::writeToStream(raw_ostream &OS, const InterfaceFile &File,
std::vector<const InterfaceFile *> Files;
Files.emplace_back(&File);
- for (auto Document : File.documents())
+ for (const auto &Document : File.documents())
Files.emplace_back(Document.get());
// Stream out yaml.