Skip to content

[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

Merged
merged 3 commits into from
Apr 9, 2025

Conversation

cyndyishida
Copy link
Member

@cyndyishida cyndyishida commented Apr 5, 2025

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.
@llvmbot
Copy link
Member

llvmbot commented Apr 5, 2025

@llvm/pr-subscribers-llvm-binary-utilities

Author: Cyndy Ishida (cyndyishida)

Changes

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


Full diff: https://github.com/llvm/llvm-project/pull/134498.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Object/TapiUniversal.h (+4-2)
  • (modified) llvm/lib/Object/TapiUniversal.cpp (+14-8)
  • (modified) llvm/test/tools/llvm-nm/tapi-files.test (+2-8)
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

@cyndyishida cyndyishida requested a review from zixu-w April 7, 2025 15:29
@cyndyishida cyndyishida merged commit bada5eb into llvm:main Apr 9, 2025
11 checks passed
@cyndyishida cyndyishida deleted the eng/PR-nm-tapi branch April 9, 2025 03:56
cyndyishida added a commit to cyndyishida/llvm-project that referenced this pull request Apr 11, 2025
…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)
cyndyishida added a commit to swiftlang/llvm-project that referenced this pull request Apr 15, 2025
…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)
var-const pushed a commit to ldionne/llvm-project that referenced this pull request Apr 17, 2025
…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants