[Bitcode] Avoid duplicating linker option when upgrading
authorSteven Wu <stevenwu@apple.com>
Thu, 23 Jul 2020 20:04:57 +0000 (13:04 -0700)
committerSteven Wu <stevenwu@apple.com>
Thu, 23 Jul 2020 20:07:28 +0000 (13:07 -0700)
Summary:
The upgrading path from old ModuleFlag based linker options to the new
NamedMetadata based linker option in in materializeMetadata() which gets
called once for the module and once for every GV. The linker options are
getting dup'ed every time and it can create massive amount of the linker
options in the object file that gets created from old bitcode. Fix the
problem by checking if the new option exists or not before upgrade
again.

rdar://64543389

Reviewers: pcc, t.p.northover, dexonsmith, arphaman

Reviewed By: arphaman

Subscribers: hiraditya, jkorous, ributzka, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D83688

llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/test/Bitcode/Inputs/linker-options.bc [new file with mode: 0644]
llvm/test/Bitcode/upgrade-linker-options-2.ll [new file with mode: 0644]

index 2c7882b6ad515d1be252489f7e45bf6fda3cf295..9632b5700e8af3b40f3f9a428bc194070591cb0e 100644 (file)
@@ -2969,12 +2969,15 @@ Error BitcodeReader::materializeMetadata() {
   }
 
   // Upgrade "Linker Options" module flag to "llvm.linker.options" module-level
-  // metadata.
-  if (Metadata *Val = TheModule->getModuleFlag("Linker Options")) {
-    NamedMDNode *LinkerOpts =
-        TheModule->getOrInsertNamedMetadata("llvm.linker.options");
-    for (const MDOperand &MDOptions : cast<MDNode>(Val)->operands())
-      LinkerOpts->addOperand(cast<MDNode>(MDOptions));
+  // metadata. Only upgrade if the new option doesn't exist to avoid upgrade
+  // multiple times.
+  if (!TheModule->getNamedMetadata("llvm.linker.options")) {
+    if (Metadata *Val = TheModule->getModuleFlag("Linker Options")) {
+      NamedMDNode *LinkerOpts =
+          TheModule->getOrInsertNamedMetadata("llvm.linker.options");
+      for (const MDOperand &MDOptions : cast<MDNode>(Val)->operands())
+        LinkerOpts->addOperand(cast<MDNode>(MDOptions));
+    }
   }
 
   DeferredMetadataInfo.clear();
diff --git a/llvm/test/Bitcode/Inputs/linker-options.bc b/llvm/test/Bitcode/Inputs/linker-options.bc
new file mode 100644 (file)
index 0000000..cbbfb12
Binary files /dev/null and b/llvm/test/Bitcode/Inputs/linker-options.bc differ
diff --git a/llvm/test/Bitcode/upgrade-linker-options-2.ll b/llvm/test/Bitcode/upgrade-linker-options-2.ll
new file mode 100644 (file)
index 0000000..b87ed41
--- /dev/null
@@ -0,0 +1,12 @@
+;; Test upgrade linker option doesn't create duplicated linker options.
+;; Inputs is generated from IR and checked in as bitcode as it will get rejected by verifier.
+;; define void @test() {
+;;   ret void
+;; }
+;; !llvm.module.flags = !{!0}
+;; !0 = !{i32 6, !"Linker Options", !1}
+;; !1 = !{!2}
+;; !2 = !{!"-framework", !"Foundation"}
+
+; RUN: llvm-dis %S/Inputs/linker-options.bc -o - | FileCheck %s
+; CHECK: !llvm.linker.options = !{!2}