summary refs log tree commit diff
path: root/pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch
blob: 9aae2be1d033d3fff6940734987c575f4c8613a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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<Token> _allowedClients;
+	std::vector<Token> _allowableClients;
 	std::vector<Token> _reexportedLibraries;
 	std::vector<Token> _symbols;
 	std::vector<Token> _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();
 	}