diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-14 18:50:02 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-14 18:50:02 +0000 |
| commit | 1f917f69ff07f09b6dbb670971f57f8efe718b84 (patch) | |
| tree | 99293cbc1411737cd995dac10a99b2c40ef0944c /llvm/lib/Linker | |
| parent | 145449b1e420787bb99721a429341fa6be3adfb6 (diff) | |
Diffstat (limited to 'llvm/lib/Linker')
| -rw-r--r-- | llvm/lib/Linker/IRMover.cpp | 28 |
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; } } |
