-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[llvm-nm] Fix how inlined dylibs are reported from tbd files #134498
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
An Inlined library is a dylib that is reexported from an umbrella or top level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when `--add-inlinedinfo` is used as opposed to the top level lib.
@llvm/pr-subscribers-llvm-binary-utilities Author: Cyndy Ishida (cyndyishida) ChangesAn Inlined library is a dylib that is reexported from an umbrella or top-level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when resolves: rdar://147767733 Full diff: https://github.com/llvm/llvm-project/pull/134498.diff 3 Files Affected:
diff --git a/llvm/include/llvm/Object/TapiUniversal.h b/llvm/include/llvm/Object/TapiUniversal.h
index fff66c28c1a41..857d7c127622f 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 size_t DocumentIdx;
};
std::unique_ptr<MachO::InterfaceFile> ParsedFile;
diff --git a/llvm/lib/Object/TapiUniversal.cpp b/llvm/lib/Object/TapiUniversal.cpp
index 74e0c519ddfdb..6fd87f7d73af6 100644
--- a/llvm/lib/Object/TapiUniversal.cpp
+++ b/llvm/lib/Object/TapiUniversal.cpp
@@ -29,25 +29,31 @@ TapiUniversal::TapiUniversal(MemoryBufferRef Source, Error &Err)
}
ParsedFile = std::move(Result.get());
- auto FlattenObjectInfo = [this](const auto &File) {
+ auto FlattenObjectInfo = [this](const auto &File, unsigned DocIdx) {
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);
+ size_t DocIdx = 0;
+ FlattenObjectInfo(ParsedFile, DocIdx);
// Get inlined documents from tapi file.
for (const std::shared_ptr<InterfaceFile> &File : ParsedFile->documents())
- FlattenObjectInfo(File);
+ FlattenObjectInfo(File, DocIdx++);
}
TapiUniversal::~TapiUniversal() = default;
Expected<std::unique_ptr<TapiFile>>
TapiUniversal::ObjectForArch::getAsObjectFile() const {
- return std::make_unique<TapiFile>(Parent->getMemoryBufferRef(),
- *Parent->ParsedFile,
- Parent->Libraries[Index].Arch);
+ const auto &InlinedDocuments = Parent->ParsedFile->documents();
+ const Library &CurrLib = Parent->Libraries[Index];
+ assert((isTopLevelLib() || (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<TapiFile>(Parent->getMemoryBufferRef(), *IF,
+ CurrLib.Arch);
}
Expected<std::unique_ptr<TapiUniversal>>
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
|
…4498) An Inlined library is a dylib that is reexported from an umbrella or top-level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when `--add-inlinedinfo` is used as opposed to the top-level lib. resolves: rdar://147767733 (cherry picked from commit bada5eb)
…4498) An Inlined library is a dylib that is reexported from an umbrella or top-level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when `--add-inlinedinfo` is used as opposed to the top-level lib. resolves: rdar://147767733 (cherry picked from commit bada5eb)
…4498) An Inlined library is a dylib that is reexported from an umbrella or top-level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when `--add-inlinedinfo` is used as opposed to the top-level lib. resolves: rdar://147767733
An Inlined library is a dylib that is reexported from an umbrella or top-level library. When this is encoded in tbd files, ensure we are reading the symbol table from the inlined library when
--add-inlinedinfo
is used as opposed to the top-level lib.resolves: rdar://147767733