diff --git a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp index 09c0e12..ac6b085 100644 --- a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp +++ b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp @@ -187,6 +187,7 @@ struct DynamicLibrary { ld::File::ObjcConstraint _objcConstraint; Options::Platform _platform; std::vector _allowedClients; + std::vector _allowableClients; std::vector _reexportedLibraries; std::vector _symbols; std::vector _classes; @@ -246,6 +247,14 @@ class TBDFile { }); } + void parseAllowableClients(DynamicLibrary& lib) { + if ( !hasOptionalToken("allowable-clients") ) + return; + parseFlowSequence([&](Token name) { + lib._allowableClients.emplace_back(name); + }); + } + void parseReexportedDylibs(DynamicLibrary& lib) { if ( !hasOptionalToken("re-exports") ) return; @@ -306,6 +315,21 @@ class TBDFile { return false; } + void skipUUIDs(DynamicLibrary& lib) { + expectToken("uuids"); + while ( true ) { + auto token = next(); + if ( token == "]" ) + break; + } + } + + void skipParentUmbrella(DynamicLibrary& lib) { + if (!hasOptionalToken("parent-umbrella")) + return; + next(); + } + void parsePlatform(DynamicLibrary& lib) { expectToken("platform"); @@ -410,6 +434,7 @@ class TBDFile { } parseAllowedClients(lib); + parseAllowableClients(lib); parseReexportedDylibs(lib); parseSymbols(lib); if ( !hasOptionalToken("-") ) @@ -455,17 +480,21 @@ class TBDFile { return result.front(); } - void parseDocument(DynamicLibrary& lib, std::string &requestedArchName) { + void parseDocument(DynamicLibrary& lib, std::string &requestedArchName, bool isTbdV2) { auto selectedArchName = parseAndSelectArchitecture(requestedArchName); if (selectedArchName.empty()) throwf("invalid arch"); + if(isTbdV2) + skipUUIDs(lib); parsePlatform(lib); parseInstallName(lib); parseCurrentVersion(lib); parseCompatibilityVersion(lib); parseSwiftVersion(lib); parseObjCConstraint(lib); + if(isTbdV2) + skipParentUmbrella(lib); parseExportsBlock(lib, selectedArchName); } @@ -476,7 +505,8 @@ public: _tokenizer.reset(); DynamicLibrary lib; expectToken("---"); - parseDocument(lib, requestedArchName); + auto isTbdV2 = hasOptionalToken("!tapi-tbd-v2"); + parseDocument(lib, requestedArchName, isTbdV2); expectToken("..."); return lib; } @@ -486,6 +516,7 @@ public: auto token = next(); if ( token != "---" ) return false; + hasOptionalToken("!tapi-tbd-v2"); return !parseAndSelectArchitecture(requestedArchName).empty(); }