diff --git a/llvm/include/llvm/Object/TapiUniversal.h b/llvm/include/llvm/Object/TapiUniversal.h index fff66c28c1a41..558916f7af795 100644 --- a/llvm/include/llvm/Object/TapiUniversal.h +++ b/llvm/include/llvm/Object/TapiUniversal.h @@ -110,9 +110,11 @@ class TapiUniversal : public Binary { static bool classof(const Binary *v) { return v->isTapiUniversal(); } private: + /// Attributes of a library that is inlined into a single TBD file. struct Library { - StringRef InstallName; - MachO::Architecture Arch; + const StringRef InstallName; + const MachO::Architecture Arch; + const std::optional DocumentIdx; }; std::unique_ptr ParsedFile; diff --git a/llvm/lib/Object/TapiUniversal.cpp b/llvm/lib/Object/TapiUniversal.cpp index 74e0c519ddfdb..52f3a04d088f5 100644 --- a/llvm/lib/Object/TapiUniversal.cpp +++ b/llvm/lib/Object/TapiUniversal.cpp @@ -29,25 +29,34 @@ TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err) } ParsedFile = std::move(Result.get()); - auto FlattenObjectInfo = [this](const auto &File) { + auto FlattenObjectInfo = [this](const auto &File, + std::optional DocIdx = std::nullopt) { StringRef Name = File->getInstallName(); for (const Architecture Arch : File->getArchitectures()) - Libraries.emplace_back(Library({Name, Arch})); + Libraries.emplace_back(Library({Name, Arch, DocIdx})); }; - FlattenObjectInfo(ParsedFile); // Get inlined documents from tapi file. + size_t DocIdx = 0; for (const std::shared_ptr &File : ParsedFile->documents()) - FlattenObjectInfo(File); + FlattenObjectInfo(File, DocIdx++); } TapiUniversal::~TapiUniversal() = default; Expected> TapiUniversal::ObjectForArch::getAsObjectFile() const { - return std::make_unique(Parent->getMemoryBufferRef(), - *Parent->ParsedFile, - Parent->Libraries[Index].Arch); + const auto &InlinedDocuments = Parent->ParsedFile->documents(); + const Library &CurrLib = Parent->Libraries[Index]; + assert( + (isTopLevelLib() || (CurrLib.DocumentIdx.has_value() && + (InlinedDocuments.size() > *CurrLib.DocumentIdx))) && + "Index into documents exceeds the container for them"); + InterfaceFile *IF = isTopLevelLib() + ? Parent->ParsedFile.get() + : InlinedDocuments[*CurrLib.DocumentIdx].get(); + return std::make_unique(Parent->getMemoryBufferRef(), *IF, + CurrLib.Arch); } Expected> diff --git a/llvm/test/tools/llvm-nm/tapi-files.test b/llvm/test/tools/llvm-nm/tapi-files.test index bd3663a21861f..8dc8a7cf924f2 100644 --- a/llvm/test/tools/llvm-nm/tapi-files.test +++ b/llvm/test/tools/llvm-nm/tapi-files.test @@ -45,14 +45,8 @@ V3-NEXT: 0000000000000000 S _OBJC_METACLASS_$_NSString V3-NEXT: 0000000000000000 S _sym1 V3-NEXT: 0000000000000000 S _sym2 V3: /usr/lib/liba.dylib (for architecture x86_64): -V3-NEXT: 0000000000000000 S _OBJC_CLASS_$_NSBlockPredicate -V3-NEXT: 0000000000000000 S _OBJC_CLASS_$_NSString -V3-NEXT: 0000000000000000 S _OBJC_EHTYPE_$_NSString -V3-NEXT: 0000000000000000 S _OBJC_IVAR_$_NSBlockPredicate._block -V3-NEXT: 0000000000000000 S _OBJC_METACLASS_$_NSBlockPredicate -V3-NEXT: 0000000000000000 S _OBJC_METACLASS_$_NSString -V3-NEXT: 0000000000000000 S _sym1 -V3-NEXT: 0000000000000000 S _sym2 +V3-NEXT: 0000000000000000 S _sym10 +V3-NEXT: 0000000000000000 S _sym11 V4: /u/l/libFoo.dylib (for architecture i386): V4-NEXT: 00000000 S _sym1