Skip to content

Commit

Permalink
[Bitcode] Avoid duplicating linker option when upgrading
Browse files Browse the repository at this point in the history
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

(cherry picked from commit ac375c2)
  • Loading branch information
cachemeifyoucan committed Jul 23, 2020
1 parent 97c829a commit 5ebdb25
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
15 changes: 9 additions & 6 deletions llvm/lib/Bitcode/Reader/BitcodeReader.cpp
Expand Up @@ -2922,12 +2922,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();
Expand Down
Binary file added llvm/test/Bitcode/Inputs/linker-options.bc
Binary file not shown.
12 changes: 12 additions & 0 deletions llvm/test/Bitcode/upgrade-linker-options-2.ll
@@ -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}

0 comments on commit 5ebdb25

Please sign in to comment.