aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Linker
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2022-07-14 18:50:02 +0000
committerDimitry Andric <dim@FreeBSD.org>2022-07-14 18:50:02 +0000
commit1f917f69ff07f09b6dbb670971f57f8efe718b84 (patch)
tree99293cbc1411737cd995dac10a99b2c40ef0944c /llvm/lib/Linker
parent145449b1e420787bb99721a429341fa6be3adfb6 (diff)
Diffstat (limited to 'llvm/lib/Linker')
-rw-r--r--llvm/lib/Linker/IRMover.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp
index 5a819e2d736c..9e89cce8312e 100644
--- a/llvm/lib/Linker/IRMover.cpp
+++ b/llvm/lib/Linker/IRMover.cpp
@@ -1357,11 +1357,18 @@ Error IRLinker::linkModuleFlagsMetadata() {
DstM.getModuleIdentifier() + "'");
}
- auto replaceDstValue = [&](MDNode *New) {
+ auto ensureDistinctOp = [&](MDNode *DstValue) {
+ assert(isa<MDTuple>(DstValue) &&
+ "Expected MDTuple when appending module flags");
+ if (DstValue->isDistinct())
+ return dyn_cast<MDTuple>(DstValue);
+ MDTuple *New = MDTuple::getDistinct(
+ DstM.getContext(), SmallVector<Metadata *, 4>(DstValue->operands()));
Metadata *FlagOps[] = {DstOp->getOperand(0), ID, New};
- MDNode *Flag = MDNode::get(DstM.getContext(), FlagOps);
+ MDNode *Flag = MDTuple::getDistinct(DstM.getContext(), FlagOps);
DstModFlags->setOperand(DstIndex, Flag);
Flags[ID].first = Flag;
+ return New;
};
// Emit a warning if the values differ and either source or destination
@@ -1438,25 +1445,20 @@ Error IRLinker::linkModuleFlagsMetadata() {
break;
}
case Module::Append: {
- MDNode *DstValue = cast<MDNode>(DstOp->getOperand(2));
+ MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(DstOp->getOperand(2)));
MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2));
- SmallVector<Metadata *, 8> MDs;
- MDs.reserve(DstValue->getNumOperands() + SrcValue->getNumOperands());
- MDs.append(DstValue->op_begin(), DstValue->op_end());
- MDs.append(SrcValue->op_begin(), SrcValue->op_end());
-
- replaceDstValue(MDNode::get(DstM.getContext(), MDs));
+ for (const auto &O : SrcValue->operands())
+ DstValue->push_back(O);
break;
}
case Module::AppendUnique: {
SmallSetVector<Metadata *, 16> Elts;
- MDNode *DstValue = cast<MDNode>(DstOp->getOperand(2));
+ MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(DstOp->getOperand(2)));
MDNode *SrcValue = cast<MDNode>(SrcOp->getOperand(2));
Elts.insert(DstValue->op_begin(), DstValue->op_end());
Elts.insert(SrcValue->op_begin(), SrcValue->op_end());
-
- replaceDstValue(MDNode::get(DstM.getContext(),
- makeArrayRef(Elts.begin(), Elts.end())));
+ for (auto I = DstValue->getNumOperands(); I < Elts.size(); I++)
+ DstValue->push_back(Elts[I]);
break;
}
}