forked from OSchip/llvm-project
[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:
parent
183342c0a9
commit
ac375c2fe3
|
@ -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.
|
@ -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}
|
Loading…
Reference in New Issue