[Bitcode] Avoid duplicating linker option when upgrading

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
This commit is contained in:
Steven Wu 2020-07-23 13:04:57 -07:00
parent 183342c0a9
commit ac375c2fe3
3 changed files with 21 additions and 6 deletions

View 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();

Binary file not shown.

View File

@ -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}