179320a0cSCyndy Ishida //===-- TextStubV5Tests.cpp - TBD V5 File Test ----------------------------===// 279320a0cSCyndy Ishida // 379320a0cSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 479320a0cSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information. 579320a0cSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 679320a0cSCyndy Ishida // 779320a0cSCyndy Ishida //===-----------------------------------------------------------------------===/ 879320a0cSCyndy Ishida 979320a0cSCyndy Ishida #include "TextStubHelpers.h" 1079320a0cSCyndy Ishida #include "llvm/TextAPI/InterfaceFile.h" 1179320a0cSCyndy Ishida #include "llvm/TextAPI/TextAPIReader.h" 1279320a0cSCyndy Ishida #include "llvm/TextAPI/TextAPIWriter.h" 1379320a0cSCyndy Ishida #include "gtest/gtest.h" 1479320a0cSCyndy Ishida #include <string> 1579320a0cSCyndy Ishida #include <vector> 1679320a0cSCyndy Ishida 1779320a0cSCyndy Ishida using namespace llvm; 1879320a0cSCyndy Ishida using namespace llvm::MachO; 1979320a0cSCyndy Ishida 2079320a0cSCyndy Ishida namespace TBDv5 { 2179320a0cSCyndy Ishida 2279320a0cSCyndy Ishida TEST(TBDv5, ReadFile) { 2379320a0cSCyndy Ishida static const char TBDv5File[] = R"({ 2479320a0cSCyndy Ishida "tapi_tbd_version": 5, 2579320a0cSCyndy Ishida "main_library": { 2679320a0cSCyndy Ishida "target_info": [ 2779320a0cSCyndy Ishida { 2879320a0cSCyndy Ishida "target": "x86_64-macos", 2979320a0cSCyndy Ishida "min_deployment": "10.14" 3079320a0cSCyndy Ishida }, 3179320a0cSCyndy Ishida { 3279320a0cSCyndy Ishida "target": "arm64-macos", 3379320a0cSCyndy Ishida "min_deployment": "10.14" 3479320a0cSCyndy Ishida }, 3579320a0cSCyndy Ishida { 3679320a0cSCyndy Ishida "target": "arm64-maccatalyst", 3779320a0cSCyndy Ishida "min_deployment": "12.1" 3879320a0cSCyndy Ishida } 3979320a0cSCyndy Ishida ], 4079320a0cSCyndy Ishida "flags": [ 4179320a0cSCyndy Ishida { 4279320a0cSCyndy Ishida "targets": [ 4379320a0cSCyndy Ishida "x86_64-macos" 4479320a0cSCyndy Ishida ], 4579320a0cSCyndy Ishida "attributes": [ 4679320a0cSCyndy Ishida "flat_namespace" 4779320a0cSCyndy Ishida ] 4879320a0cSCyndy Ishida } 4979320a0cSCyndy Ishida ], 5079320a0cSCyndy Ishida "install_names": [ 5179320a0cSCyndy Ishida { 5279320a0cSCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 5379320a0cSCyndy Ishida } 5479320a0cSCyndy Ishida ], 5579320a0cSCyndy Ishida "current_versions": [ 5679320a0cSCyndy Ishida { 5779320a0cSCyndy Ishida "version": "1.2" 5879320a0cSCyndy Ishida } 5979320a0cSCyndy Ishida ], 6079320a0cSCyndy Ishida "compatibility_versions": [ 6179320a0cSCyndy Ishida { "version": "1.1" } 6279320a0cSCyndy Ishida ], 6379320a0cSCyndy Ishida "rpaths": [ 6479320a0cSCyndy Ishida { 6579320a0cSCyndy Ishida "targets": [ 6679320a0cSCyndy Ishida "x86_64-macos" 6779320a0cSCyndy Ishida ], 6879320a0cSCyndy Ishida "paths": [ 6979320a0cSCyndy Ishida "@executable_path/.../Frameworks" 7079320a0cSCyndy Ishida ] 7179320a0cSCyndy Ishida } 7279320a0cSCyndy Ishida ], 7379320a0cSCyndy Ishida "parent_umbrellas": [ 7479320a0cSCyndy Ishida { 7579320a0cSCyndy Ishida "umbrella": "System" 7679320a0cSCyndy Ishida } 7779320a0cSCyndy Ishida ], 7879320a0cSCyndy Ishida "allowable_clients": [ 7979320a0cSCyndy Ishida { 8079320a0cSCyndy Ishida "clients": [ 8179320a0cSCyndy Ishida "ClientA", 8279320a0cSCyndy Ishida "ClientB" 8379320a0cSCyndy Ishida ] 8479320a0cSCyndy Ishida } 8579320a0cSCyndy Ishida ], 8679320a0cSCyndy Ishida "reexported_libraries": [ 8779320a0cSCyndy Ishida { 8879320a0cSCyndy Ishida "names": [ 8979320a0cSCyndy Ishida "/u/l/l/libfoo.dylib", 9079320a0cSCyndy Ishida "/u/l/l/libbar.dylib" 9179320a0cSCyndy Ishida ] 9279320a0cSCyndy Ishida } 9379320a0cSCyndy Ishida ], 9479320a0cSCyndy Ishida "exported_symbols": [ 9579320a0cSCyndy Ishida { 9679320a0cSCyndy Ishida "targets": [ 9779320a0cSCyndy Ishida "x86_64-macos", 9879320a0cSCyndy Ishida "arm64-macos" 9979320a0cSCyndy Ishida ], 10079320a0cSCyndy Ishida "data": { 10179320a0cSCyndy Ishida "global": [ 10279320a0cSCyndy Ishida "_global" 10379320a0cSCyndy Ishida ], 10479320a0cSCyndy Ishida "objc_class": [ 10579320a0cSCyndy Ishida "ClassA" 10679320a0cSCyndy Ishida ], 10779320a0cSCyndy Ishida "weak": [], 10879320a0cSCyndy Ishida "thread_local": [] 10979320a0cSCyndy Ishida }, 11079320a0cSCyndy Ishida "text": { 11179320a0cSCyndy Ishida "global": [ 11279320a0cSCyndy Ishida "_func" 11379320a0cSCyndy Ishida ], 11479320a0cSCyndy Ishida "weak": [], 11579320a0cSCyndy Ishida "thread_local": [] 11679320a0cSCyndy Ishida } 11779320a0cSCyndy Ishida }, 11879320a0cSCyndy Ishida { 11979320a0cSCyndy Ishida "targets": [ 12079320a0cSCyndy Ishida "x86_64-macos" 12179320a0cSCyndy Ishida ], 12279320a0cSCyndy Ishida "data": { 12379320a0cSCyndy Ishida "global": [ 12479320a0cSCyndy Ishida "_globalVar" 12579320a0cSCyndy Ishida ], 12679320a0cSCyndy Ishida "objc_class": [ 1270882c70dSCyndy Ishida "ClassA", 1280882c70dSCyndy Ishida "ClassB", 12979320a0cSCyndy Ishida "ClassData" 13079320a0cSCyndy Ishida ], 13179320a0cSCyndy Ishida "objc_eh_type": [ 13279320a0cSCyndy Ishida "ClassA", 13379320a0cSCyndy Ishida "ClassB" 13479320a0cSCyndy Ishida ], 13579320a0cSCyndy Ishida "objc_ivar": [ 13679320a0cSCyndy Ishida "ClassA.ivar1", 13779320a0cSCyndy Ishida "ClassA.ivar2", 13879320a0cSCyndy Ishida "ClassC.ivar1" 13979320a0cSCyndy Ishida ] 14079320a0cSCyndy Ishida }, 14179320a0cSCyndy Ishida "text": { 14279320a0cSCyndy Ishida "global": [ 14379320a0cSCyndy Ishida "_funcFoo" 14479320a0cSCyndy Ishida ] 14579320a0cSCyndy Ishida } 14679320a0cSCyndy Ishida } 14779320a0cSCyndy Ishida ], 14879320a0cSCyndy Ishida "reexported_symbols": [ 14979320a0cSCyndy Ishida { 15079320a0cSCyndy Ishida "targets": [ 15179320a0cSCyndy Ishida "x86_64-macos", 15279320a0cSCyndy Ishida "arm64-macos" 15379320a0cSCyndy Ishida ], 15479320a0cSCyndy Ishida "data": { 15579320a0cSCyndy Ishida "global": [ 15679320a0cSCyndy Ishida "_globalRe" 15779320a0cSCyndy Ishida ], 15879320a0cSCyndy Ishida "objc_class": [ 15979320a0cSCyndy Ishida "ClassRexport" 16079320a0cSCyndy Ishida ] 16179320a0cSCyndy Ishida }, 16279320a0cSCyndy Ishida "text": { 16379320a0cSCyndy Ishida "global": [ 16479320a0cSCyndy Ishida "_funcA" 16579320a0cSCyndy Ishida ] 16679320a0cSCyndy Ishida } 16779320a0cSCyndy Ishida } 16879320a0cSCyndy Ishida ], 16979320a0cSCyndy Ishida "undefined_symbols": [ 17079320a0cSCyndy Ishida { 17179320a0cSCyndy Ishida "targets": [ 17279320a0cSCyndy Ishida "x86_64-macos" 17379320a0cSCyndy Ishida ], 17479320a0cSCyndy Ishida "data": { 17579320a0cSCyndy Ishida "global": [ 17679320a0cSCyndy Ishida "_globalBind" 17779320a0cSCyndy Ishida ], 17879320a0cSCyndy Ishida "weak": [ 17979320a0cSCyndy Ishida "referenced_sym" 18079320a0cSCyndy Ishida ] 18179320a0cSCyndy Ishida } 18279320a0cSCyndy Ishida } 18379320a0cSCyndy Ishida ] 18479320a0cSCyndy Ishida }, 18579320a0cSCyndy Ishida "libraries": [] 18679320a0cSCyndy Ishida })"; 18779320a0cSCyndy Ishida 188455bf3d1SCyndy Ishida MemoryBufferRef InputBuf = MemoryBufferRef(TBDv5File, "Test.tbd"); 189455bf3d1SCyndy Ishida Expected<FileType> ExpectedFT = TextAPIReader::canRead(InputBuf); 190455bf3d1SCyndy Ishida EXPECT_TRUE(!!ExpectedFT); 191455bf3d1SCyndy Ishida 192455bf3d1SCyndy Ishida Expected<TBDFile> Result = TextAPIReader::get(InputBuf); 19379320a0cSCyndy Ishida EXPECT_TRUE(!!Result); 19479320a0cSCyndy Ishida TBDFile File = std::move(Result.get()); 19579320a0cSCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 196455bf3d1SCyndy Ishida EXPECT_EQ(*ExpectedFT, File->getFileType()); 19779320a0cSCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName()); 19879320a0cSCyndy Ishida 19979320a0cSCyndy Ishida TargetList AllTargets = { 200b70d87bcSCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 201f991f308SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)), 202f991f308SCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)), 20379320a0cSCyndy Ishida }; 204f9fe6032SCyndy Ishida std::set<Target> FileTargets{File->targets().begin(), File->targets().end()}; 20579320a0cSCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), File->getPlatforms()); 20679320a0cSCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), File->getArchitectures()); 207f9fe6032SCyndy Ishida EXPECT_EQ(FileTargets.size(), AllTargets.size()); 208f9fe6032SCyndy Ishida for (const auto &Targ : AllTargets) { 209f9fe6032SCyndy Ishida auto FileTarg = FileTargets.find(Targ); 210f9fe6032SCyndy Ishida EXPECT_FALSE(FileTarg == FileTargets.end()); 211f9fe6032SCyndy Ishida EXPECT_EQ(*FileTarg, Targ); 212f9fe6032SCyndy Ishida PackedVersion MD = Targ.MinDeployment; 213f9fe6032SCyndy Ishida PackedVersion FileMD = FileTarg->MinDeployment; 214f9fe6032SCyndy Ishida EXPECT_EQ(MD, FileMD); 215f9fe6032SCyndy Ishida } 21679320a0cSCyndy Ishida 21779320a0cSCyndy Ishida EXPECT_EQ(PackedVersion(1, 2, 0), File->getCurrentVersion()); 21879320a0cSCyndy Ishida EXPECT_EQ(PackedVersion(1, 1, 0), File->getCompatibilityVersion()); 21979320a0cSCyndy Ishida EXPECT_TRUE(File->isApplicationExtensionSafe()); 22079320a0cSCyndy Ishida EXPECT_FALSE(File->isTwoLevelNamespace()); 221e17efa60SCyndy Ishida EXPECT_FALSE(File->isOSLibNotForSharedCache()); 22279320a0cSCyndy Ishida EXPECT_EQ(0U, File->documents().size()); 22379320a0cSCyndy Ishida 22479320a0cSCyndy Ishida InterfaceFileRef ClientA("ClientA", AllTargets); 22579320a0cSCyndy Ishida InterfaceFileRef ClientB("ClientB", AllTargets); 22679320a0cSCyndy Ishida EXPECT_EQ(2U, File->allowableClients().size()); 22779320a0cSCyndy Ishida EXPECT_EQ(ClientA, File->allowableClients().at(0)); 22879320a0cSCyndy Ishida EXPECT_EQ(ClientB, File->allowableClients().at(1)); 22979320a0cSCyndy Ishida 23079320a0cSCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets); 23179320a0cSCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets); 23279320a0cSCyndy Ishida EXPECT_EQ(2U, File->reexportedLibraries().size()); 23379320a0cSCyndy Ishida EXPECT_EQ(ReexportA, File->reexportedLibraries().at(0)); 23479320a0cSCyndy Ishida EXPECT_EQ(ReexportB, File->reexportedLibraries().at(1)); 23579320a0cSCyndy Ishida 236b70d87bcSCyndy Ishida TargetToAttr RPaths = { 237b70d87bcSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS), "@executable_path/.../Frameworks"}, 238b70d87bcSCyndy Ishida }; 239b70d87bcSCyndy Ishida EXPECT_EQ(RPaths, File->rpaths()); 240b70d87bcSCyndy Ishida 241b70d87bcSCyndy Ishida TargetToAttr Umbrellas = {{Target(AK_x86_64, PLATFORM_MACOS), "System"}, 24279320a0cSCyndy Ishida {Target(AK_arm64, PLATFORM_MACOS), "System"}, 24379320a0cSCyndy Ishida {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}}; 24479320a0cSCyndy Ishida EXPECT_EQ(Umbrellas, File->umbrellas()); 24579320a0cSCyndy Ishida 24679320a0cSCyndy Ishida ExportedSymbolSeq Exports, Reexports, Undefineds; 24779320a0cSCyndy Ishida for (const auto *Sym : File->symbols()) { 24879320a0cSCyndy Ishida TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()}; 24979320a0cSCyndy Ishida ExportedSymbol Temp = 250b70d87bcSCyndy Ishida ExportedSymbol{Sym->getKind(), 251b70d87bcSCyndy Ishida std::string(Sym->getName()), 25279320a0cSCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 253b70d87bcSCyndy Ishida Sym->isThreadLocalValue(), 254b70d87bcSCyndy Ishida Sym->isData(), 255b70d87bcSCyndy Ishida SymTargets}; 25679320a0cSCyndy Ishida if (Sym->isUndefined()) 25779320a0cSCyndy Ishida Undefineds.emplace_back(std::move(Temp)); 25879320a0cSCyndy Ishida else 25979320a0cSCyndy Ishida Sym->isReexported() ? Reexports.emplace_back(std::move(Temp)) 26079320a0cSCyndy Ishida : Exports.emplace_back(std::move(Temp)); 26179320a0cSCyndy Ishida } 26279320a0cSCyndy Ishida llvm::sort(Exports); 26379320a0cSCyndy Ishida llvm::sort(Reexports); 26479320a0cSCyndy Ishida llvm::sort(Undefineds); 26579320a0cSCyndy Ishida 26679320a0cSCyndy Ishida TargetList MacOSTargets = {Target(AK_x86_64, PLATFORM_MACOS), 26779320a0cSCyndy Ishida Target(AK_arm64, PLATFORM_MACOS)}; 26879320a0cSCyndy Ishida 26979320a0cSCyndy Ishida std::vector<ExportedSymbol> ExpectedExportedSymbols = { 270d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets}, 271d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 27279320a0cSCyndy Ishida "_funcFoo", 27379320a0cSCyndy Ishida false, 27479320a0cSCyndy Ishida false, 275b70d87bcSCyndy Ishida false, 27679320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 277d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets}, 278d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 27979320a0cSCyndy Ishida "_globalVar", 28079320a0cSCyndy Ishida false, 28179320a0cSCyndy Ishida false, 282b70d87bcSCyndy Ishida true, 28379320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 284d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 2850882c70dSCyndy Ishida "ClassA", 2860882c70dSCyndy Ishida false, 2870882c70dSCyndy Ishida false, 2880882c70dSCyndy Ishida true, 2890882c70dSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 290d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 2910882c70dSCyndy Ishida "ClassB", 2920882c70dSCyndy Ishida false, 2930882c70dSCyndy Ishida false, 2940882c70dSCyndy Ishida true, 2950882c70dSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 296d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 29779320a0cSCyndy Ishida "ClassData", 29879320a0cSCyndy Ishida false, 29979320a0cSCyndy Ishida false, 300b70d87bcSCyndy Ishida true, 30179320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 302d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 30379320a0cSCyndy Ishida "ClassA", 30479320a0cSCyndy Ishida false, 30579320a0cSCyndy Ishida false, 306b70d87bcSCyndy Ishida true, 30779320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 308d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 30979320a0cSCyndy Ishida "ClassB", 31079320a0cSCyndy Ishida false, 31179320a0cSCyndy Ishida false, 312b70d87bcSCyndy Ishida true, 31379320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 314d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 31579320a0cSCyndy Ishida "ClassA.ivar1", 31679320a0cSCyndy Ishida false, 31779320a0cSCyndy Ishida false, 318b70d87bcSCyndy Ishida true, 31979320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 320d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 32179320a0cSCyndy Ishida "ClassA.ivar2", 32279320a0cSCyndy Ishida false, 32379320a0cSCyndy Ishida false, 324b70d87bcSCyndy Ishida true, 32579320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 326d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 32779320a0cSCyndy Ishida "ClassC.ivar1", 32879320a0cSCyndy Ishida false, 32979320a0cSCyndy Ishida false, 330b70d87bcSCyndy Ishida true, 33179320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 33279320a0cSCyndy Ishida }; 33379320a0cSCyndy Ishida std::vector<ExportedSymbol> ExpectedReexportedSymbols = { 334d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets}, 335d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets}, 336d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true, 337b70d87bcSCyndy Ishida MacOSTargets}, 33879320a0cSCyndy Ishida }; 33979320a0cSCyndy Ishida 34079320a0cSCyndy Ishida std::vector<ExportedSymbol> ExpectedUndefinedSymbols = { 341d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 34279320a0cSCyndy Ishida "_globalBind", 34379320a0cSCyndy Ishida false, 34479320a0cSCyndy Ishida false, 345b70d87bcSCyndy Ishida true, 34679320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 347d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 34879320a0cSCyndy Ishida "referenced_sym", 34979320a0cSCyndy Ishida true, 35079320a0cSCyndy Ishida false, 351b70d87bcSCyndy Ishida true, 35279320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 35379320a0cSCyndy Ishida }; 35479320a0cSCyndy Ishida 35579320a0cSCyndy Ishida EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size()); 35679320a0cSCyndy Ishida EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size()); 35779320a0cSCyndy Ishida EXPECT_EQ(ExpectedUndefinedSymbols.size(), Undefineds.size()); 35879320a0cSCyndy Ishida EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(), 35979320a0cSCyndy Ishida std::begin(ExpectedExportedSymbols))); 36079320a0cSCyndy Ishida EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(), 36179320a0cSCyndy Ishida std::begin(ExpectedReexportedSymbols))); 36279320a0cSCyndy Ishida EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(), 36379320a0cSCyndy Ishida std::begin(ExpectedUndefinedSymbols))); 3640882c70dSCyndy Ishida 3650882c70dSCyndy Ishida EXPECT_TRUE( 366d9a9872eSCyndy Ishida File->getSymbol(EncodeKind::GlobalSymbol, "_globalBind").has_value()); 36779320a0cSCyndy Ishida } 36879320a0cSCyndy Ishida 36979320a0cSCyndy Ishida TEST(TBDv5, ReadMultipleTargets) { 37079320a0cSCyndy Ishida static const char TBDv5File[] = R"({ 37179320a0cSCyndy Ishida "tapi_tbd_version": 5, 37279320a0cSCyndy Ishida "main_library": { 37379320a0cSCyndy Ishida "target_info": [ 37479320a0cSCyndy Ishida { 37579320a0cSCyndy Ishida "target": "x86_64-macos", 37679320a0cSCyndy Ishida "min_deployment": "10.14" 37779320a0cSCyndy Ishida }, 37879320a0cSCyndy Ishida { 37979320a0cSCyndy Ishida "target": "arm64-macos", 38079320a0cSCyndy Ishida "min_deployment": "10.14" 38179320a0cSCyndy Ishida }, 38279320a0cSCyndy Ishida { 38379320a0cSCyndy Ishida "target": "arm64-maccatalyst", 38479320a0cSCyndy Ishida "min_deployment": "12.1" 38579320a0cSCyndy Ishida } 38679320a0cSCyndy Ishida ], 38779320a0cSCyndy Ishida "install_names":[ 38879320a0cSCyndy Ishida { "name":"/usr/lib/libFoo.dylib" } 38979320a0cSCyndy Ishida ], 39079320a0cSCyndy Ishida "swift_abi":[ { "abi":8 } ], 39179320a0cSCyndy Ishida "reexported_libraries": [ 39279320a0cSCyndy Ishida { 39379320a0cSCyndy Ishida "targets": [ "x86_64-maccatalyst" ], 39479320a0cSCyndy Ishida "names": [ 39579320a0cSCyndy Ishida "/u/l/l/libfoo.dylib", 39679320a0cSCyndy Ishida "/u/l/l/libbar.dylib" 39779320a0cSCyndy Ishida ] 39879320a0cSCyndy Ishida }, 39979320a0cSCyndy Ishida { 40079320a0cSCyndy Ishida "targets": [ "arm64-maccatalyst" ], 40179320a0cSCyndy Ishida "names": [ "/u/l/l/libArmOnly.dylib" ] 40279320a0cSCyndy Ishida } 40379320a0cSCyndy Ishida ] 40479320a0cSCyndy Ishida } 40579320a0cSCyndy Ishida })"; 40679320a0cSCyndy Ishida 40779320a0cSCyndy Ishida Expected<TBDFile> Result = 40879320a0cSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 40979320a0cSCyndy Ishida EXPECT_TRUE(!!Result); 41079320a0cSCyndy Ishida TBDFile File = std::move(Result.get()); 41179320a0cSCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 41279320a0cSCyndy Ishida EXPECT_EQ(std::string("/usr/lib/libFoo.dylib"), File->getInstallName()); 41379320a0cSCyndy Ishida EXPECT_TRUE(File->isApplicationExtensionSafe()); 41479320a0cSCyndy Ishida EXPECT_TRUE(File->isTwoLevelNamespace()); 41579320a0cSCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion()); 41679320a0cSCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion()); 41779320a0cSCyndy Ishida EXPECT_EQ(8U, File->getSwiftABIVersion()); 41879320a0cSCyndy Ishida 41979320a0cSCyndy Ishida TargetList AllTargets = { 420b70d87bcSCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 421b70d87bcSCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(10, 14)), 422b70d87bcSCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(12, 1)), 42379320a0cSCyndy Ishida }; 42479320a0cSCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), File->getPlatforms()); 42579320a0cSCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), File->getArchitectures()); 42679320a0cSCyndy Ishida 42779320a0cSCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libArmOnly.dylib", 42879320a0cSCyndy Ishida {Target(AK_arm64, PLATFORM_MACCATALYST)}); 42979320a0cSCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libbar.dylib", 43079320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACCATALYST)}); 43179320a0cSCyndy Ishida InterfaceFileRef ReexportC("/u/l/l/libfoo.dylib", 43279320a0cSCyndy Ishida {Target(AK_x86_64, PLATFORM_MACCATALYST)}); 43379320a0cSCyndy Ishida EXPECT_EQ(3U, File->reexportedLibraries().size()); 43479320a0cSCyndy Ishida EXPECT_EQ(ReexportA, File->reexportedLibraries().at(0)); 43579320a0cSCyndy Ishida EXPECT_EQ(ReexportB, File->reexportedLibraries().at(1)); 43679320a0cSCyndy Ishida EXPECT_EQ(ReexportC, File->reexportedLibraries().at(2)); 43779320a0cSCyndy Ishida } 43879320a0cSCyndy Ishida 43979320a0cSCyndy Ishida TEST(TBDv5, ReadMultipleDocuments) { 44079320a0cSCyndy Ishida static const char TBDv5File[] = R"({ 44179320a0cSCyndy Ishida "tapi_tbd_version": 5, 44279320a0cSCyndy Ishida "main_library": { 44379320a0cSCyndy Ishida "target_info": [ 44479320a0cSCyndy Ishida { 44579320a0cSCyndy Ishida "target": "armv7-ios", 44679320a0cSCyndy Ishida "min_deployment": "11.0" 44779320a0cSCyndy Ishida } 44879320a0cSCyndy Ishida ], 44979320a0cSCyndy Ishida "install_names":[ 45079320a0cSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 45179320a0cSCyndy Ishida ], 45279320a0cSCyndy Ishida "reexported_libraries": [ 45379320a0cSCyndy Ishida { "names": ["/u/l/l/libfoo.dylib"] } 45479320a0cSCyndy Ishida ] 45579320a0cSCyndy Ishida }, 45679320a0cSCyndy Ishida "libraries": [ 45779320a0cSCyndy Ishida { 45879320a0cSCyndy Ishida "target_info": [ 45979320a0cSCyndy Ishida { 46079320a0cSCyndy Ishida "target": "armv7-ios", 46179320a0cSCyndy Ishida "min_deployment": "11.0" 46279320a0cSCyndy Ishida } 46379320a0cSCyndy Ishida ], 46479320a0cSCyndy Ishida "install_names":[ 46579320a0cSCyndy Ishida { "name":"/u/l/l/libfoo.dylib" } 46679320a0cSCyndy Ishida ], 46779320a0cSCyndy Ishida "flags":[ 46879320a0cSCyndy Ishida { "attributes": ["not_app_extension_safe"] } 46979320a0cSCyndy Ishida ], 47079320a0cSCyndy Ishida "exported_symbols": [ 47179320a0cSCyndy Ishida { 47279320a0cSCyndy Ishida "data": { 47379320a0cSCyndy Ishida "thread_local": [ "_globalVar" ], 4740882c70dSCyndy Ishida "objc_class": [ "ClassData", "ClassA", "ClassB"], 47579320a0cSCyndy Ishida "objc_eh_type": [ "ClassA", "ClassB" ] 47679320a0cSCyndy Ishida }, 47779320a0cSCyndy Ishida "text": { 47879320a0cSCyndy Ishida "global": [ "_funcFoo" ] 47979320a0cSCyndy Ishida } 48079320a0cSCyndy Ishida } 48179320a0cSCyndy Ishida ] 48279320a0cSCyndy Ishida } 48379320a0cSCyndy Ishida ]})"; 48479320a0cSCyndy Ishida 48579320a0cSCyndy Ishida Expected<TBDFile> Result = 48679320a0cSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 48779320a0cSCyndy Ishida EXPECT_TRUE(!!Result); 48879320a0cSCyndy Ishida TBDFile File = std::move(Result.get()); 48979320a0cSCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 49079320a0cSCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName()); 49179320a0cSCyndy Ishida EXPECT_TRUE(File->isTwoLevelNamespace()); 49279320a0cSCyndy Ishida EXPECT_TRUE(File->isApplicationExtensionSafe()); 49379320a0cSCyndy Ishida 49479320a0cSCyndy Ishida TargetList Targets(File->targets().begin(), File->targets().end()); 495b70d87bcSCyndy Ishida Target iOSTarget(AK_armv7, PLATFORM_IOS, VersionTuple(11, 0)); 49679320a0cSCyndy Ishida EXPECT_EQ(TargetList{iOSTarget}, Targets); 49779320a0cSCyndy Ishida std::vector<const Symbol *> Symbols(File->symbols().begin(), 49879320a0cSCyndy Ishida File->symbols().end()); 49979320a0cSCyndy Ishida EXPECT_EQ(0U, Symbols.size()); 50079320a0cSCyndy Ishida 50179320a0cSCyndy Ishida InterfaceFileRef Reexport("/u/l/l/libfoo.dylib", {iOSTarget}); 50279320a0cSCyndy Ishida EXPECT_EQ(1U, File->reexportedLibraries().size()); 50379320a0cSCyndy Ishida EXPECT_EQ(Reexport, File->reexportedLibraries().at(0)); 50479320a0cSCyndy Ishida 50579320a0cSCyndy Ishida // Check inlined library. 50679320a0cSCyndy Ishida EXPECT_EQ(1U, File->documents().size()); 50779320a0cSCyndy Ishida TBDReexportFile Document = File->documents().front(); 50879320a0cSCyndy Ishida Targets = {Document->targets().begin(), Document->targets().end()}; 50979320a0cSCyndy Ishida EXPECT_EQ(TargetList{iOSTarget}, Targets); 51079320a0cSCyndy Ishida EXPECT_EQ(std::string("/u/l/l/libfoo.dylib"), Document->getInstallName()); 51179320a0cSCyndy Ishida EXPECT_EQ(0U, Document->getSwiftABIVersion()); 51279320a0cSCyndy Ishida EXPECT_TRUE(Document->isTwoLevelNamespace()); 51379320a0cSCyndy Ishida EXPECT_FALSE(Document->isApplicationExtensionSafe()); 51479320a0cSCyndy Ishida 51579320a0cSCyndy Ishida ExportedSymbolSeq Exports; 51679320a0cSCyndy Ishida for (const auto *Sym : Document->symbols()) 51779320a0cSCyndy Ishida Exports.emplace_back( 51879320a0cSCyndy Ishida ExportedSymbol{Sym->getKind(), 51979320a0cSCyndy Ishida std::string(Sym->getName()), 52079320a0cSCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 52179320a0cSCyndy Ishida Sym->isThreadLocalValue(), 522b70d87bcSCyndy Ishida Sym->isData(), 52379320a0cSCyndy Ishida {iOSTarget}}); 52479320a0cSCyndy Ishida 52579320a0cSCyndy Ishida llvm::sort(Exports); 52679320a0cSCyndy Ishida ExportedSymbolSeq ExpectedExports = { 527d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcFoo", false, false, false, {iOSTarget}}, 528d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalVar", false, true, true, {iOSTarget}}, 529d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, {iOSTarget}}, 530d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassB", false, false, true, {iOSTarget}}, 531d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 532b70d87bcSCyndy Ishida "ClassData", 533b70d87bcSCyndy Ishida false, 534b70d87bcSCyndy Ishida false, 535b70d87bcSCyndy Ishida true, 536b70d87bcSCyndy Ishida {iOSTarget}}, 537d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 538b70d87bcSCyndy Ishida "ClassA", 539b70d87bcSCyndy Ishida false, 540b70d87bcSCyndy Ishida false, 541b70d87bcSCyndy Ishida true, 542b70d87bcSCyndy Ishida {iOSTarget}}, 543d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 544b70d87bcSCyndy Ishida "ClassB", 545b70d87bcSCyndy Ishida false, 546b70d87bcSCyndy Ishida false, 547b70d87bcSCyndy Ishida true, 548b70d87bcSCyndy Ishida {iOSTarget}}, 54979320a0cSCyndy Ishida }; 55079320a0cSCyndy Ishida 55179320a0cSCyndy Ishida EXPECT_EQ(ExpectedExports.size(), Exports.size()); 55279320a0cSCyndy Ishida EXPECT_TRUE( 55379320a0cSCyndy Ishida std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports))); 55479320a0cSCyndy Ishida } 55579320a0cSCyndy Ishida 556d6f9b97bSCyndy Ishida TEST(TBDv5, WriteFile) { 557d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 558d6f9b97bSCyndy Ishida "tapi_tbd_version": 5, 559d6f9b97bSCyndy Ishida "main_library": { 560d6f9b97bSCyndy Ishida "target_info": [ 561d6f9b97bSCyndy Ishida { 562d6f9b97bSCyndy Ishida "target": "x86_64-macos", 563d6f9b97bSCyndy Ishida "min_deployment": "10.14" 564d6f9b97bSCyndy Ishida }, 565d6f9b97bSCyndy Ishida { 566d6f9b97bSCyndy Ishida "target": "arm64-macos", 567d6f9b97bSCyndy Ishida "min_deployment": "10.14" 568d6f9b97bSCyndy Ishida }, 569d6f9b97bSCyndy Ishida { 570d6f9b97bSCyndy Ishida "target": "arm64-maccatalyst", 571d6f9b97bSCyndy Ishida "min_deployment": "12.1" 572d6f9b97bSCyndy Ishida } 573d6f9b97bSCyndy Ishida ], 574d6f9b97bSCyndy Ishida "install_names": [ 575d6f9b97bSCyndy Ishida { 576d6f9b97bSCyndy Ishida "name": "@rpath/S/L/F/Foo.framework/Foo" 577d6f9b97bSCyndy Ishida } 578d6f9b97bSCyndy Ishida ], 579d6f9b97bSCyndy Ishida "current_versions": [ 580d6f9b97bSCyndy Ishida { 581d6f9b97bSCyndy Ishida "version": "1.2" 582d6f9b97bSCyndy Ishida } 583d6f9b97bSCyndy Ishida ], 584d6f9b97bSCyndy Ishida "compatibility_versions": [ 585d6f9b97bSCyndy Ishida { "version": "1.1" } 586d6f9b97bSCyndy Ishida ], 587d6f9b97bSCyndy Ishida "flags": [ 588d6f9b97bSCyndy Ishida { 589d6f9b97bSCyndy Ishida "attributes": [ 590d6f9b97bSCyndy Ishida "flat_namespace" 591d6f9b97bSCyndy Ishida ] 592d6f9b97bSCyndy Ishida } 593d6f9b97bSCyndy Ishida ], 594d6f9b97bSCyndy Ishida "rpaths": [ 595d6f9b97bSCyndy Ishida { 596d6f9b97bSCyndy Ishida "targets": [ 597d6f9b97bSCyndy Ishida "x86_64-macos" 598d6f9b97bSCyndy Ishida ], 599d6f9b97bSCyndy Ishida "paths": [ 600d6f9b97bSCyndy Ishida "@executable_path/.../Frameworks" 601d6f9b97bSCyndy Ishida ] 602d6f9b97bSCyndy Ishida } 603d6f9b97bSCyndy Ishida ], 604d6f9b97bSCyndy Ishida "parent_umbrellas": [ 605d6f9b97bSCyndy Ishida { 606d6f9b97bSCyndy Ishida "umbrella": "System" 607d6f9b97bSCyndy Ishida } 608d6f9b97bSCyndy Ishida ], 609d6f9b97bSCyndy Ishida "allowable_clients": [ 610d6f9b97bSCyndy Ishida { 611d6f9b97bSCyndy Ishida "clients": [ 612d6f9b97bSCyndy Ishida "ClientA", 613d6f9b97bSCyndy Ishida "ClientB" 614d6f9b97bSCyndy Ishida ] 615d6f9b97bSCyndy Ishida } 616d6f9b97bSCyndy Ishida ], 617d6f9b97bSCyndy Ishida "reexported_libraries": [ 618d6f9b97bSCyndy Ishida { 619d6f9b97bSCyndy Ishida "names": [ 620d6f9b97bSCyndy Ishida "/u/l/l/libfoo.dylib", 621d6f9b97bSCyndy Ishida "/u/l/l/libbar.dylib" 622d6f9b97bSCyndy Ishida ] 623d6f9b97bSCyndy Ishida } 624d6f9b97bSCyndy Ishida ], 625d6f9b97bSCyndy Ishida "exported_symbols": [ 626d6f9b97bSCyndy Ishida { 627d6f9b97bSCyndy Ishida "targets": [ 628d6f9b97bSCyndy Ishida "x86_64-macos", 629d6f9b97bSCyndy Ishida "arm64-macos" 630d6f9b97bSCyndy Ishida ], 631d6f9b97bSCyndy Ishida "data": { 632d6f9b97bSCyndy Ishida "global": [ 633d6f9b97bSCyndy Ishida "_global" 634d6f9b97bSCyndy Ishida ], 635d6f9b97bSCyndy Ishida "objc_class": [ 636d6f9b97bSCyndy Ishida "ClassA" 637d6f9b97bSCyndy Ishida ], 638d6f9b97bSCyndy Ishida "weak": [], 639d6f9b97bSCyndy Ishida "thread_local": [] 640d6f9b97bSCyndy Ishida }, 641d6f9b97bSCyndy Ishida "text": { 642d6f9b97bSCyndy Ishida "global": [ 643d6f9b97bSCyndy Ishida "_func" 644d6f9b97bSCyndy Ishida ], 645d6f9b97bSCyndy Ishida "weak": [], 646d6f9b97bSCyndy Ishida "thread_local": [] 647d6f9b97bSCyndy Ishida } 648d6f9b97bSCyndy Ishida }, 649d6f9b97bSCyndy Ishida { 650d6f9b97bSCyndy Ishida "targets": [ 651d6f9b97bSCyndy Ishida "x86_64-macos" 652d6f9b97bSCyndy Ishida ], 653d6f9b97bSCyndy Ishida "data": { 654d6f9b97bSCyndy Ishida "global": [ 655d6f9b97bSCyndy Ishida "_globalVar" 656d6f9b97bSCyndy Ishida ], 657d6f9b97bSCyndy Ishida "objc_class": [ 6580882c70dSCyndy Ishida "ClassA", 6590882c70dSCyndy Ishida "ClassB", 660d6f9b97bSCyndy Ishida "ClassData" 661d6f9b97bSCyndy Ishida ], 662d6f9b97bSCyndy Ishida "objc_eh_type": [ 663d6f9b97bSCyndy Ishida "ClassA", 664d6f9b97bSCyndy Ishida "ClassB" 665d6f9b97bSCyndy Ishida ], 666d6f9b97bSCyndy Ishida "objc_ivar": [ 667d6f9b97bSCyndy Ishida "ClassA.ivar1", 668d6f9b97bSCyndy Ishida "ClassA.ivar2", 669d6f9b97bSCyndy Ishida "ClassC.ivar1" 670d6f9b97bSCyndy Ishida ] 671d6f9b97bSCyndy Ishida }, 672d6f9b97bSCyndy Ishida "text": { 673d6f9b97bSCyndy Ishida "global": [ 674d6f9b97bSCyndy Ishida "_funcFoo" 675d6f9b97bSCyndy Ishida ] 676d6f9b97bSCyndy Ishida } 677d6f9b97bSCyndy Ishida } 678d6f9b97bSCyndy Ishida ], 679d6f9b97bSCyndy Ishida "reexported_symbols": [ 680d6f9b97bSCyndy Ishida { 681d6f9b97bSCyndy Ishida "data": { 682d6f9b97bSCyndy Ishida "global": [ 683d6f9b97bSCyndy Ishida "_globalRe" 684d6f9b97bSCyndy Ishida ], 685d6f9b97bSCyndy Ishida "objc_class": [ 686d6f9b97bSCyndy Ishida "ClassRexport" 687d6f9b97bSCyndy Ishida ] 688d6f9b97bSCyndy Ishida }, 689d6f9b97bSCyndy Ishida "text": { 690d6f9b97bSCyndy Ishida "global": [ 691d6f9b97bSCyndy Ishida "_funcA" 692d6f9b97bSCyndy Ishida ] 693d6f9b97bSCyndy Ishida } 694d6f9b97bSCyndy Ishida } 695d6f9b97bSCyndy Ishida ], 696d6f9b97bSCyndy Ishida "undefined_symbols": [ 697d6f9b97bSCyndy Ishida { 698d6f9b97bSCyndy Ishida "targets": [ 699d6f9b97bSCyndy Ishida "x86_64-macos" 700d6f9b97bSCyndy Ishida ], 701d6f9b97bSCyndy Ishida "data": { 702d6f9b97bSCyndy Ishida "global": [ 703d6f9b97bSCyndy Ishida "_globalBind" 704d6f9b97bSCyndy Ishida ], 705d6f9b97bSCyndy Ishida "weak": [ 706d6f9b97bSCyndy Ishida "referenced_sym" 707d6f9b97bSCyndy Ishida ] 708d6f9b97bSCyndy Ishida } 709d6f9b97bSCyndy Ishida } 710d6f9b97bSCyndy Ishida ] 711d6f9b97bSCyndy Ishida }})"; 712d6f9b97bSCyndy Ishida 713d6f9b97bSCyndy Ishida InterfaceFile File; 714d6f9b97bSCyndy Ishida File.setFileType(FileType::TBD_V5); 715d6f9b97bSCyndy Ishida 716d6f9b97bSCyndy Ishida TargetList AllTargets = { 717d6f9b97bSCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 718d6f9b97bSCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(10, 14)), 719d6f9b97bSCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(12, 1)), 720d6f9b97bSCyndy Ishida }; 721d6f9b97bSCyndy Ishida File.addTargets(AllTargets); 722d6f9b97bSCyndy Ishida File.setInstallName("@rpath/S/L/F/Foo.framework/Foo"); 723d6f9b97bSCyndy Ishida File.setCurrentVersion(PackedVersion(1, 2, 0)); 724d6f9b97bSCyndy Ishida File.setCompatibilityVersion(PackedVersion(1, 1, 0)); 725515d3f7dSCyndy Ishida File.addRPath("@executable_path/.../Frameworks", AllTargets[0]); 726d6f9b97bSCyndy Ishida 727d6f9b97bSCyndy Ishida for (const auto &Targ : AllTargets) { 728d6f9b97bSCyndy Ishida File.addParentUmbrella(Targ, "System"); 729d6f9b97bSCyndy Ishida File.addAllowableClient("ClientA", Targ); 730d6f9b97bSCyndy Ishida File.addAllowableClient("ClientB", Targ); 731d6f9b97bSCyndy Ishida File.addReexportedLibrary("/u/l/l/libfoo.dylib", Targ); 732d6f9b97bSCyndy Ishida File.addReexportedLibrary("/u/l/l/libbar.dylib", Targ); 733d6f9b97bSCyndy Ishida } 734d6f9b97bSCyndy Ishida 735d6f9b97bSCyndy Ishida SymbolFlags Flags = SymbolFlags::None; 736d6f9b97bSCyndy Ishida // Exports. 737d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_global", 738d6f9b97bSCyndy Ishida {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Data); 739d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_func", 740d6f9b97bSCyndy Ishida {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Text); 741d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCClass, "ClassA", 742d6f9b97bSCyndy Ishida {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Data); 743d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_funcFoo", {AllTargets[0]}, 744d6f9b97bSCyndy Ishida Flags | SymbolFlags::Text); 745d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_globalVar", {AllTargets[0]}, 746d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 747d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCClass, "ClassData", {AllTargets[0]}, 748d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 749d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCClassEHType, "ClassA", {AllTargets[0]}, 750d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 751d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCClassEHType, "ClassB", {AllTargets[0]}, 752d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 753d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassA.ivar1", 754d6f9b97bSCyndy Ishida {AllTargets[0]}, Flags | SymbolFlags::Data); 755d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassA.ivar2", 756d6f9b97bSCyndy Ishida {AllTargets[0]}, Flags | SymbolFlags::Data); 757d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassC.ivar1", 758d6f9b97bSCyndy Ishida {AllTargets[0]}, Flags | SymbolFlags::Data); 759d6f9b97bSCyndy Ishida 760d6f9b97bSCyndy Ishida // Reexports. 761d6f9b97bSCyndy Ishida Flags = SymbolFlags::Rexported; 762d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_globalRe", AllTargets, 763d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 764d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_funcA", AllTargets, 765d6f9b97bSCyndy Ishida Flags | SymbolFlags::Text); 766d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::ObjectiveCClass, "ClassRexport", AllTargets, 767d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 768d6f9b97bSCyndy Ishida 769d6f9b97bSCyndy Ishida // Undefineds. 770d6f9b97bSCyndy Ishida Flags = SymbolFlags::Undefined; 771d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "_globalBind", {AllTargets[0]}, 772d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data); 773d9a9872eSCyndy Ishida File.addSymbol(EncodeKind::GlobalSymbol, "referenced_sym", {AllTargets[0]}, 774d6f9b97bSCyndy Ishida Flags | SymbolFlags::Data | SymbolFlags::WeakReferenced); 775d6f9b97bSCyndy Ishida 776d6f9b97bSCyndy Ishida File.setTwoLevelNamespace(false); 777d6f9b97bSCyndy Ishida File.setApplicationExtensionSafe(true); 778d6f9b97bSCyndy Ishida 779d6f9b97bSCyndy Ishida // Write out file then process it back into IF and compare equality 780d6f9b97bSCyndy Ishida // against TBDv5File. 781d6f9b97bSCyndy Ishida SmallString<4096> Buffer; 782d6f9b97bSCyndy Ishida raw_svector_ostream OS(Buffer); 783d6f9b97bSCyndy Ishida Error Result = TextAPIWriter::writeToStream(OS, File); 784d6f9b97bSCyndy Ishida EXPECT_FALSE(Result); 785d6f9b97bSCyndy Ishida 786d6f9b97bSCyndy Ishida Expected<TBDFile> Input = 787d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Input.tbd")); 788d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Input); 789d6f9b97bSCyndy Ishida TBDFile InputFile = std::move(Input.get()); 790d6f9b97bSCyndy Ishida 791d6f9b97bSCyndy Ishida Expected<TBDFile> Output = 792d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd")); 793d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Output); 794d6f9b97bSCyndy Ishida TBDFile OutputFile = std::move(Output.get()); 795d6f9b97bSCyndy Ishida EXPECT_EQ(*InputFile, *OutputFile); 796d6f9b97bSCyndy Ishida } 797d6f9b97bSCyndy Ishida 798d6f9b97bSCyndy Ishida TEST(TBDv5, WriteMultipleDocuments) { 799d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 800d6f9b97bSCyndy Ishida "tapi_tbd_version": 5, 801d6f9b97bSCyndy Ishida "main_library": { 802d6f9b97bSCyndy Ishida "target_info": [ 803d6f9b97bSCyndy Ishida { 804d6f9b97bSCyndy Ishida "target": "armv7-ios", 805d6f9b97bSCyndy Ishida "min_deployment": "11.0" 806d6f9b97bSCyndy Ishida } 807d6f9b97bSCyndy Ishida ], 808d6f9b97bSCyndy Ishida "install_names":[ 809d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 810d6f9b97bSCyndy Ishida ], 811d6f9b97bSCyndy Ishida "reexported_libraries": [ 812d6f9b97bSCyndy Ishida { "names": ["/u/l/l/libfoo.dylib"] 813d6f9b97bSCyndy Ishida } 814d6f9b97bSCyndy Ishida ] 815d6f9b97bSCyndy Ishida }, 816d6f9b97bSCyndy Ishida "libraries": [ 817d6f9b97bSCyndy Ishida { 818d6f9b97bSCyndy Ishida "target_info": [ 819d6f9b97bSCyndy Ishida { 820d6f9b97bSCyndy Ishida "target": "armv7-ios", 821d6f9b97bSCyndy Ishida "min_deployment": "11.0" 822d6f9b97bSCyndy Ishida }, 823d6f9b97bSCyndy Ishida { 824d6f9b97bSCyndy Ishida "target": "armv7s-ios", 825d6f9b97bSCyndy Ishida "min_deployment": "11.0" 826d6f9b97bSCyndy Ishida } 827d6f9b97bSCyndy Ishida ], 828d6f9b97bSCyndy Ishida "install_names":[ 829d6f9b97bSCyndy Ishida { "name":"/u/l/l/libfoo.dylib" } 830d6f9b97bSCyndy Ishida ], 831d6f9b97bSCyndy Ishida "current_versions": [ 832d6f9b97bSCyndy Ishida { 833d6f9b97bSCyndy Ishida "version": "2.1.1" 834d6f9b97bSCyndy Ishida } 835d6f9b97bSCyndy Ishida ], 836d6f9b97bSCyndy Ishida "rpaths": [ 837d6f9b97bSCyndy Ishida { 838d6f9b97bSCyndy Ishida "targets": [ 839d6f9b97bSCyndy Ishida "armv7-ios" 840d6f9b97bSCyndy Ishida ], 841d6f9b97bSCyndy Ishida "paths": [ 842d6f9b97bSCyndy Ishida "@executable_path/.../Frameworks" 843d6f9b97bSCyndy Ishida ] 844d6f9b97bSCyndy Ishida }], 845d6f9b97bSCyndy Ishida "reexported_libraries": [ { "names": ["@rpath/libfoo.dylib"] } ], 846d6f9b97bSCyndy Ishida "flags":[ 847d6f9b97bSCyndy Ishida { "attributes": ["not_app_extension_safe"] } 848d6f9b97bSCyndy Ishida ], 849d6f9b97bSCyndy Ishida "exported_symbols": [ 850d6f9b97bSCyndy Ishida { 851d6f9b97bSCyndy Ishida "text": { 852d6f9b97bSCyndy Ishida "global": [ "_funcFoo" ] 853d6f9b97bSCyndy Ishida } 854d6f9b97bSCyndy Ishida } 855d6f9b97bSCyndy Ishida ] 856d6f9b97bSCyndy Ishida }, 857d6f9b97bSCyndy Ishida { 858d6f9b97bSCyndy Ishida "target_info": [ 859d6f9b97bSCyndy Ishida { 860d6f9b97bSCyndy Ishida "target": "armv7-ios", 861d6f9b97bSCyndy Ishida "min_deployment": "11.0" 862d6f9b97bSCyndy Ishida } 863d6f9b97bSCyndy Ishida ], 864d6f9b97bSCyndy Ishida "install_names":[ 865d6f9b97bSCyndy Ishida { "name":"@rpath/libfoo.dylib" } 866d6f9b97bSCyndy Ishida ], 867d6f9b97bSCyndy Ishida "exported_symbols": [ 868d6f9b97bSCyndy Ishida { 869d6f9b97bSCyndy Ishida "data": { 870d6f9b97bSCyndy Ishida "global": [ "_varFooBaz" ] 871d6f9b97bSCyndy Ishida } 872d6f9b97bSCyndy Ishida } 873d6f9b97bSCyndy Ishida ] 874d6f9b97bSCyndy Ishida } 875d6f9b97bSCyndy Ishida ]})"; 876d6f9b97bSCyndy Ishida 877d6f9b97bSCyndy Ishida InterfaceFile File; 878d6f9b97bSCyndy Ishida File.setFileType(FileType::TBD_V5); 879d6f9b97bSCyndy Ishida 880d6f9b97bSCyndy Ishida TargetList AllTargets = { 881d6f9b97bSCyndy Ishida Target(AK_armv7, PLATFORM_IOS, VersionTuple(11, 0)), 882d6f9b97bSCyndy Ishida Target(AK_armv7s, PLATFORM_IOS, VersionTuple(11, 0)), 883d6f9b97bSCyndy Ishida }; 884d6f9b97bSCyndy Ishida File.setInstallName("/S/L/F/Foo.framework/Foo"); 885d6f9b97bSCyndy Ishida File.addTarget(AllTargets[0]); 886d6f9b97bSCyndy Ishida File.setCurrentVersion(PackedVersion(1, 0, 0)); 887d6f9b97bSCyndy Ishida File.setCompatibilityVersion(PackedVersion(1, 0, 0)); 888d6f9b97bSCyndy Ishida File.addReexportedLibrary("/u/l/l/libfoo.dylib", AllTargets[0]); 889d6f9b97bSCyndy Ishida File.setTwoLevelNamespace(); 890d6f9b97bSCyndy Ishida File.setApplicationExtensionSafe(true); 891d6f9b97bSCyndy Ishida 892d6f9b97bSCyndy Ishida InterfaceFile NestedFile; 893d6f9b97bSCyndy Ishida NestedFile.setFileType(FileType::TBD_V5); 894d6f9b97bSCyndy Ishida NestedFile.setInstallName("/u/l/l/libfoo.dylib"); 895d6f9b97bSCyndy Ishida NestedFile.addTargets(AllTargets); 896d6f9b97bSCyndy Ishida NestedFile.setCompatibilityVersion(PackedVersion(1, 0, 0)); 897d6f9b97bSCyndy Ishida NestedFile.setTwoLevelNamespace(); 898d6f9b97bSCyndy Ishida NestedFile.setApplicationExtensionSafe(false); 899d6f9b97bSCyndy Ishida NestedFile.setCurrentVersion(PackedVersion(2, 1, 1)); 900515d3f7dSCyndy Ishida NestedFile.addRPath("@executable_path/.../Frameworks", AllTargets[0]); 901d6f9b97bSCyndy Ishida for (const auto &Targ : AllTargets) 902d6f9b97bSCyndy Ishida NestedFile.addReexportedLibrary("@rpath/libfoo.dylib", Targ); 903d9a9872eSCyndy Ishida NestedFile.addSymbol(EncodeKind::GlobalSymbol, "_funcFoo", AllTargets, 904d6f9b97bSCyndy Ishida SymbolFlags::Text); 905d6f9b97bSCyndy Ishida File.addDocument(std::make_shared<InterfaceFile>(std::move(NestedFile))); 906d6f9b97bSCyndy Ishida 907d6f9b97bSCyndy Ishida InterfaceFile NestedFileB; 908d6f9b97bSCyndy Ishida NestedFileB.setFileType(FileType::TBD_V5); 909d6f9b97bSCyndy Ishida NestedFileB.setInstallName("@rpath/libfoo.dylib"); 910d6f9b97bSCyndy Ishida NestedFileB.addTarget(AllTargets[0]); 911d6f9b97bSCyndy Ishida NestedFileB.setCompatibilityVersion(PackedVersion(1, 0, 0)); 912d6f9b97bSCyndy Ishida NestedFileB.setCurrentVersion(PackedVersion(1, 0, 0)); 913d6f9b97bSCyndy Ishida NestedFileB.setTwoLevelNamespace(); 914d6f9b97bSCyndy Ishida NestedFileB.setApplicationExtensionSafe(true); 915d9a9872eSCyndy Ishida NestedFileB.addSymbol(EncodeKind::GlobalSymbol, "_varFooBaz", {AllTargets[0]}, 916d6f9b97bSCyndy Ishida SymbolFlags::Data); 917d6f9b97bSCyndy Ishida File.addDocument(std::make_shared<InterfaceFile>(std::move(NestedFileB))); 918d6f9b97bSCyndy Ishida 919d6f9b97bSCyndy Ishida // Write out file then process it back into IF and compare equality 920d6f9b97bSCyndy Ishida // against TBDv5File. 921d6f9b97bSCyndy Ishida SmallString<4096> Buffer; 922d6f9b97bSCyndy Ishida raw_svector_ostream OS(Buffer); 923455bf3d1SCyndy Ishida Error Result = TextAPIWriter::writeToStream(OS, File, FileType::Invalid, 924455bf3d1SCyndy Ishida /*Compact=*/true); 925d6f9b97bSCyndy Ishida EXPECT_FALSE(Result); 926d6f9b97bSCyndy Ishida 927d6f9b97bSCyndy Ishida Expected<TBDFile> Input = 928d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Input.tbd")); 929d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Input); 930d6f9b97bSCyndy Ishida TBDFile InputFile = std::move(Input.get()); 931d6f9b97bSCyndy Ishida 932d6f9b97bSCyndy Ishida Expected<TBDFile> Output = 933d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd")); 934d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Output); 935d6f9b97bSCyndy Ishida TBDFile OutputFile = std::move(Output.get()); 936d6f9b97bSCyndy Ishida EXPECT_EQ(*InputFile, *OutputFile); 937d6f9b97bSCyndy Ishida } 938d6f9b97bSCyndy Ishida 939d6f9b97bSCyndy Ishida TEST(TBDv5, Target_Simulator) { 940d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 941d6f9b97bSCyndy Ishida "tapi_tbd_version": 5, 942d6f9b97bSCyndy Ishida "main_library": { 943d6f9b97bSCyndy Ishida "target_info": [ 944d6f9b97bSCyndy Ishida { 945d6f9b97bSCyndy Ishida "target": "arm64-ios-simulator", 946d6f9b97bSCyndy Ishida "min_deployment": "11.0" 947d6f9b97bSCyndy Ishida }, 948d6f9b97bSCyndy Ishida { 949d6f9b97bSCyndy Ishida "target": "x86_64-ios-simulator", 950d6f9b97bSCyndy Ishida "min_deployment": "11.3" 951d6f9b97bSCyndy Ishida } 952d6f9b97bSCyndy Ishida ], 953d6f9b97bSCyndy Ishida "install_names":[ 954d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 955d6f9b97bSCyndy Ishida ] 956d6f9b97bSCyndy Ishida }})"; 957d6f9b97bSCyndy Ishida 958d6f9b97bSCyndy Ishida Expected<TBDFile> Result = 959d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 960d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Result); 961d6f9b97bSCyndy Ishida TBDFile File = std::move(Result.get()); 962d6f9b97bSCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 963d6f9b97bSCyndy Ishida TargetList ExpectedTargets = { 964d6f9b97bSCyndy Ishida Target(AK_x86_64, PLATFORM_IOSSIMULATOR, VersionTuple(11, 3)), 965f991f308SCyndy Ishida Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(14, 0)), 966d6f9b97bSCyndy Ishida }; 967d6f9b97bSCyndy Ishida TargetList Targets{File->targets().begin(), File->targets().end()}; 968d6f9b97bSCyndy Ishida llvm::sort(Targets); 969d6f9b97bSCyndy Ishida EXPECT_EQ(Targets, ExpectedTargets); 970d6f9b97bSCyndy Ishida 971d6f9b97bSCyndy Ishida SmallString<4096> Buffer; 972d6f9b97bSCyndy Ishida raw_svector_ostream OS(Buffer); 973d6f9b97bSCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File); 974d6f9b97bSCyndy Ishida EXPECT_TRUE(!WriteResult); 975d6f9b97bSCyndy Ishida 976d6f9b97bSCyndy Ishida Expected<TBDFile> Output = 977d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd")); 978d6f9b97bSCyndy Ishida EXPECT_TRUE(!!Output); 979d6f9b97bSCyndy Ishida TBDFile WriteResultFile = std::move(Output.get()); 980d6f9b97bSCyndy Ishida EXPECT_EQ(*File, *WriteResultFile); 981d6f9b97bSCyndy Ishida } 982d6f9b97bSCyndy Ishida 98339748656SCyndy Ishida TEST(TBDv5, Target_UnsupportedMinOS) { 98439748656SCyndy Ishida static const char TBDv5File[] = R"({ 98539748656SCyndy Ishida "tapi_tbd_version": 5, 98639748656SCyndy Ishida "main_library": { 98739748656SCyndy Ishida "target_info": [ 98839748656SCyndy Ishida { 98939748656SCyndy Ishida "target": "arm64-macos", 99039748656SCyndy Ishida "min_deployment": "10.14" 99139748656SCyndy Ishida }, 99239748656SCyndy Ishida { 99339748656SCyndy Ishida "target": "x86_64-macos", 99439748656SCyndy Ishida "min_deployment": "10.14" 99539748656SCyndy Ishida } 99639748656SCyndy Ishida ], 99739748656SCyndy Ishida "install_names":[ 99839748656SCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 99939748656SCyndy Ishida ] 100039748656SCyndy Ishida }})"; 100139748656SCyndy Ishida 100239748656SCyndy Ishida Expected<TBDFile> Result = 100339748656SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 100439748656SCyndy Ishida EXPECT_TRUE(!!Result); 100539748656SCyndy Ishida TBDFile File = std::move(Result.get()); 100639748656SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 100739748656SCyndy Ishida TargetList ExpectedTargets = { 100839748656SCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 100939748656SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0)), 101039748656SCyndy Ishida }; 101139748656SCyndy Ishida TargetList Targets{File->targets().begin(), File->targets().end()}; 101239748656SCyndy Ishida llvm::sort(Targets); 101339748656SCyndy Ishida EXPECT_EQ(Targets, ExpectedTargets); 101439748656SCyndy Ishida 101539748656SCyndy Ishida SmallString<4096> Buffer; 101639748656SCyndy Ishida raw_svector_ostream OS(Buffer); 101739748656SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File); 101839748656SCyndy Ishida EXPECT_TRUE(!WriteResult); 101939748656SCyndy Ishida 102039748656SCyndy Ishida Expected<TBDFile> Output = 102139748656SCyndy Ishida TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd")); 102239748656SCyndy Ishida EXPECT_TRUE(!!Output); 102339748656SCyndy Ishida TBDFile WriteResultFile = std::move(Output.get()); 102439748656SCyndy Ishida EXPECT_EQ(*File, *WriteResultFile); 102539748656SCyndy Ishida } 102639748656SCyndy Ishida 1027d6f9b97bSCyndy Ishida TEST(TBDv5, MisspelledKey) { 1028d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 1029d6f9b97bSCyndy Ishida "tapi_tbd_version": 5, 1030d6f9b97bSCyndy Ishida "main_library": { 1031d6f9b97bSCyndy Ishida "target_info": [ 1032d6f9b97bSCyndy Ishida { 1033d6f9b97bSCyndy Ishida "target": "arm64-ios-simulator", 1034d6f9b97bSCyndy Ishida "min_deployment": "11.0" 1035d6f9b97bSCyndy Ishida } 1036d6f9b97bSCyndy Ishida ], 1037d6f9b97bSCyndy Ishida "intall_names":[ 1038d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1039d6f9b97bSCyndy Ishida ] 1040d6f9b97bSCyndy Ishida }})"; 1041d6f9b97bSCyndy Ishida 1042d6f9b97bSCyndy Ishida Expected<TBDFile> Result = 1043d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1044d6f9b97bSCyndy Ishida EXPECT_FALSE(!!Result); 1045d6f9b97bSCyndy Ishida std::string ErrorMessage = toString(Result.takeError()); 1046d6f9b97bSCyndy Ishida EXPECT_EQ("invalid install_names section\n", ErrorMessage); 1047d6f9b97bSCyndy Ishida } 1048d6f9b97bSCyndy Ishida 1049d6f9b97bSCyndy Ishida TEST(TBDv5, InvalidVersion) { 1050d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 1051d6f9b97bSCyndy Ishida "tapi_tbd_version": 11, 1052d6f9b97bSCyndy Ishida "main_library": { 1053d6f9b97bSCyndy Ishida "target_info": [ 1054d6f9b97bSCyndy Ishida { 1055d6f9b97bSCyndy Ishida "target": "arm64-ios-simulator", 1056d6f9b97bSCyndy Ishida "min_deployment": "11.0" 1057d6f9b97bSCyndy Ishida } 1058d6f9b97bSCyndy Ishida ], 1059d6f9b97bSCyndy Ishida "install_names":[ 1060d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1061d6f9b97bSCyndy Ishida ] 1062d6f9b97bSCyndy Ishida }})"; 1063d6f9b97bSCyndy Ishida 1064d6f9b97bSCyndy Ishida Expected<TBDFile> Result = 1065d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1066d6f9b97bSCyndy Ishida EXPECT_FALSE(!!Result); 1067d6f9b97bSCyndy Ishida std::string ErrorMessage = toString(Result.takeError()); 1068d6f9b97bSCyndy Ishida EXPECT_EQ("invalid tapi_tbd_version section\n", ErrorMessage); 1069d6f9b97bSCyndy Ishida } 1070d6f9b97bSCyndy Ishida 1071d6f9b97bSCyndy Ishida TEST(TBDv5, MissingRequiredKey) { 1072d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 1073d6f9b97bSCyndy Ishida "main_library": { 1074d6f9b97bSCyndy Ishida "target_info": [ 1075d6f9b97bSCyndy Ishida { 1076d6f9b97bSCyndy Ishida "target": "arm64-ios-simulator", 1077d6f9b97bSCyndy Ishida "min_deployment": "11.0" 1078d6f9b97bSCyndy Ishida } 1079d6f9b97bSCyndy Ishida ], 1080d6f9b97bSCyndy Ishida "install_names":[ 1081d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1082d6f9b97bSCyndy Ishida ] 1083d6f9b97bSCyndy Ishida }})"; 1084d6f9b97bSCyndy Ishida 1085d6f9b97bSCyndy Ishida Expected<TBDFile> Result = 1086d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1087d6f9b97bSCyndy Ishida EXPECT_FALSE(!!Result); 1088d6f9b97bSCyndy Ishida std::string ErrorMessage = toString(Result.takeError()); 1089d6f9b97bSCyndy Ishida EXPECT_EQ("invalid tapi_tbd_version section\n", ErrorMessage); 1090d6f9b97bSCyndy Ishida } 1091d6f9b97bSCyndy Ishida 1092d6f9b97bSCyndy Ishida TEST(TBDv5, InvalidSymbols) { 1093d6f9b97bSCyndy Ishida static const char TBDv5File[] = R"({ 1094d6f9b97bSCyndy Ishida "tapi_tbd_version": 5, 1095d6f9b97bSCyndy Ishida "main_library": { 1096d6f9b97bSCyndy Ishida "target_info": [ 1097d6f9b97bSCyndy Ishida { 1098d6f9b97bSCyndy Ishida "target": "arm64-driverkit", 1099d6f9b97bSCyndy Ishida "min_deployment": "11.0" 1100d6f9b97bSCyndy Ishida } 1101d6f9b97bSCyndy Ishida ], 1102d6f9b97bSCyndy Ishida "install_names":[ 1103d6f9b97bSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1104d6f9b97bSCyndy Ishida ], 1105d6f9b97bSCyndy Ishida "exported_symbols": [ 1106d6f9b97bSCyndy Ishida { 1107d6f9b97bSCyndy Ishida "daa": { 1108d6f9b97bSCyndy Ishida "global": { 1109d6f9b97bSCyndy Ishida "weak": [] 1110d6f9b97bSCyndy Ishida } 1111d6f9b97bSCyndy Ishida } 1112d6f9b97bSCyndy Ishida } 1113d6f9b97bSCyndy Ishida ] 1114d6f9b97bSCyndy Ishida }})"; 1115d6f9b97bSCyndy Ishida 1116d6f9b97bSCyndy Ishida Expected<TBDFile> Result = 1117d6f9b97bSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1118d6f9b97bSCyndy Ishida EXPECT_FALSE(!!Result); 1119d6f9b97bSCyndy Ishida std::string ErrorMessage = toString(Result.takeError()); 1120d6f9b97bSCyndy Ishida EXPECT_EQ("invalid exported_symbols section\n", ErrorMessage); 1121d6f9b97bSCyndy Ishida } 1122d6f9b97bSCyndy Ishida 11233b731391SCyndy Ishida TEST(TBDv5, DefaultMinOS) { 11243b731391SCyndy Ishida static const char TBDv5File[] = R"({ 11253b731391SCyndy Ishida "tapi_tbd_version": 5, 11263b731391SCyndy Ishida "main_library": { 11273b731391SCyndy Ishida "target_info": [ 11283b731391SCyndy Ishida { 11293b731391SCyndy Ishida "target": "arm64-ios-simulator" 11303b731391SCyndy Ishida } 11313b731391SCyndy Ishida ], 11323b731391SCyndy Ishida "install_names":[ 11333b731391SCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 11343b731391SCyndy Ishida ] 11353b731391SCyndy Ishida }})"; 11363b731391SCyndy Ishida 11373b731391SCyndy Ishida Expected<TBDFile> Result = 11383b731391SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 11393b731391SCyndy Ishida EXPECT_TRUE(!!Result); 11403b731391SCyndy Ishida TBDFile File = std::move(Result.get()); 11413b731391SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 11423b731391SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName()); 11433b731391SCyndy Ishida EXPECT_TRUE(File->targets().begin() != File->targets().end()); 11443b731391SCyndy Ishida EXPECT_EQ(*File->targets().begin(), 11453b731391SCyndy Ishida Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(0, 0))); 11463b731391SCyndy Ishida } 11473b731391SCyndy Ishida 11483b731391SCyndy Ishida TEST(TBDv5, InvalidMinOS) { 11493b731391SCyndy Ishida static const char TBDv5File[] = R"({ 11503b731391SCyndy Ishida "tapi_tbd_version": 5, 11513b731391SCyndy Ishida "main_library": { 11523b731391SCyndy Ishida "target_info": [ 11533b731391SCyndy Ishida { 11543b731391SCyndy Ishida "target": "arm64-ios-simulator", 11553b731391SCyndy Ishida "min_deployment": "swift-abi" 11563b731391SCyndy Ishida } 11573b731391SCyndy Ishida ], 11583b731391SCyndy Ishida "install_names":[ 11593b731391SCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 11603b731391SCyndy Ishida ] 11613b731391SCyndy Ishida }})"; 11623b731391SCyndy Ishida 11633b731391SCyndy Ishida Expected<TBDFile> Result = 11643b731391SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 11653b731391SCyndy Ishida EXPECT_FALSE(!!Result); 11663b731391SCyndy Ishida std::string ErrorMessage = toString(Result.takeError()); 11673b731391SCyndy Ishida EXPECT_EQ("invalid min_deployment section\n", ErrorMessage); 11683b731391SCyndy Ishida } 11693b731391SCyndy Ishida 1170913f21aeSCyndy Ishida TEST(TBDv5, SimSupport) { 1171913f21aeSCyndy Ishida static const char TBDv5File[] = R"({ 1172913f21aeSCyndy Ishida "tapi_tbd_version": 5, 1173913f21aeSCyndy Ishida "main_library": { 1174913f21aeSCyndy Ishida "target_info": [ 1175913f21aeSCyndy Ishida { 1176913f21aeSCyndy Ishida "target": "arm64-macos", 1177913f21aeSCyndy Ishida "min_deployment": "11.1" 1178913f21aeSCyndy Ishida } 1179913f21aeSCyndy Ishida ], 1180913f21aeSCyndy Ishida "install_names":[ 1181913f21aeSCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1182913f21aeSCyndy Ishida ], 1183913f21aeSCyndy Ishida "flags":[ 1184913f21aeSCyndy Ishida { "attributes": ["sim_support"] } 1185913f21aeSCyndy Ishida ] 1186913f21aeSCyndy Ishida }})"; 1187913f21aeSCyndy Ishida 1188913f21aeSCyndy Ishida Expected<TBDFile> Result = 1189913f21aeSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1190913f21aeSCyndy Ishida EXPECT_TRUE(!!Result); 1191913f21aeSCyndy Ishida Target ExpectedTarget = Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 1)); 1192913f21aeSCyndy Ishida TBDFile ReadFile = std::move(Result.get()); 1193913f21aeSCyndy Ishida EXPECT_EQ(FileType::TBD_V5, ReadFile->getFileType()); 1194913f21aeSCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 1195913f21aeSCyndy Ishida ReadFile->getInstallName()); 1196913f21aeSCyndy Ishida EXPECT_TRUE(ReadFile->targets().begin() != ReadFile->targets().end()); 1197913f21aeSCyndy Ishida EXPECT_EQ(*ReadFile->targets().begin(), ExpectedTarget); 1198913f21aeSCyndy Ishida EXPECT_TRUE(ReadFile->hasSimulatorSupport()); 1199913f21aeSCyndy Ishida } 1200913f21aeSCyndy Ishida 1201e17efa60SCyndy Ishida TEST(TBDv5, NotForSharedCache) { 1202e17efa60SCyndy Ishida static const char TBDv5File[] = R"({ 1203e17efa60SCyndy Ishida "tapi_tbd_version": 5, 1204e17efa60SCyndy Ishida "main_library": { 1205e17efa60SCyndy Ishida "target_info": [ 1206e17efa60SCyndy Ishida { 1207e17efa60SCyndy Ishida "target": "arm64-macos", 1208e17efa60SCyndy Ishida "min_deployment": "11.1" 1209e17efa60SCyndy Ishida } 1210e17efa60SCyndy Ishida ], 1211e17efa60SCyndy Ishida "install_names":[ 1212e17efa60SCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 1213e17efa60SCyndy Ishida ], 1214e17efa60SCyndy Ishida "flags":[ 1215e17efa60SCyndy Ishida { "attributes": ["not_for_dyld_shared_cache"] } 1216e17efa60SCyndy Ishida ] 1217e17efa60SCyndy Ishida }})"; 1218e17efa60SCyndy Ishida 1219e17efa60SCyndy Ishida Expected<TBDFile> Result = 1220e17efa60SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 1221e17efa60SCyndy Ishida EXPECT_TRUE(!!Result); 1222e17efa60SCyndy Ishida Target ExpectedTarget = Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 1)); 1223e17efa60SCyndy Ishida TBDFile ReadFile = std::move(Result.get()); 1224e17efa60SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, ReadFile->getFileType()); 1225e17efa60SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 1226e17efa60SCyndy Ishida ReadFile->getInstallName()); 1227e17efa60SCyndy Ishida EXPECT_TRUE(ReadFile->targets().begin() != ReadFile->targets().end()); 1228e17efa60SCyndy Ishida EXPECT_EQ(*ReadFile->targets().begin(), ExpectedTarget); 1229e17efa60SCyndy Ishida EXPECT_FALSE(ReadFile->hasSimulatorSupport()); 1230e17efa60SCyndy Ishida EXPECT_TRUE(ReadFile->isOSLibNotForSharedCache()); 1231e17efa60SCyndy Ishida } 1232e17efa60SCyndy Ishida 12334460fa88SCyndy Ishida TEST(TBDv5, ObjCInterfaces) { 12344460fa88SCyndy Ishida static const char TBDv5File[] = R"({ 12354460fa88SCyndy Ishida "tapi_tbd_version": 5, 12364460fa88SCyndy Ishida "main_library": { 12374460fa88SCyndy Ishida "target_info": [ 12384460fa88SCyndy Ishida { 12394460fa88SCyndy Ishida "target": "arm64-ios-simulator", 12404460fa88SCyndy Ishida "min_deployment": "14.0" 12414460fa88SCyndy Ishida } 12424460fa88SCyndy Ishida ], 12434460fa88SCyndy Ishida "install_names":[ 12444460fa88SCyndy Ishida { "name":"/S/L/F/Foo.framework/Foo" } 12454460fa88SCyndy Ishida ], 12464460fa88SCyndy Ishida "exported_symbols": [ 12474460fa88SCyndy Ishida { 12484460fa88SCyndy Ishida "data": { 12494460fa88SCyndy Ishida "global": [ 12504460fa88SCyndy Ishida "_global", 12514460fa88SCyndy Ishida "_OBJC_METACLASS_$_Standalone", 12524460fa88SCyndy Ishida "_OBJC_CLASS_$_Standalone2" 12534460fa88SCyndy Ishida ], 12544460fa88SCyndy Ishida "weak": ["_OBJC_EHTYPE_$_NSObject"], 12554460fa88SCyndy Ishida "objc_class": [ 12564460fa88SCyndy Ishida "ClassA", 12574460fa88SCyndy Ishida "ClassB" 12584460fa88SCyndy Ishida ], 12594460fa88SCyndy Ishida "objc_eh_type": ["ClassA"] 12604460fa88SCyndy Ishida } 12614460fa88SCyndy Ishida }] 12624460fa88SCyndy Ishida }})"; 12634460fa88SCyndy Ishida 12644460fa88SCyndy Ishida Expected<TBDFile> Result = 12654460fa88SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 12664460fa88SCyndy Ishida EXPECT_TRUE(!!Result); 12674460fa88SCyndy Ishida TBDFile File = std::move(Result.get()); 12684460fa88SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, File->getFileType()); 12694460fa88SCyndy Ishida Target ExpectedTarget = 12704460fa88SCyndy Ishida Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(14, 0)); 12714460fa88SCyndy Ishida EXPECT_EQ(*File->targets().begin(), ExpectedTarget); 12724460fa88SCyndy Ishida 12734460fa88SCyndy Ishida // Check Symbols. 12744460fa88SCyndy Ishida ExportedSymbolSeq Exports; 12754460fa88SCyndy Ishida for (const auto *Sym : File->symbols()) { 12764460fa88SCyndy Ishida ExportedSymbol Temp = 12774460fa88SCyndy Ishida ExportedSymbol{Sym->getKind(), std::string(Sym->getName()), 12784460fa88SCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 12794460fa88SCyndy Ishida Sym->isThreadLocalValue(), Sym->isData()}; 12804460fa88SCyndy Ishida Exports.emplace_back(std::move(Temp)); 12814460fa88SCyndy Ishida } 12824460fa88SCyndy Ishida llvm::sort(Exports); 12834460fa88SCyndy Ishida 12844460fa88SCyndy Ishida std::vector<ExportedSymbol> ExpectedExports = { 12854460fa88SCyndy Ishida {EncodeKind::GlobalSymbol, "_OBJC_CLASS_$_Standalone2", false, false, 12864460fa88SCyndy Ishida true}, 12874460fa88SCyndy Ishida {EncodeKind::GlobalSymbol, "_OBJC_EHTYPE_$_NSObject", true, false, true}, 12884460fa88SCyndy Ishida {EncodeKind::GlobalSymbol, "_OBJC_METACLASS_$_Standalone", false, false, 12894460fa88SCyndy Ishida true}, 12904460fa88SCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true}, 12914460fa88SCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassA", false, false, true}, 12924460fa88SCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassB", false, false, true}, 12934460fa88SCyndy Ishida {EncodeKind::ObjectiveCClassEHType, "ClassA", false, false, true}}; 12944460fa88SCyndy Ishida 12954460fa88SCyndy Ishida EXPECT_EQ(ExpectedExports.size(), Exports.size()); 12964460fa88SCyndy Ishida EXPECT_TRUE( 12974460fa88SCyndy Ishida std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports))); 12984460fa88SCyndy Ishida 12994460fa88SCyndy Ishida SmallString<4096> Buffer; 13004460fa88SCyndy Ishida raw_svector_ostream OS(Buffer); 13014460fa88SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File); 13024460fa88SCyndy Ishida EXPECT_TRUE(!WriteResult); 13034460fa88SCyndy Ishida 13044460fa88SCyndy Ishida Expected<TBDFile> Output = 13054460fa88SCyndy Ishida TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd")); 13064460fa88SCyndy Ishida EXPECT_TRUE(!!Output); 13074460fa88SCyndy Ishida TBDFile WriteResultFile = std::move(Output.get()); 13084460fa88SCyndy Ishida EXPECT_EQ(*File, *WriteResultFile); 13094460fa88SCyndy Ishida } 13104460fa88SCyndy Ishida 131116c1f436SCyndy Ishida TEST(TBDv5, MergeIF) { 131216c1f436SCyndy Ishida static const char TBDv5FileA[] = R"({ 131316c1f436SCyndy Ishida "tapi_tbd_version": 5, 131416c1f436SCyndy Ishida "main_library": { 131516c1f436SCyndy Ishida "target_info": [ 131616c1f436SCyndy Ishida { 131716c1f436SCyndy Ishida "target": "x86_64-macos", 131816c1f436SCyndy Ishida "min_deployment": "10.14" 131916c1f436SCyndy Ishida }, 132016c1f436SCyndy Ishida { 132116c1f436SCyndy Ishida "target": "arm64-macos", 132216c1f436SCyndy Ishida "min_deployment": "10.14" 132316c1f436SCyndy Ishida }, 132416c1f436SCyndy Ishida { 132516c1f436SCyndy Ishida "target": "arm64-maccatalyst", 132616c1f436SCyndy Ishida "min_deployment": "12.1" 132716c1f436SCyndy Ishida } 132816c1f436SCyndy Ishida ], 132916c1f436SCyndy Ishida "flags": [ 133016c1f436SCyndy Ishida { 133116c1f436SCyndy Ishida "targets": [ 133216c1f436SCyndy Ishida "x86_64-macos" 133316c1f436SCyndy Ishida ], 133416c1f436SCyndy Ishida "attributes": [ 133516c1f436SCyndy Ishida "flat_namespace" 133616c1f436SCyndy Ishida ] 133716c1f436SCyndy Ishida } 133816c1f436SCyndy Ishida ], 133916c1f436SCyndy Ishida "install_names": [ 134016c1f436SCyndy Ishida { 134116c1f436SCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 134216c1f436SCyndy Ishida } 134316c1f436SCyndy Ishida ], 134416c1f436SCyndy Ishida "current_versions": [ 134516c1f436SCyndy Ishida { 134616c1f436SCyndy Ishida "version": "1.2" 134716c1f436SCyndy Ishida } 134816c1f436SCyndy Ishida ], 134916c1f436SCyndy Ishida "compatibility_versions": [ 135016c1f436SCyndy Ishida { "version": "1.1" } 135116c1f436SCyndy Ishida ], 135216c1f436SCyndy Ishida "rpaths": [ 135316c1f436SCyndy Ishida { 135416c1f436SCyndy Ishida "targets": [ 135516c1f436SCyndy Ishida "x86_64-macos" 135616c1f436SCyndy Ishida ], 135716c1f436SCyndy Ishida "paths": [ 135816c1f436SCyndy Ishida "@executable_path/.../Frameworks" 135916c1f436SCyndy Ishida ] 136016c1f436SCyndy Ishida } 136116c1f436SCyndy Ishida ], 136216c1f436SCyndy Ishida "parent_umbrellas": [ 136316c1f436SCyndy Ishida { 136416c1f436SCyndy Ishida "umbrella": "System" 136516c1f436SCyndy Ishida } 136616c1f436SCyndy Ishida ], 136716c1f436SCyndy Ishida "allowable_clients": [ 136816c1f436SCyndy Ishida { 136916c1f436SCyndy Ishida "clients": [ 137016c1f436SCyndy Ishida "ClientA", 137116c1f436SCyndy Ishida "ClientB" 137216c1f436SCyndy Ishida ] 137316c1f436SCyndy Ishida } 137416c1f436SCyndy Ishida ], 137516c1f436SCyndy Ishida "reexported_libraries": [ 137616c1f436SCyndy Ishida { 137716c1f436SCyndy Ishida "names": [ 137816c1f436SCyndy Ishida "/u/l/l/libfoo.dylib", 137916c1f436SCyndy Ishida "/u/l/l/libbar.dylib" 138016c1f436SCyndy Ishida ] 138116c1f436SCyndy Ishida } 138216c1f436SCyndy Ishida ], 138316c1f436SCyndy Ishida "exported_symbols": [ 138416c1f436SCyndy Ishida { 138516c1f436SCyndy Ishida "targets": [ 138616c1f436SCyndy Ishida "x86_64-macos", 138716c1f436SCyndy Ishida "arm64-macos" 138816c1f436SCyndy Ishida ], 138916c1f436SCyndy Ishida "data": { 139016c1f436SCyndy Ishida "global": [ 139116c1f436SCyndy Ishida "_global" 139216c1f436SCyndy Ishida ], 139316c1f436SCyndy Ishida "objc_class": [ 139416c1f436SCyndy Ishida "ClassA" 139516c1f436SCyndy Ishida ], 139616c1f436SCyndy Ishida "weak": [], 139716c1f436SCyndy Ishida "thread_local": [] 139816c1f436SCyndy Ishida }, 139916c1f436SCyndy Ishida "text": { 140016c1f436SCyndy Ishida "global": [ 140116c1f436SCyndy Ishida "_func" 140216c1f436SCyndy Ishida ], 140316c1f436SCyndy Ishida "weak": [], 140416c1f436SCyndy Ishida "thread_local": [] 140516c1f436SCyndy Ishida } 140616c1f436SCyndy Ishida }, 140716c1f436SCyndy Ishida { 140816c1f436SCyndy Ishida "targets": [ 140916c1f436SCyndy Ishida "x86_64-macos" 141016c1f436SCyndy Ishida ], 141116c1f436SCyndy Ishida "data": { 141216c1f436SCyndy Ishida "global": [ 141316c1f436SCyndy Ishida "_globalVar" 141416c1f436SCyndy Ishida ], 141516c1f436SCyndy Ishida "objc_class": [ 141616c1f436SCyndy Ishida "ClassA", 141716c1f436SCyndy Ishida "ClassB", 141816c1f436SCyndy Ishida "ClassData" 141916c1f436SCyndy Ishida ], 142016c1f436SCyndy Ishida "objc_eh_type": [ 142116c1f436SCyndy Ishida "ClassA", 142216c1f436SCyndy Ishida "ClassB" 142316c1f436SCyndy Ishida ], 142416c1f436SCyndy Ishida "objc_ivar": [ 142516c1f436SCyndy Ishida "ClassA.ivar1", 142616c1f436SCyndy Ishida "ClassA.ivar2", 142716c1f436SCyndy Ishida "ClassC.ivar1" 142816c1f436SCyndy Ishida ] 142916c1f436SCyndy Ishida }, 143016c1f436SCyndy Ishida "text": { 143116c1f436SCyndy Ishida "global": [ 143216c1f436SCyndy Ishida "_funcFoo" 143316c1f436SCyndy Ishida ] 143416c1f436SCyndy Ishida } 143516c1f436SCyndy Ishida } 143616c1f436SCyndy Ishida ], 143716c1f436SCyndy Ishida "reexported_symbols": [ 143816c1f436SCyndy Ishida { 143916c1f436SCyndy Ishida "targets": [ 144016c1f436SCyndy Ishida "x86_64-macos", 144116c1f436SCyndy Ishida "arm64-macos" 144216c1f436SCyndy Ishida ], 144316c1f436SCyndy Ishida "data": { 144416c1f436SCyndy Ishida "global": [ 144516c1f436SCyndy Ishida "_globalRe" 144616c1f436SCyndy Ishida ], 144716c1f436SCyndy Ishida "objc_class": [ 144816c1f436SCyndy Ishida "ClassRexport" 144916c1f436SCyndy Ishida ] 145016c1f436SCyndy Ishida }, 145116c1f436SCyndy Ishida "text": { 145216c1f436SCyndy Ishida "global": [ 145316c1f436SCyndy Ishida "_funcA" 145416c1f436SCyndy Ishida ] 145516c1f436SCyndy Ishida } 145616c1f436SCyndy Ishida } 145716c1f436SCyndy Ishida ], 145816c1f436SCyndy Ishida "undefined_symbols": [ 145916c1f436SCyndy Ishida { 146016c1f436SCyndy Ishida "targets": [ 146116c1f436SCyndy Ishida "x86_64-macos" 146216c1f436SCyndy Ishida ], 146316c1f436SCyndy Ishida "data": { 146416c1f436SCyndy Ishida "global": [ 146516c1f436SCyndy Ishida "_globalBind" 146616c1f436SCyndy Ishida ], 146716c1f436SCyndy Ishida "weak": [ 146816c1f436SCyndy Ishida "referenced_sym" 146916c1f436SCyndy Ishida ] 147016c1f436SCyndy Ishida } 147116c1f436SCyndy Ishida } 147216c1f436SCyndy Ishida ] 147316c1f436SCyndy Ishida }, 147416c1f436SCyndy Ishida "libraries": [] 147516c1f436SCyndy Ishida })"; 147616c1f436SCyndy Ishida 147716c1f436SCyndy Ishida static const char TBDv5FileB[] = R"({ 147816c1f436SCyndy Ishida "tapi_tbd_version": 5, 147916c1f436SCyndy Ishida "main_library": { 148016c1f436SCyndy Ishida "target_info": [ 148116c1f436SCyndy Ishida { 148216c1f436SCyndy Ishida "target": "x86_64-macos", 148316c1f436SCyndy Ishida "min_deployment": "10.14" 148416c1f436SCyndy Ishida }, 148516c1f436SCyndy Ishida { 148616c1f436SCyndy Ishida "target": "arm64-macos", 148716c1f436SCyndy Ishida "min_deployment": "10.14" 148816c1f436SCyndy Ishida }, 148916c1f436SCyndy Ishida { 149016c1f436SCyndy Ishida "target": "arm64-maccatalyst", 149116c1f436SCyndy Ishida "min_deployment": "12.1" 149216c1f436SCyndy Ishida } 149316c1f436SCyndy Ishida ], 149416c1f436SCyndy Ishida "flags": [ 149516c1f436SCyndy Ishida { 149616c1f436SCyndy Ishida "targets": [ 149716c1f436SCyndy Ishida "x86_64-macos" 149816c1f436SCyndy Ishida ], 149916c1f436SCyndy Ishida "attributes": [ 150016c1f436SCyndy Ishida "flat_namespace" 150116c1f436SCyndy Ishida ] 150216c1f436SCyndy Ishida } 150316c1f436SCyndy Ishida ], 150416c1f436SCyndy Ishida "install_names": [ 150516c1f436SCyndy Ishida { 150616c1f436SCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 150716c1f436SCyndy Ishida } 150816c1f436SCyndy Ishida ], 150916c1f436SCyndy Ishida "current_versions": [ 151016c1f436SCyndy Ishida { 151116c1f436SCyndy Ishida "version": "1.2" 151216c1f436SCyndy Ishida } 151316c1f436SCyndy Ishida ], 151416c1f436SCyndy Ishida "compatibility_versions": [ 151516c1f436SCyndy Ishida { "version": "1.1" } 151616c1f436SCyndy Ishida ], 151716c1f436SCyndy Ishida "exported_symbols": [ 151816c1f436SCyndy Ishida { 151916c1f436SCyndy Ishida "targets": [ 152016c1f436SCyndy Ishida "x86_64-macos", 152116c1f436SCyndy Ishida "arm64-macos" 152216c1f436SCyndy Ishida ], 152316c1f436SCyndy Ishida "data": { 152416c1f436SCyndy Ishida "global": [ 152516c1f436SCyndy Ishida "_globalZ" 152616c1f436SCyndy Ishida ], 152716c1f436SCyndy Ishida "objc_class": [ 152816c1f436SCyndy Ishida "ClassZ" 152916c1f436SCyndy Ishida ], 153016c1f436SCyndy Ishida "weak": [], 153116c1f436SCyndy Ishida "thread_local": [] 153216c1f436SCyndy Ishida }, 153316c1f436SCyndy Ishida "text": { 153416c1f436SCyndy Ishida "global": [ 153516c1f436SCyndy Ishida "_funcZ" 153616c1f436SCyndy Ishida ], 153716c1f436SCyndy Ishida "weak": [], 153816c1f436SCyndy Ishida "thread_local": [] 153916c1f436SCyndy Ishida } 154016c1f436SCyndy Ishida }, 154116c1f436SCyndy Ishida { 154216c1f436SCyndy Ishida "targets": [ 154316c1f436SCyndy Ishida "x86_64-macos" 154416c1f436SCyndy Ishida ], 154516c1f436SCyndy Ishida "data": { 154616c1f436SCyndy Ishida "global": [ 154716c1f436SCyndy Ishida "_globalVarZ" 154816c1f436SCyndy Ishida ], 154916c1f436SCyndy Ishida "objc_class": [ 155016c1f436SCyndy Ishida "ClassZ", 155116c1f436SCyndy Ishida "ClassF" 155216c1f436SCyndy Ishida ], 155316c1f436SCyndy Ishida "objc_eh_type": [ 155416c1f436SCyndy Ishida "ClassZ", 155516c1f436SCyndy Ishida "ClassF" 155616c1f436SCyndy Ishida ], 155716c1f436SCyndy Ishida "objc_ivar": [ 155816c1f436SCyndy Ishida "ClassZ.ivar1", 155916c1f436SCyndy Ishida "ClassZ.ivar2", 156016c1f436SCyndy Ishida "ClassF.ivar1" 156116c1f436SCyndy Ishida ] 156216c1f436SCyndy Ishida }, 156316c1f436SCyndy Ishida "text": { 156416c1f436SCyndy Ishida "global": [ 156516c1f436SCyndy Ishida "_funcFooZ" 156616c1f436SCyndy Ishida ] 156716c1f436SCyndy Ishida } 156816c1f436SCyndy Ishida } 156916c1f436SCyndy Ishida ] 157016c1f436SCyndy Ishida }, 157116c1f436SCyndy Ishida "libraries": [] 157216c1f436SCyndy Ishida })"; 157316c1f436SCyndy Ishida 157416c1f436SCyndy Ishida Expected<TBDFile> ResultA = 157516c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5FileA, "Test.tbd")); 157616c1f436SCyndy Ishida EXPECT_TRUE(!!ResultA); 157716c1f436SCyndy Ishida TBDFile FileA = std::move(ResultA.get()); 157816c1f436SCyndy Ishida 157916c1f436SCyndy Ishida Expected<TBDFile> ResultB = 158016c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5FileB, "Test.tbd")); 158116c1f436SCyndy Ishida EXPECT_TRUE(!!ResultB); 158216c1f436SCyndy Ishida TBDFile FileB = std::move(ResultB.get()); 158316c1f436SCyndy Ishida 158416c1f436SCyndy Ishida Expected<TBDFile> MergedResult = FileA->merge(FileB.get()); 158516c1f436SCyndy Ishida EXPECT_TRUE(!!MergedResult); 158616c1f436SCyndy Ishida TBDFile MergedFile = std::move(MergedResult.get()); 158716c1f436SCyndy Ishida 158816c1f436SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, MergedFile->getFileType()); 158916c1f436SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 159016c1f436SCyndy Ishida MergedFile->getInstallName()); 159116c1f436SCyndy Ishida TargetList AllTargets = { 159216c1f436SCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 159316c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)), 159416c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)), 159516c1f436SCyndy Ishida }; 159616c1f436SCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), MergedFile->getPlatforms()); 159716c1f436SCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), MergedFile->getArchitectures()); 159816c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 2, 0), MergedFile->getCurrentVersion()); 159916c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 1, 0), MergedFile->getCompatibilityVersion()); 160016c1f436SCyndy Ishida EXPECT_TRUE(MergedFile->isApplicationExtensionSafe()); 160116c1f436SCyndy Ishida EXPECT_FALSE(MergedFile->isTwoLevelNamespace()); 160216c1f436SCyndy Ishida EXPECT_EQ(0U, MergedFile->documents().size()); 160316c1f436SCyndy Ishida InterfaceFileRef ClientA("ClientA", AllTargets); 160416c1f436SCyndy Ishida InterfaceFileRef ClientB("ClientB", AllTargets); 160516c1f436SCyndy Ishida EXPECT_EQ(2U, MergedFile->allowableClients().size()); 160616c1f436SCyndy Ishida EXPECT_EQ(ClientA, MergedFile->allowableClients().at(0)); 160716c1f436SCyndy Ishida EXPECT_EQ(ClientB, MergedFile->allowableClients().at(1)); 160816c1f436SCyndy Ishida 160916c1f436SCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets); 161016c1f436SCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets); 161116c1f436SCyndy Ishida EXPECT_EQ(2U, MergedFile->reexportedLibraries().size()); 161216c1f436SCyndy Ishida EXPECT_EQ(ReexportA, MergedFile->reexportedLibraries().at(0)); 161316c1f436SCyndy Ishida EXPECT_EQ(ReexportB, MergedFile->reexportedLibraries().at(1)); 161416c1f436SCyndy Ishida 161516c1f436SCyndy Ishida TargetToAttr RPaths = { 161616c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS), "@executable_path/.../Frameworks"}, 161716c1f436SCyndy Ishida }; 161816c1f436SCyndy Ishida EXPECT_EQ(RPaths, MergedFile->rpaths()); 161916c1f436SCyndy Ishida 162016c1f436SCyndy Ishida TargetToAttr Umbrellas = {{Target(AK_x86_64, PLATFORM_MACOS), "System"}, 162116c1f436SCyndy Ishida {Target(AK_arm64, PLATFORM_MACOS), "System"}, 162216c1f436SCyndy Ishida {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}}; 162316c1f436SCyndy Ishida EXPECT_EQ(Umbrellas, MergedFile->umbrellas()); 162416c1f436SCyndy Ishida 162516c1f436SCyndy Ishida ExportedSymbolSeq Exports, Reexports, Undefineds; 162616c1f436SCyndy Ishida for (const auto *Sym : MergedFile->symbols()) { 162716c1f436SCyndy Ishida TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()}; 162816c1f436SCyndy Ishida ExportedSymbol Temp = 162916c1f436SCyndy Ishida ExportedSymbol{Sym->getKind(), 163016c1f436SCyndy Ishida std::string(Sym->getName()), 163116c1f436SCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 163216c1f436SCyndy Ishida Sym->isThreadLocalValue(), 163316c1f436SCyndy Ishida Sym->isData(), 163416c1f436SCyndy Ishida SymTargets}; 163516c1f436SCyndy Ishida if (Sym->isUndefined()) 163616c1f436SCyndy Ishida Undefineds.emplace_back(std::move(Temp)); 163716c1f436SCyndy Ishida else 163816c1f436SCyndy Ishida Sym->isReexported() ? Reexports.emplace_back(std::move(Temp)) 163916c1f436SCyndy Ishida : Exports.emplace_back(std::move(Temp)); 164016c1f436SCyndy Ishida } 164116c1f436SCyndy Ishida llvm::sort(Exports); 164216c1f436SCyndy Ishida llvm::sort(Reexports); 164316c1f436SCyndy Ishida llvm::sort(Undefineds); 164416c1f436SCyndy Ishida 164516c1f436SCyndy Ishida TargetList MacOSTargets = {Target(AK_x86_64, PLATFORM_MACOS), 164616c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS)}; 164716c1f436SCyndy Ishida 164816c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedExportedSymbols = { 1649d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets}, 1650d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 165116c1f436SCyndy Ishida "_funcFoo", 165216c1f436SCyndy Ishida false, 165316c1f436SCyndy Ishida false, 165416c1f436SCyndy Ishida false, 165516c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1656d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 165716c1f436SCyndy Ishida "_funcFooZ", 165816c1f436SCyndy Ishida false, 165916c1f436SCyndy Ishida false, 166016c1f436SCyndy Ishida false, 166116c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1662d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcZ", false, false, false, MacOSTargets}, 1663d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets}, 1664d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 166516c1f436SCyndy Ishida "_globalVar", 166616c1f436SCyndy Ishida false, 166716c1f436SCyndy Ishida false, 166816c1f436SCyndy Ishida true, 166916c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1670d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 167116c1f436SCyndy Ishida "_globalVarZ", 167216c1f436SCyndy Ishida false, 167316c1f436SCyndy Ishida false, 167416c1f436SCyndy Ishida true, 167516c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1676d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalZ", false, false, true, MacOSTargets}, 1677d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 167816c1f436SCyndy Ishida "ClassA", 167916c1f436SCyndy Ishida false, 168016c1f436SCyndy Ishida false, 168116c1f436SCyndy Ishida true, 168216c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1683d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 168416c1f436SCyndy Ishida "ClassB", 168516c1f436SCyndy Ishida false, 168616c1f436SCyndy Ishida false, 168716c1f436SCyndy Ishida true, 168816c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1689d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 169016c1f436SCyndy Ishida "ClassData", 169116c1f436SCyndy Ishida false, 169216c1f436SCyndy Ishida false, 169316c1f436SCyndy Ishida true, 169416c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1695d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 169616c1f436SCyndy Ishida "ClassF", 169716c1f436SCyndy Ishida false, 169816c1f436SCyndy Ishida false, 169916c1f436SCyndy Ishida true, 170016c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1701d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, 170216c1f436SCyndy Ishida "ClassZ", 170316c1f436SCyndy Ishida false, 170416c1f436SCyndy Ishida false, 170516c1f436SCyndy Ishida true, 170616c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1707d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 170816c1f436SCyndy Ishida "ClassA", 170916c1f436SCyndy Ishida false, 171016c1f436SCyndy Ishida false, 171116c1f436SCyndy Ishida true, 171216c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1713d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 171416c1f436SCyndy Ishida "ClassB", 171516c1f436SCyndy Ishida false, 171616c1f436SCyndy Ishida false, 171716c1f436SCyndy Ishida true, 171816c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1719d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 172016c1f436SCyndy Ishida "ClassF", 172116c1f436SCyndy Ishida false, 172216c1f436SCyndy Ishida false, 172316c1f436SCyndy Ishida true, 172416c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1725d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClassEHType, 172616c1f436SCyndy Ishida "ClassZ", 172716c1f436SCyndy Ishida false, 172816c1f436SCyndy Ishida false, 172916c1f436SCyndy Ishida true, 173016c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1731d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 173216c1f436SCyndy Ishida "ClassA.ivar1", 173316c1f436SCyndy Ishida false, 173416c1f436SCyndy Ishida false, 173516c1f436SCyndy Ishida true, 173616c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1737d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 173816c1f436SCyndy Ishida "ClassA.ivar2", 173916c1f436SCyndy Ishida false, 174016c1f436SCyndy Ishida false, 174116c1f436SCyndy Ishida true, 174216c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1743d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 174416c1f436SCyndy Ishida "ClassC.ivar1", 174516c1f436SCyndy Ishida false, 174616c1f436SCyndy Ishida false, 174716c1f436SCyndy Ishida true, 174816c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1749d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 175016c1f436SCyndy Ishida "ClassF.ivar1", 175116c1f436SCyndy Ishida false, 175216c1f436SCyndy Ishida false, 175316c1f436SCyndy Ishida true, 175416c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1755d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 175616c1f436SCyndy Ishida "ClassZ.ivar1", 175716c1f436SCyndy Ishida false, 175816c1f436SCyndy Ishida false, 175916c1f436SCyndy Ishida true, 176016c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1761d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCInstanceVariable, 176216c1f436SCyndy Ishida "ClassZ.ivar2", 176316c1f436SCyndy Ishida false, 176416c1f436SCyndy Ishida false, 176516c1f436SCyndy Ishida true, 176616c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 176716c1f436SCyndy Ishida }; 176816c1f436SCyndy Ishida 176916c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedReexportedSymbols = { 1770d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets}, 1771d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets}, 1772d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true, 177316c1f436SCyndy Ishida MacOSTargets}, 177416c1f436SCyndy Ishida }; 177516c1f436SCyndy Ishida 177616c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedUndefinedSymbols = { 1777d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 177816c1f436SCyndy Ishida "_globalBind", 177916c1f436SCyndy Ishida false, 178016c1f436SCyndy Ishida false, 178116c1f436SCyndy Ishida true, 178216c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 1783d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, 178416c1f436SCyndy Ishida "referenced_sym", 178516c1f436SCyndy Ishida true, 178616c1f436SCyndy Ishida false, 178716c1f436SCyndy Ishida true, 178816c1f436SCyndy Ishida {Target(AK_x86_64, PLATFORM_MACOS)}}, 178916c1f436SCyndy Ishida }; 179016c1f436SCyndy Ishida 179116c1f436SCyndy Ishida EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size()); 179216c1f436SCyndy Ishida EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size()); 179316c1f436SCyndy Ishida EXPECT_EQ(ExpectedUndefinedSymbols.size(), Undefineds.size()); 179416c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(), 179516c1f436SCyndy Ishida std::begin(ExpectedExportedSymbols))); 179616c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(), 179716c1f436SCyndy Ishida std::begin(ExpectedReexportedSymbols))); 179816c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(), 179916c1f436SCyndy Ishida std::begin(ExpectedUndefinedSymbols))); 180016c1f436SCyndy Ishida } 180116c1f436SCyndy Ishida 180216c1f436SCyndy Ishida TEST(TBDv5, ExtractIF) { 180316c1f436SCyndy Ishida static const char TBDv5File[] = R"({ 180416c1f436SCyndy Ishida "tapi_tbd_version": 5, 180516c1f436SCyndy Ishida "main_library": { 180616c1f436SCyndy Ishida "target_info": [ 180716c1f436SCyndy Ishida { 180816c1f436SCyndy Ishida "target": "x86_64-macos", 180916c1f436SCyndy Ishida "min_deployment": "10.14" 181016c1f436SCyndy Ishida }, 181116c1f436SCyndy Ishida { 181216c1f436SCyndy Ishida "target": "arm64-macos", 181316c1f436SCyndy Ishida "min_deployment": "10.14" 181416c1f436SCyndy Ishida }, 181516c1f436SCyndy Ishida { 181616c1f436SCyndy Ishida "target": "arm64-maccatalyst", 181716c1f436SCyndy Ishida "min_deployment": "12.1" 181816c1f436SCyndy Ishida } 181916c1f436SCyndy Ishida ], 182016c1f436SCyndy Ishida "flags": [ 182116c1f436SCyndy Ishida { 182216c1f436SCyndy Ishida "targets": [ 182316c1f436SCyndy Ishida "x86_64-macos" 182416c1f436SCyndy Ishida ], 182516c1f436SCyndy Ishida "attributes": [ 182616c1f436SCyndy Ishida "flat_namespace" 182716c1f436SCyndy Ishida ] 182816c1f436SCyndy Ishida } 182916c1f436SCyndy Ishida ], 183016c1f436SCyndy Ishida "install_names": [ 183116c1f436SCyndy Ishida { 183216c1f436SCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 183316c1f436SCyndy Ishida } 183416c1f436SCyndy Ishida ], 183516c1f436SCyndy Ishida "current_versions": [ 183616c1f436SCyndy Ishida { 183716c1f436SCyndy Ishida "version": "1.2" 183816c1f436SCyndy Ishida } 183916c1f436SCyndy Ishida ], 184016c1f436SCyndy Ishida "compatibility_versions": [ 184116c1f436SCyndy Ishida { "version": "1.1" } 184216c1f436SCyndy Ishida ], 184316c1f436SCyndy Ishida "rpaths": [ 184416c1f436SCyndy Ishida { 184516c1f436SCyndy Ishida "targets": [ 184616c1f436SCyndy Ishida "x86_64-macos" 184716c1f436SCyndy Ishida ], 184816c1f436SCyndy Ishida "paths": [ 184916c1f436SCyndy Ishida "@executable_path/.../Frameworks" 185016c1f436SCyndy Ishida ] 185116c1f436SCyndy Ishida } 185216c1f436SCyndy Ishida ], 185316c1f436SCyndy Ishida "parent_umbrellas": [ 185416c1f436SCyndy Ishida { 185516c1f436SCyndy Ishida "umbrella": "System" 185616c1f436SCyndy Ishida } 185716c1f436SCyndy Ishida ], 185816c1f436SCyndy Ishida "allowable_clients": [ 185916c1f436SCyndy Ishida { 186016c1f436SCyndy Ishida "clients": [ 186116c1f436SCyndy Ishida "ClientA", 186216c1f436SCyndy Ishida "ClientB" 186316c1f436SCyndy Ishida ] 186416c1f436SCyndy Ishida } 186516c1f436SCyndy Ishida ], 186616c1f436SCyndy Ishida "reexported_libraries": [ 186716c1f436SCyndy Ishida { 186816c1f436SCyndy Ishida "names": [ 186916c1f436SCyndy Ishida "/u/l/l/libfoo.dylib", 187016c1f436SCyndy Ishida "/u/l/l/libbar.dylib" 187116c1f436SCyndy Ishida ] 187216c1f436SCyndy Ishida } 187316c1f436SCyndy Ishida ], 187416c1f436SCyndy Ishida "exported_symbols": [ 187516c1f436SCyndy Ishida { 187616c1f436SCyndy Ishida "targets": [ 187716c1f436SCyndy Ishida "x86_64-macos", 187816c1f436SCyndy Ishida "arm64-macos" 187916c1f436SCyndy Ishida ], 188016c1f436SCyndy Ishida "data": { 188116c1f436SCyndy Ishida "global": [ 188216c1f436SCyndy Ishida "_global" 188316c1f436SCyndy Ishida ], 188416c1f436SCyndy Ishida "objc_class": [ 188516c1f436SCyndy Ishida "ClassA" 188616c1f436SCyndy Ishida ], 188716c1f436SCyndy Ishida "weak": [], 188816c1f436SCyndy Ishida "thread_local": [] 188916c1f436SCyndy Ishida }, 189016c1f436SCyndy Ishida "text": { 189116c1f436SCyndy Ishida "global": [ 189216c1f436SCyndy Ishida "_func" 189316c1f436SCyndy Ishida ], 189416c1f436SCyndy Ishida "weak": [], 189516c1f436SCyndy Ishida "thread_local": [] 189616c1f436SCyndy Ishida } 189716c1f436SCyndy Ishida }, 189816c1f436SCyndy Ishida { 189916c1f436SCyndy Ishida "targets": [ 190016c1f436SCyndy Ishida "x86_64-macos" 190116c1f436SCyndy Ishida ], 190216c1f436SCyndy Ishida "data": { 190316c1f436SCyndy Ishida "global": [ 190416c1f436SCyndy Ishida "_globalVar" 190516c1f436SCyndy Ishida ], 190616c1f436SCyndy Ishida "objc_class": [ 190716c1f436SCyndy Ishida "ClassA", 190816c1f436SCyndy Ishida "ClassB", 190916c1f436SCyndy Ishida "ClassData" 191016c1f436SCyndy Ishida ], 191116c1f436SCyndy Ishida "objc_eh_type": [ 191216c1f436SCyndy Ishida "ClassA", 191316c1f436SCyndy Ishida "ClassB" 191416c1f436SCyndy Ishida ], 191516c1f436SCyndy Ishida "objc_ivar": [ 191616c1f436SCyndy Ishida "ClassA.ivar1", 191716c1f436SCyndy Ishida "ClassA.ivar2", 191816c1f436SCyndy Ishida "ClassC.ivar1" 191916c1f436SCyndy Ishida ] 192016c1f436SCyndy Ishida }, 192116c1f436SCyndy Ishida "text": { 192216c1f436SCyndy Ishida "global": [ 192316c1f436SCyndy Ishida "_funcFoo" 192416c1f436SCyndy Ishida ] 192516c1f436SCyndy Ishida } 192616c1f436SCyndy Ishida } 192716c1f436SCyndy Ishida ], 192816c1f436SCyndy Ishida "reexported_symbols": [ 192916c1f436SCyndy Ishida { 193016c1f436SCyndy Ishida "targets": [ 193116c1f436SCyndy Ishida "x86_64-macos", 193216c1f436SCyndy Ishida "arm64-macos" 193316c1f436SCyndy Ishida ], 193416c1f436SCyndy Ishida "data": { 193516c1f436SCyndy Ishida "global": [ 193616c1f436SCyndy Ishida "_globalRe" 193716c1f436SCyndy Ishida ], 193816c1f436SCyndy Ishida "objc_class": [ 193916c1f436SCyndy Ishida "ClassRexport" 194016c1f436SCyndy Ishida ] 194116c1f436SCyndy Ishida }, 194216c1f436SCyndy Ishida "text": { 194316c1f436SCyndy Ishida "global": [ 194416c1f436SCyndy Ishida "_funcA" 194516c1f436SCyndy Ishida ] 194616c1f436SCyndy Ishida } 194716c1f436SCyndy Ishida } 194816c1f436SCyndy Ishida ], 194916c1f436SCyndy Ishida "undefined_symbols": [ 195016c1f436SCyndy Ishida { 195116c1f436SCyndy Ishida "targets": [ 195216c1f436SCyndy Ishida "x86_64-macos" 195316c1f436SCyndy Ishida ], 195416c1f436SCyndy Ishida "data": { 195516c1f436SCyndy Ishida "global": [ 195616c1f436SCyndy Ishida "_globalBind" 195716c1f436SCyndy Ishida ], 195816c1f436SCyndy Ishida "weak": [ 195916c1f436SCyndy Ishida "referenced_sym" 196016c1f436SCyndy Ishida ] 196116c1f436SCyndy Ishida } 196216c1f436SCyndy Ishida } 196316c1f436SCyndy Ishida ] 196416c1f436SCyndy Ishida }, 196516c1f436SCyndy Ishida "libraries": [] 196616c1f436SCyndy Ishida })"; 196716c1f436SCyndy Ishida 196816c1f436SCyndy Ishida Expected<TBDFile> Result = 196916c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 197016c1f436SCyndy Ishida EXPECT_TRUE(!!Result); 197116c1f436SCyndy Ishida TBDFile File = std::move(Result.get()); 197216c1f436SCyndy Ishida 197316c1f436SCyndy Ishida Expected<TBDFile> ExtractedResult = File->extract(AK_arm64); 197416c1f436SCyndy Ishida EXPECT_TRUE(!!ExtractedResult); 197516c1f436SCyndy Ishida TBDFile ExtractedFile = std::move(ExtractedResult.get()); 197616c1f436SCyndy Ishida 197716c1f436SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, ExtractedFile->getFileType()); 197816c1f436SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 197916c1f436SCyndy Ishida ExtractedFile->getInstallName()); 198016c1f436SCyndy Ishida 198116c1f436SCyndy Ishida TargetList AllTargets = { 198216c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)), 198316c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)), 198416c1f436SCyndy Ishida }; 198516c1f436SCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), ExtractedFile->getPlatforms()); 198616c1f436SCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), 198716c1f436SCyndy Ishida ExtractedFile->getArchitectures()); 198816c1f436SCyndy Ishida 198916c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 2, 0), ExtractedFile->getCurrentVersion()); 199016c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 1, 0), ExtractedFile->getCompatibilityVersion()); 199116c1f436SCyndy Ishida EXPECT_TRUE(ExtractedFile->isApplicationExtensionSafe()); 199216c1f436SCyndy Ishida EXPECT_FALSE(ExtractedFile->isTwoLevelNamespace()); 199316c1f436SCyndy Ishida EXPECT_EQ(0U, ExtractedFile->documents().size()); 199416c1f436SCyndy Ishida 199516c1f436SCyndy Ishida InterfaceFileRef ClientA("ClientA", AllTargets); 199616c1f436SCyndy Ishida InterfaceFileRef ClientB("ClientB", AllTargets); 199716c1f436SCyndy Ishida EXPECT_EQ(2U, ExtractedFile->allowableClients().size()); 199816c1f436SCyndy Ishida EXPECT_EQ(ClientA, ExtractedFile->allowableClients().at(0)); 199916c1f436SCyndy Ishida EXPECT_EQ(ClientB, ExtractedFile->allowableClients().at(1)); 200016c1f436SCyndy Ishida 200116c1f436SCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets); 200216c1f436SCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets); 200316c1f436SCyndy Ishida EXPECT_EQ(2U, ExtractedFile->reexportedLibraries().size()); 200416c1f436SCyndy Ishida EXPECT_EQ(ReexportA, ExtractedFile->reexportedLibraries().at(0)); 200516c1f436SCyndy Ishida EXPECT_EQ(ReexportB, ExtractedFile->reexportedLibraries().at(1)); 200616c1f436SCyndy Ishida 200716c1f436SCyndy Ishida EXPECT_EQ(0u, ExtractedFile->rpaths().size()); 200816c1f436SCyndy Ishida 200916c1f436SCyndy Ishida TargetToAttr Umbrellas = {{Target(AK_arm64, PLATFORM_MACOS), "System"}, 201016c1f436SCyndy Ishida {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}}; 201116c1f436SCyndy Ishida EXPECT_EQ(Umbrellas, ExtractedFile->umbrellas()); 201216c1f436SCyndy Ishida 201316c1f436SCyndy Ishida ExportedSymbolSeq Exports, Reexports, Undefineds; 201416c1f436SCyndy Ishida for (const auto *Sym : ExtractedFile->symbols()) { 201516c1f436SCyndy Ishida TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()}; 201616c1f436SCyndy Ishida ExportedSymbol Temp = 201716c1f436SCyndy Ishida ExportedSymbol{Sym->getKind(), 201816c1f436SCyndy Ishida std::string(Sym->getName()), 201916c1f436SCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 202016c1f436SCyndy Ishida Sym->isThreadLocalValue(), 202116c1f436SCyndy Ishida Sym->isData(), 202216c1f436SCyndy Ishida SymTargets}; 202316c1f436SCyndy Ishida if (Sym->isUndefined()) 202416c1f436SCyndy Ishida Undefineds.emplace_back(std::move(Temp)); 202516c1f436SCyndy Ishida else 202616c1f436SCyndy Ishida Sym->isReexported() ? Reexports.emplace_back(std::move(Temp)) 202716c1f436SCyndy Ishida : Exports.emplace_back(std::move(Temp)); 202816c1f436SCyndy Ishida } 202916c1f436SCyndy Ishida llvm::sort(Exports); 203016c1f436SCyndy Ishida llvm::sort(Reexports); 203116c1f436SCyndy Ishida llvm::sort(Undefineds); 203216c1f436SCyndy Ishida 203316c1f436SCyndy Ishida TargetList MacOSTargets = {Target(AK_arm64, PLATFORM_MACOS)}; 203416c1f436SCyndy Ishida 203516c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedExportedSymbols = { 2036d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets}, 2037d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets}, 2038d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, MacOSTargets}, 203916c1f436SCyndy Ishida }; 204016c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedReexportedSymbols = { 2041d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets}, 2042d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets}, 2043d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true, 204416c1f436SCyndy Ishida MacOSTargets}, 204516c1f436SCyndy Ishida }; 204616c1f436SCyndy Ishida 204716c1f436SCyndy Ishida EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size()); 204816c1f436SCyndy Ishida EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size()); 204916c1f436SCyndy Ishida EXPECT_EQ(0U, Undefineds.size()); 205016c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(), 205116c1f436SCyndy Ishida std::begin(ExpectedExportedSymbols))); 205216c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(), 205316c1f436SCyndy Ishida std::begin(ExpectedReexportedSymbols))); 205416c1f436SCyndy Ishida } 205516c1f436SCyndy Ishida 205616c1f436SCyndy Ishida TEST(TBDv5, RemoveIF) { 205716c1f436SCyndy Ishida static const char TBDv5File[] = R"({ 205816c1f436SCyndy Ishida "tapi_tbd_version": 5, 205916c1f436SCyndy Ishida "main_library": { 206016c1f436SCyndy Ishida "target_info": [ 206116c1f436SCyndy Ishida { 206216c1f436SCyndy Ishida "target": "x86_64-macos", 206316c1f436SCyndy Ishida "min_deployment": "10.14" 206416c1f436SCyndy Ishida }, 206516c1f436SCyndy Ishida { 206616c1f436SCyndy Ishida "target": "arm64-macos", 206716c1f436SCyndy Ishida "min_deployment": "10.14" 206816c1f436SCyndy Ishida }, 206916c1f436SCyndy Ishida { 207016c1f436SCyndy Ishida "target": "arm64-maccatalyst", 207116c1f436SCyndy Ishida "min_deployment": "12.1" 207216c1f436SCyndy Ishida } 207316c1f436SCyndy Ishida ], 207416c1f436SCyndy Ishida "flags": [ 207516c1f436SCyndy Ishida { 207616c1f436SCyndy Ishida "targets": [ 207716c1f436SCyndy Ishida "x86_64-macos" 207816c1f436SCyndy Ishida ], 207916c1f436SCyndy Ishida "attributes": [ 2080*03506bc0SCyndy Ishida "flat_namespace", 2081*03506bc0SCyndy Ishida "not_for_dyld_shared_cache" 208216c1f436SCyndy Ishida ] 208316c1f436SCyndy Ishida } 208416c1f436SCyndy Ishida ], 208516c1f436SCyndy Ishida "install_names": [ 208616c1f436SCyndy Ishida { 208716c1f436SCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 208816c1f436SCyndy Ishida } 208916c1f436SCyndy Ishida ], 209016c1f436SCyndy Ishida "current_versions": [ 209116c1f436SCyndy Ishida { 209216c1f436SCyndy Ishida "version": "1.2" 209316c1f436SCyndy Ishida } 209416c1f436SCyndy Ishida ], 209516c1f436SCyndy Ishida "compatibility_versions": [ 209616c1f436SCyndy Ishida { "version": "1.1" } 209716c1f436SCyndy Ishida ], 209816c1f436SCyndy Ishida "rpaths": [ 209916c1f436SCyndy Ishida { 210016c1f436SCyndy Ishida "targets": [ 210116c1f436SCyndy Ishida "x86_64-macos" 210216c1f436SCyndy Ishida ], 210316c1f436SCyndy Ishida "paths": [ 210416c1f436SCyndy Ishida "@executable_path/.../Frameworks" 210516c1f436SCyndy Ishida ] 210616c1f436SCyndy Ishida } 210716c1f436SCyndy Ishida ], 210816c1f436SCyndy Ishida "parent_umbrellas": [ 210916c1f436SCyndy Ishida { 211016c1f436SCyndy Ishida "umbrella": "System" 211116c1f436SCyndy Ishida } 211216c1f436SCyndy Ishida ], 211316c1f436SCyndy Ishida "allowable_clients": [ 211416c1f436SCyndy Ishida { 211516c1f436SCyndy Ishida "clients": [ 211616c1f436SCyndy Ishida "ClientA", 211716c1f436SCyndy Ishida "ClientB" 211816c1f436SCyndy Ishida ] 211916c1f436SCyndy Ishida } 212016c1f436SCyndy Ishida ], 212116c1f436SCyndy Ishida "reexported_libraries": [ 212216c1f436SCyndy Ishida { 212316c1f436SCyndy Ishida "names": [ 212416c1f436SCyndy Ishida "/u/l/l/libfoo.dylib", 212516c1f436SCyndy Ishida "/u/l/l/libbar.dylib" 212616c1f436SCyndy Ishida ] 212716c1f436SCyndy Ishida } 212816c1f436SCyndy Ishida ], 212916c1f436SCyndy Ishida "exported_symbols": [ 213016c1f436SCyndy Ishida { 213116c1f436SCyndy Ishida "targets": [ 213216c1f436SCyndy Ishida "x86_64-macos", 213316c1f436SCyndy Ishida "arm64-macos" 213416c1f436SCyndy Ishida ], 213516c1f436SCyndy Ishida "data": { 213616c1f436SCyndy Ishida "global": [ 213716c1f436SCyndy Ishida "_global" 213816c1f436SCyndy Ishida ], 213916c1f436SCyndy Ishida "objc_class": [ 214016c1f436SCyndy Ishida "ClassA" 214116c1f436SCyndy Ishida ], 214216c1f436SCyndy Ishida "weak": [], 214316c1f436SCyndy Ishida "thread_local": [] 214416c1f436SCyndy Ishida }, 214516c1f436SCyndy Ishida "text": { 214616c1f436SCyndy Ishida "global": [ 214716c1f436SCyndy Ishida "_func" 214816c1f436SCyndy Ishida ], 214916c1f436SCyndy Ishida "weak": [], 215016c1f436SCyndy Ishida "thread_local": [] 215116c1f436SCyndy Ishida } 215216c1f436SCyndy Ishida }, 215316c1f436SCyndy Ishida { 215416c1f436SCyndy Ishida "targets": [ 215516c1f436SCyndy Ishida "x86_64-macos" 215616c1f436SCyndy Ishida ], 215716c1f436SCyndy Ishida "data": { 215816c1f436SCyndy Ishida "global": [ 215916c1f436SCyndy Ishida "_globalVar" 216016c1f436SCyndy Ishida ], 216116c1f436SCyndy Ishida "objc_class": [ 216216c1f436SCyndy Ishida "ClassA", 216316c1f436SCyndy Ishida "ClassB", 216416c1f436SCyndy Ishida "ClassData" 216516c1f436SCyndy Ishida ], 216616c1f436SCyndy Ishida "objc_eh_type": [ 216716c1f436SCyndy Ishida "ClassA", 216816c1f436SCyndy Ishida "ClassB" 216916c1f436SCyndy Ishida ], 217016c1f436SCyndy Ishida "objc_ivar": [ 217116c1f436SCyndy Ishida "ClassA.ivar1", 217216c1f436SCyndy Ishida "ClassA.ivar2", 217316c1f436SCyndy Ishida "ClassC.ivar1" 217416c1f436SCyndy Ishida ] 217516c1f436SCyndy Ishida }, 217616c1f436SCyndy Ishida "text": { 217716c1f436SCyndy Ishida "global": [ 217816c1f436SCyndy Ishida "_funcFoo" 217916c1f436SCyndy Ishida ] 218016c1f436SCyndy Ishida } 218116c1f436SCyndy Ishida } 218216c1f436SCyndy Ishida ], 218316c1f436SCyndy Ishida "reexported_symbols": [ 218416c1f436SCyndy Ishida { 218516c1f436SCyndy Ishida "targets": [ 218616c1f436SCyndy Ishida "x86_64-macos", 218716c1f436SCyndy Ishida "arm64-macos" 218816c1f436SCyndy Ishida ], 218916c1f436SCyndy Ishida "data": { 219016c1f436SCyndy Ishida "global": [ 219116c1f436SCyndy Ishida "_globalRe" 219216c1f436SCyndy Ishida ], 219316c1f436SCyndy Ishida "objc_class": [ 219416c1f436SCyndy Ishida "ClassRexport" 219516c1f436SCyndy Ishida ] 219616c1f436SCyndy Ishida }, 219716c1f436SCyndy Ishida "text": { 219816c1f436SCyndy Ishida "global": [ 219916c1f436SCyndy Ishida "_funcA" 220016c1f436SCyndy Ishida ] 220116c1f436SCyndy Ishida } 220216c1f436SCyndy Ishida } 220316c1f436SCyndy Ishida ], 220416c1f436SCyndy Ishida "undefined_symbols": [ 220516c1f436SCyndy Ishida { 220616c1f436SCyndy Ishida "targets": [ 220716c1f436SCyndy Ishida "x86_64-macos" 220816c1f436SCyndy Ishida ], 220916c1f436SCyndy Ishida "data": { 221016c1f436SCyndy Ishida "global": [ 221116c1f436SCyndy Ishida "_globalBind" 221216c1f436SCyndy Ishida ], 221316c1f436SCyndy Ishida "weak": [ 221416c1f436SCyndy Ishida "referenced_sym" 221516c1f436SCyndy Ishida ] 221616c1f436SCyndy Ishida } 221716c1f436SCyndy Ishida } 221816c1f436SCyndy Ishida ] 221916c1f436SCyndy Ishida }, 222016c1f436SCyndy Ishida "libraries": [] 222116c1f436SCyndy Ishida })"; 222216c1f436SCyndy Ishida 222316c1f436SCyndy Ishida Expected<TBDFile> Result = 222416c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd")); 222516c1f436SCyndy Ishida EXPECT_TRUE(!!Result); 222616c1f436SCyndy Ishida TBDFile File = std::move(Result.get()); 222716c1f436SCyndy Ishida 222816c1f436SCyndy Ishida Expected<TBDFile> RemovedResult = File->remove(AK_x86_64); 222916c1f436SCyndy Ishida EXPECT_TRUE(!!RemovedResult); 223016c1f436SCyndy Ishida TBDFile RemovedFile = std::move(RemovedResult.get()); 223116c1f436SCyndy Ishida 223216c1f436SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, RemovedFile->getFileType()); 223316c1f436SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 223416c1f436SCyndy Ishida RemovedFile->getInstallName()); 223516c1f436SCyndy Ishida 223616c1f436SCyndy Ishida TargetList AllTargets = { 223716c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)), 223816c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)), 223916c1f436SCyndy Ishida }; 224016c1f436SCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), RemovedFile->getPlatforms()); 224116c1f436SCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), RemovedFile->getArchitectures()); 224216c1f436SCyndy Ishida 224316c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 2, 0), RemovedFile->getCurrentVersion()); 224416c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 1, 0), RemovedFile->getCompatibilityVersion()); 224516c1f436SCyndy Ishida EXPECT_TRUE(RemovedFile->isApplicationExtensionSafe()); 2246*03506bc0SCyndy Ishida EXPECT_TRUE(RemovedFile->isOSLibNotForSharedCache()); 224716c1f436SCyndy Ishida EXPECT_FALSE(RemovedFile->isTwoLevelNamespace()); 224816c1f436SCyndy Ishida EXPECT_EQ(0U, RemovedFile->documents().size()); 224916c1f436SCyndy Ishida 225016c1f436SCyndy Ishida InterfaceFileRef ClientA("ClientA", AllTargets); 225116c1f436SCyndy Ishida InterfaceFileRef ClientB("ClientB", AllTargets); 225216c1f436SCyndy Ishida EXPECT_EQ(2U, RemovedFile->allowableClients().size()); 225316c1f436SCyndy Ishida EXPECT_EQ(ClientA, RemovedFile->allowableClients().at(0)); 225416c1f436SCyndy Ishida EXPECT_EQ(ClientB, RemovedFile->allowableClients().at(1)); 225516c1f436SCyndy Ishida 225616c1f436SCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets); 225716c1f436SCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets); 225816c1f436SCyndy Ishida EXPECT_EQ(2U, RemovedFile->reexportedLibraries().size()); 225916c1f436SCyndy Ishida EXPECT_EQ(ReexportA, RemovedFile->reexportedLibraries().at(0)); 226016c1f436SCyndy Ishida EXPECT_EQ(ReexportB, RemovedFile->reexportedLibraries().at(1)); 226116c1f436SCyndy Ishida 226216c1f436SCyndy Ishida EXPECT_EQ(0u, RemovedFile->rpaths().size()); 226316c1f436SCyndy Ishida 226416c1f436SCyndy Ishida TargetToAttr Umbrellas = {{Target(AK_arm64, PLATFORM_MACOS), "System"}, 226516c1f436SCyndy Ishida {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}}; 226616c1f436SCyndy Ishida EXPECT_EQ(Umbrellas, RemovedFile->umbrellas()); 226716c1f436SCyndy Ishida 226816c1f436SCyndy Ishida ExportedSymbolSeq Exports, Reexports, Undefineds; 226916c1f436SCyndy Ishida for (const auto *Sym : RemovedFile->symbols()) { 227016c1f436SCyndy Ishida TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()}; 227116c1f436SCyndy Ishida ExportedSymbol Temp = 227216c1f436SCyndy Ishida ExportedSymbol{Sym->getKind(), 227316c1f436SCyndy Ishida std::string(Sym->getName()), 227416c1f436SCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 227516c1f436SCyndy Ishida Sym->isThreadLocalValue(), 227616c1f436SCyndy Ishida Sym->isData(), 227716c1f436SCyndy Ishida SymTargets}; 227816c1f436SCyndy Ishida if (Sym->isUndefined()) 227916c1f436SCyndy Ishida Undefineds.emplace_back(std::move(Temp)); 228016c1f436SCyndy Ishida else 228116c1f436SCyndy Ishida Sym->isReexported() ? Reexports.emplace_back(std::move(Temp)) 228216c1f436SCyndy Ishida : Exports.emplace_back(std::move(Temp)); 228316c1f436SCyndy Ishida } 228416c1f436SCyndy Ishida llvm::sort(Exports); 228516c1f436SCyndy Ishida llvm::sort(Reexports); 228616c1f436SCyndy Ishida llvm::sort(Undefineds); 228716c1f436SCyndy Ishida 228816c1f436SCyndy Ishida TargetList MacOSTargets = {Target(AK_arm64, PLATFORM_MACOS)}; 228916c1f436SCyndy Ishida 229016c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedExportedSymbols = { 2291d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets}, 2292d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets}, 2293d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, MacOSTargets}, 229416c1f436SCyndy Ishida }; 229516c1f436SCyndy Ishida std::vector<ExportedSymbol> ExpectedReexportedSymbols = { 2296d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets}, 2297d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets}, 2298d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true, 229916c1f436SCyndy Ishida MacOSTargets}, 230016c1f436SCyndy Ishida }; 230116c1f436SCyndy Ishida 230216c1f436SCyndy Ishida EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size()); 230316c1f436SCyndy Ishida EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size()); 230416c1f436SCyndy Ishida EXPECT_EQ(0U, Undefineds.size()); 230516c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(), 230616c1f436SCyndy Ishida std::begin(ExpectedExportedSymbols))); 230716c1f436SCyndy Ishida EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(), 230816c1f436SCyndy Ishida std::begin(ExpectedReexportedSymbols))); 230916c1f436SCyndy Ishida } 231016c1f436SCyndy Ishida 231116c1f436SCyndy Ishida TEST(TBDv5, InlineIF) { 231216c1f436SCyndy Ishida static const char UmbrellaFile[] = R"({ 231316c1f436SCyndy Ishida "tapi_tbd_version": 5, 231416c1f436SCyndy Ishida "main_library": { 231516c1f436SCyndy Ishida "target_info": [ 231616c1f436SCyndy Ishida { 231716c1f436SCyndy Ishida "target": "x86_64-macos", 231816c1f436SCyndy Ishida "min_deployment": "10.14" 231916c1f436SCyndy Ishida }, 232016c1f436SCyndy Ishida { 232116c1f436SCyndy Ishida "target": "arm64-macos", 232216c1f436SCyndy Ishida "min_deployment": "10.14" 232316c1f436SCyndy Ishida } 232416c1f436SCyndy Ishida ], 232516c1f436SCyndy Ishida "install_names": [ 232616c1f436SCyndy Ishida { 232716c1f436SCyndy Ishida "name": "/S/L/F/Foo.framework/Foo" 232816c1f436SCyndy Ishida } 232916c1f436SCyndy Ishida ], 233016c1f436SCyndy Ishida "current_versions": [ 233116c1f436SCyndy Ishida { 233216c1f436SCyndy Ishida "version": "1.2" 233316c1f436SCyndy Ishida } 233416c1f436SCyndy Ishida ], 233516c1f436SCyndy Ishida "reexported_libraries": [ 233616c1f436SCyndy Ishida { 233716c1f436SCyndy Ishida "names": [ 233816c1f436SCyndy Ishida "/u/l/l/libfoo.dylib", 233916c1f436SCyndy Ishida "/u/l/l/libbar.dylib" 234016c1f436SCyndy Ishida ] 234116c1f436SCyndy Ishida } 234216c1f436SCyndy Ishida ] 234316c1f436SCyndy Ishida }})"; 234416c1f436SCyndy Ishida 234516c1f436SCyndy Ishida static const char ReexportFile[] = R"({ 234616c1f436SCyndy Ishida "tapi_tbd_version": 5, 234716c1f436SCyndy Ishida "main_library": { 234816c1f436SCyndy Ishida "target_info": [ 234916c1f436SCyndy Ishida { 235016c1f436SCyndy Ishida "target": "x86_64-macos", 235116c1f436SCyndy Ishida "min_deployment": "10.14" 235216c1f436SCyndy Ishida }, 235316c1f436SCyndy Ishida { 235416c1f436SCyndy Ishida "target": "arm64-macos", 235516c1f436SCyndy Ishida "min_deployment": "10.14" 235616c1f436SCyndy Ishida } 235716c1f436SCyndy Ishida ], 235816c1f436SCyndy Ishida "install_names": [ 235916c1f436SCyndy Ishida { 236016c1f436SCyndy Ishida "name" : "/u/l/l/libfoo.dylib" 236116c1f436SCyndy Ishida } 236216c1f436SCyndy Ishida ], 236316c1f436SCyndy Ishida "current_versions": [ 236416c1f436SCyndy Ishida { 236516c1f436SCyndy Ishida "version": "1" 236616c1f436SCyndy Ishida } 236716c1f436SCyndy Ishida ], 236816c1f436SCyndy Ishida "rpaths": [ 236916c1f436SCyndy Ishida { 237016c1f436SCyndy Ishida "targets": [ 237116c1f436SCyndy Ishida "x86_64-macos" 237216c1f436SCyndy Ishida ], 237316c1f436SCyndy Ishida "paths": [ 237416c1f436SCyndy Ishida "@executable_path/.../Frameworks" 237516c1f436SCyndy Ishida ] 237616c1f436SCyndy Ishida } 237716c1f436SCyndy Ishida ], 237816c1f436SCyndy Ishida "exported_symbols": [ 237916c1f436SCyndy Ishida { 238016c1f436SCyndy Ishida "targets": [ 238116c1f436SCyndy Ishida "x86_64-macos", 238216c1f436SCyndy Ishida "arm64-macos" 238316c1f436SCyndy Ishida ], 238416c1f436SCyndy Ishida "data": { 238516c1f436SCyndy Ishida "global": [ 238616c1f436SCyndy Ishida "_global" 238716c1f436SCyndy Ishida ], 238816c1f436SCyndy Ishida "objc_class": [ 238916c1f436SCyndy Ishida "ClassA" 239016c1f436SCyndy Ishida ], 239116c1f436SCyndy Ishida "weak": [], 239216c1f436SCyndy Ishida "thread_local": [] 239316c1f436SCyndy Ishida } 239416c1f436SCyndy Ishida } 239516c1f436SCyndy Ishida ]}})"; 239616c1f436SCyndy Ishida 239716c1f436SCyndy Ishida Expected<TBDFile> UmbrellaResult = 239816c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(UmbrellaFile, "Test.tbd")); 239916c1f436SCyndy Ishida EXPECT_TRUE(!!UmbrellaResult); 240016c1f436SCyndy Ishida TBDFile Umbrella = std::move(UmbrellaResult.get()); 240116c1f436SCyndy Ishida 240216c1f436SCyndy Ishida Expected<TBDFile> ReexportResult = 240316c1f436SCyndy Ishida TextAPIReader::get(MemoryBufferRef(ReexportFile, "Test.tbd")); 240416c1f436SCyndy Ishida EXPECT_TRUE(!!ReexportResult); 240516c1f436SCyndy Ishida TBDReexportFile Reexport = std::move(ReexportResult.get()); 240616c1f436SCyndy Ishida Umbrella->inlineLibrary(Reexport); 240716c1f436SCyndy Ishida 240816c1f436SCyndy Ishida EXPECT_EQ(FileType::TBD_V5, Umbrella->getFileType()); 240916c1f436SCyndy Ishida EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), 241016c1f436SCyndy Ishida Umbrella->getInstallName()); 241116c1f436SCyndy Ishida 241216c1f436SCyndy Ishida TargetList AllTargets = { 241316c1f436SCyndy Ishida Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)), 241416c1f436SCyndy Ishida Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)), 241516c1f436SCyndy Ishida }; 241616c1f436SCyndy Ishida EXPECT_EQ(mapToPlatformSet(AllTargets), Umbrella->getPlatforms()); 241716c1f436SCyndy Ishida EXPECT_EQ(mapToArchitectureSet(AllTargets), Umbrella->getArchitectures()); 241816c1f436SCyndy Ishida 241916c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 2, 0), Umbrella->getCurrentVersion()); 242016c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), Umbrella->getCompatibilityVersion()); 242116c1f436SCyndy Ishida InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets); 242216c1f436SCyndy Ishida InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets); 242316c1f436SCyndy Ishida EXPECT_EQ(2U, Umbrella->reexportedLibraries().size()); 242416c1f436SCyndy Ishida EXPECT_EQ(ReexportA, Umbrella->reexportedLibraries().at(0)); 242516c1f436SCyndy Ishida EXPECT_EQ(ReexportB, Umbrella->reexportedLibraries().at(1)); 242616c1f436SCyndy Ishida EXPECT_EQ(1U, Umbrella->documents().size()); 242716c1f436SCyndy Ishida 242816c1f436SCyndy Ishida TBDReexportFile Document = Umbrella->documents().front(); 242916c1f436SCyndy Ishida EXPECT_EQ(std::string("/u/l/l/libfoo.dylib"), Document->getInstallName()); 243016c1f436SCyndy Ishida EXPECT_EQ(0U, Document->getSwiftABIVersion()); 243116c1f436SCyndy Ishida EXPECT_TRUE(Document->isTwoLevelNamespace()); 243216c1f436SCyndy Ishida EXPECT_TRUE(Document->isApplicationExtensionSafe()); 243316c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCurrentVersion()); 243416c1f436SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCompatibilityVersion()); 243516c1f436SCyndy Ishida 243616c1f436SCyndy Ishida ExportedSymbolSeq Exports; 243716c1f436SCyndy Ishida for (const auto *Sym : Document->symbols()) { 243816c1f436SCyndy Ishida TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()}; 243916c1f436SCyndy Ishida Exports.emplace_back( 244016c1f436SCyndy Ishida ExportedSymbol{Sym->getKind(), std::string(Sym->getName()), 244116c1f436SCyndy Ishida Sym->isWeakDefined() || Sym->isWeakReferenced(), 244216c1f436SCyndy Ishida Sym->isThreadLocalValue(), Sym->isData(), SymTargets}); 244316c1f436SCyndy Ishida } 244416c1f436SCyndy Ishida llvm::sort(Exports); 244516c1f436SCyndy Ishida 244616c1f436SCyndy Ishida ExportedSymbolSeq ExpectedExports = { 2447d9a9872eSCyndy Ishida {EncodeKind::GlobalSymbol, "_global", false, false, true, AllTargets}, 2448d9a9872eSCyndy Ishida {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, AllTargets}, 244916c1f436SCyndy Ishida }; 245016c1f436SCyndy Ishida EXPECT_EQ(ExpectedExports.size(), Exports.size()); 245116c1f436SCyndy Ishida EXPECT_TRUE( 245216c1f436SCyndy Ishida std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports))); 245316c1f436SCyndy Ishida } 245479320a0cSCyndy Ishida } // end namespace TBDv5 2455