LLVM 22.0.0git
ValueMapper.cpp
Go to the documentation of this file.
1//===- ValueMapper.cpp - Interface shared by lib/Transforms/Utils ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the MapValue function, which is shared by various parts of
10// the lib/Transforms/Utils library.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/ArrayRef.h"
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/DenseSet.h"
18#include "llvm/ADT/STLExtras.h"
20#include "llvm/IR/Argument.h"
21#include "llvm/IR/BasicBlock.h"
22#include "llvm/IR/Constant.h"
23#include "llvm/IR/Constants.h"
26#include "llvm/IR/Function.h"
27#include "llvm/IR/GlobalAlias.h"
28#include "llvm/IR/GlobalIFunc.h"
31#include "llvm/IR/InlineAsm.h"
32#include "llvm/IR/Instruction.h"
35#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Operator.h"
37#include "llvm/IR/Type.h"
38#include "llvm/IR/Value.h"
40#include "llvm/Support/Debug.h"
41#include <cassert>
42#include <limits>
43#include <memory>
44#include <utility>
45
46using namespace llvm;
47
48#define DEBUG_TYPE "value-mapper"
49
50// Out of line method to get vtable etc for class.
51void ValueMapTypeRemapper::anchor() {}
52void ValueMaterializer::anchor() {}
53
54namespace {
55
56/// A basic block used in a BlockAddress whose function body is not yet
57/// materialized.
58struct DelayedBasicBlock {
59 BasicBlock *OldBB;
60 std::unique_ptr<BasicBlock> TempBB;
61
62 DelayedBasicBlock(const BlockAddress &Old)
63 : OldBB(Old.getBasicBlock()),
64 TempBB(BasicBlock::Create(Old.getContext())) {}
65};
66
67struct WorklistEntry {
68 enum EntryKind {
69 MapGlobalInit,
70 MapAppendingVar,
71 MapAliasOrIFunc,
73 };
74 struct GVInitTy {
75 GlobalVariable *GV;
76 Constant *Init;
77 };
78 struct AppendingGVTy {
79 GlobalVariable *GV;
80 GlobalVariable *OldGV;
81 };
82 struct AliasOrIFuncTy {
83 GlobalValue *GV;
85 };
86
87 unsigned Kind : 2;
88 unsigned MCID : 29;
89 unsigned AppendingGVIsOldCtorDtor : 1;
90 unsigned AppendingGVNumNewMembers;
91 union {
92 GVInitTy GVInit;
93 AppendingGVTy AppendingGV;
94 AliasOrIFuncTy AliasOrIFunc;
95 Function *RemapF;
96 } Data;
97};
98
99struct MappingContext {
101 ValueMaterializer *Materializer = nullptr;
102
103 /// Construct a MappingContext with a value map and materializer.
104 explicit MappingContext(ValueToValueMapTy &VM,
105 ValueMaterializer *Materializer = nullptr)
106 : VM(&VM), Materializer(Materializer) {}
107};
108
109class Mapper {
110 friend class MDNodeMapper;
111
112#ifndef NDEBUG
113 DenseSet<GlobalValue *> AlreadyScheduled;
114#endif
115
117 ValueMapTypeRemapper *TypeMapper;
118 unsigned CurrentMCID = 0;
122 SmallVector<Constant *, 16> AppendingInits;
123 const MetadataPredicate *IdentityMD;
124
125public:
126 Mapper(ValueToValueMapTy &VM, RemapFlags Flags,
127 ValueMapTypeRemapper *TypeMapper, ValueMaterializer *Materializer,
128 const MetadataPredicate *IdentityMD)
129 : Flags(Flags), TypeMapper(TypeMapper),
130 MCs(1, MappingContext(VM, Materializer)), IdentityMD(IdentityMD) {}
131
132 /// ValueMapper should explicitly call \a flush() before destruction.
133 ~Mapper() { assert(!hasWorkToDo() && "Expected to be flushed"); }
134
135 bool hasWorkToDo() const { return !Worklist.empty(); }
136
137 unsigned
138 registerAlternateMappingContext(ValueToValueMapTy &VM,
139 ValueMaterializer *Materializer = nullptr) {
140 MCs.push_back(MappingContext(VM, Materializer));
141 return MCs.size() - 1;
142 }
143
144 void addFlags(RemapFlags Flags);
145
146 void remapGlobalObjectMetadata(GlobalObject &GO);
147
148 Value *mapValue(const Value *V);
149 void remapInstruction(Instruction *I);
150 void remapFunction(Function &F);
151 void remapDbgRecord(DbgRecord &DVR);
152
153 Constant *mapConstant(const Constant *C) {
154 return cast_or_null<Constant>(mapValue(C));
155 }
156
157 /// Map metadata.
158 ///
159 /// Find the mapping for MD. Guarantees that the return will be resolved
160 /// (not an MDNode, or MDNode::isResolved() returns true).
161 Metadata *mapMetadata(const Metadata *MD);
162
163 void scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init,
164 unsigned MCID);
165 void scheduleMapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV,
166 bool IsOldCtorDtor,
167 ArrayRef<Constant *> NewMembers,
168 unsigned MCID);
169 void scheduleMapAliasOrIFunc(GlobalValue &GV, Constant &Target,
170 unsigned MCID);
171 void scheduleRemapFunction(Function &F, unsigned MCID);
172
173 void flush();
174
175private:
176 void mapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV,
177 bool IsOldCtorDtor,
178 ArrayRef<Constant *> NewMembers);
179
180 ValueToValueMapTy &getVM() { return *MCs[CurrentMCID].VM; }
181 ValueMaterializer *getMaterializer() { return MCs[CurrentMCID].Materializer; }
182
183 Value *mapBlockAddress(const BlockAddress &BA);
184
185 /// Map metadata that doesn't require visiting operands.
186 std::optional<Metadata *> mapSimpleMetadata(const Metadata *MD);
187
188 Metadata *mapToMetadata(const Metadata *Key, Metadata *Val);
189 Metadata *mapToSelf(const Metadata *MD);
190};
191
192class MDNodeMapper {
193 Mapper &M;
194
195 /// Data about a node in \a UniquedGraph.
196 struct Data {
197 bool HasChanged = false;
198 unsigned ID = std::numeric_limits<unsigned>::max();
199 TempMDNode Placeholder;
200 };
201
202 /// A graph of uniqued nodes.
203 struct UniquedGraph {
204 SmallDenseMap<const Metadata *, Data, 32> Info; // Node properties.
205 SmallVector<MDNode *, 16> POT; // Post-order traversal.
206
207 /// Propagate changed operands through the post-order traversal.
208 ///
209 /// Iteratively update \a Data::HasChanged for each node based on \a
210 /// Data::HasChanged of its operands, until fixed point.
211 void propagateChanges();
212
213 /// Get a forward reference to a node to use as an operand.
214 Metadata &getFwdReference(MDNode &Op);
215 };
216
217 /// Worklist of distinct nodes whose operands need to be remapped.
218 SmallVector<MDNode *, 16> DistinctWorklist;
219
220 // Storage for a UniquedGraph.
221 SmallDenseMap<const Metadata *, Data, 32> InfoStorage;
222 SmallVector<MDNode *, 16> POTStorage;
223
224public:
225 MDNodeMapper(Mapper &M) : M(M) {}
226
227 /// Map a metadata node (and its transitive operands).
228 ///
229 /// Map all the (unmapped) nodes in the subgraph under \c N. The iterative
230 /// algorithm handles distinct nodes and uniqued node subgraphs using
231 /// different strategies.
232 ///
233 /// Distinct nodes are immediately mapped and added to \a DistinctWorklist
234 /// using \a mapDistinctNode(). Their mapping can always be computed
235 /// immediately without visiting operands, even if their operands change.
236 ///
237 /// The mapping for uniqued nodes depends on whether their operands change.
238 /// \a mapTopLevelUniquedNode() traverses the transitive uniqued subgraph of
239 /// a node to calculate uniqued node mappings in bulk. Distinct leafs are
240 /// added to \a DistinctWorklist with \a mapDistinctNode().
241 ///
242 /// After mapping \c N itself, this function remaps the operands of the
243 /// distinct nodes in \a DistinctWorklist until the entire subgraph under \c
244 /// N has been mapped.
245 Metadata *map(const MDNode &N);
246
247private:
248 /// Map a top-level uniqued node and the uniqued subgraph underneath it.
249 ///
250 /// This builds up a post-order traversal of the (unmapped) uniqued subgraph
251 /// underneath \c FirstN and calculates the nodes' mapping. Each node uses
252 /// the identity mapping (\a Mapper::mapToSelf()) as long as all of its
253 /// operands uses the identity mapping.
254 ///
255 /// The algorithm works as follows:
256 ///
257 /// 1. \a createPOT(): traverse the uniqued subgraph under \c FirstN and
258 /// save the post-order traversal in the given \a UniquedGraph, tracking
259 /// nodes' operands change.
260 ///
261 /// 2. \a UniquedGraph::propagateChanges(): propagate changed operands
262 /// through the \a UniquedGraph until fixed point, following the rule
263 /// that if a node changes, any node that references must also change.
264 ///
265 /// 3. \a mapNodesInPOT(): map the uniqued nodes, creating new uniqued nodes
266 /// (referencing new operands) where necessary.
267 Metadata *mapTopLevelUniquedNode(const MDNode &FirstN);
268
269 /// Try to map the operand of an \a MDNode.
270 ///
271 /// If \c Op is already mapped, return the mapping. If it's not an \a
272 /// MDNode, compute and return the mapping. If it's a distinct \a MDNode,
273 /// return the result of \a mapDistinctNode().
274 ///
275 /// \return std::nullopt if \c Op is an unmapped uniqued \a MDNode.
276 /// \post getMappedOp(Op) only returns std::nullopt if this returns
277 /// std::nullopt.
278 std::optional<Metadata *> tryToMapOperand(const Metadata *Op);
279
280 /// Map a distinct node.
281 ///
282 /// Return the mapping for the distinct node \c N, saving the result in \a
283 /// DistinctWorklist for later remapping.
284 ///
285 /// \pre \c N is not yet mapped.
286 /// \pre \c N.isDistinct().
287 MDNode *mapDistinctNode(const MDNode &N);
288
289 /// Get a previously mapped node.
290 std::optional<Metadata *> getMappedOp(const Metadata *Op) const;
291
292 /// Create a post-order traversal of an unmapped uniqued node subgraph.
293 ///
294 /// This traverses the metadata graph deeply enough to map \c FirstN. It
295 /// uses \a tryToMapOperand() (via \a Mapper::mapSimplifiedNode()), so any
296 /// metadata that has already been mapped will not be part of the POT.
297 ///
298 /// Each node that has a changed operand from outside the graph (e.g., a
299 /// distinct node, an already-mapped uniqued node, or \a ConstantAsMetadata)
300 /// is marked with \a Data::HasChanged.
301 ///
302 /// \return \c true if any nodes in \c G have \a Data::HasChanged.
303 /// \post \c G.POT is a post-order traversal ending with \c FirstN.
304 /// \post \a Data::hasChanged in \c G.Info indicates whether any node needs
305 /// to change because of operands outside the graph.
306 bool createPOT(UniquedGraph &G, const MDNode &FirstN);
307
308 /// Visit the operands of a uniqued node in the POT.
309 ///
310 /// Visit the operands in the range from \c I to \c E, returning the first
311 /// uniqued node we find that isn't yet in \c G. \c I is always advanced to
312 /// where to continue the loop through the operands.
313 ///
314 /// This sets \c HasChanged if any of the visited operands change.
315 MDNode *visitOperands(UniquedGraph &G, MDNode::op_iterator &I,
316 MDNode::op_iterator E, bool &HasChanged);
317
318 /// Map all the nodes in the given uniqued graph.
319 ///
320 /// This visits all the nodes in \c G in post-order, using the identity
321 /// mapping or creating a new node depending on \a Data::HasChanged.
322 ///
323 /// \pre \a getMappedOp() returns std::nullopt for nodes in \c G, but not for
324 /// any of their operands outside of \c G. \pre \a Data::HasChanged is true
325 /// for a node in \c G iff any of its operands have changed. \post \a
326 /// getMappedOp() returns the mapped node for every node in \c G.
327 void mapNodesInPOT(UniquedGraph &G);
328
329 /// Remap a node's operands using the given functor.
330 ///
331 /// Iterate through the operands of \c N and update them in place using \c
332 /// mapOperand.
333 ///
334 /// \pre N.isDistinct() or N.isTemporary().
335 template <class OperandMapper>
336 void remapOperands(MDNode &N, OperandMapper mapOperand);
337};
338
339} // end anonymous namespace
340
341Value *Mapper::mapValue(const Value *V) {
342 ValueToValueMapTy::iterator I = getVM().find(V);
343
344 // If the value already exists in the map, use it.
345 if (I != getVM().end()) {
346 assert(I->second && "Unexpected null mapping");
347 return I->second;
348 }
349
350 // If we have a materializer and it can materialize a value, use that.
351 if (auto *Materializer = getMaterializer()) {
352 if (Value *NewV = Materializer->materialize(const_cast<Value *>(V))) {
353 getVM()[V] = NewV;
354 return NewV;
355 }
356 }
357
358 // Global values do not need to be seeded into the VM if they
359 // are using the identity mapping.
360 if (isa<GlobalValue>(V)) {
362 return nullptr;
363 return getVM()[V] = const_cast<Value *>(V);
364 }
365
366 if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
367 // Inline asm may need *type* remapping.
368 FunctionType *NewTy = IA->getFunctionType();
369 if (TypeMapper) {
370 NewTy = cast<FunctionType>(TypeMapper->remapType(NewTy));
371
372 if (NewTy != IA->getFunctionType())
373 V = InlineAsm::get(NewTy, IA->getAsmString(), IA->getConstraintString(),
374 IA->hasSideEffects(), IA->isAlignStack(),
375 IA->getDialect(), IA->canThrow());
376 }
377
378 return getVM()[V] = const_cast<Value *>(V);
379 }
380
381 if (const auto *MDV = dyn_cast<MetadataAsValue>(V)) {
382 const Metadata *MD = MDV->getMetadata();
383
384 if (auto *LAM = dyn_cast<LocalAsMetadata>(MD)) {
385 // Look through to grab the local value.
386 if (Value *LV = mapValue(LAM->getValue())) {
387 if (V == LAM->getValue())
388 return const_cast<Value *>(V);
389 return MetadataAsValue::get(V->getContext(), ValueAsMetadata::get(LV));
390 }
391
392 // FIXME: always return nullptr once Verifier::verifyDominatesUse()
393 // ensures metadata operands only reference defined SSA values.
394 return (Flags & RF_IgnoreMissingLocals)
395 ? nullptr
396 : MetadataAsValue::get(V->getContext(),
397 MDTuple::get(V->getContext(), {}));
398 }
399 if (auto *AL = dyn_cast<DIArgList>(MD)) {
401 for (auto *VAM : AL->getArgs()) {
402 // Map both Local and Constant VAMs here; they will both ultimately
403 // be mapped via mapValue. The exceptions are constants when we have no
404 // module level changes and locals when they have no existing mapped
405 // value and RF_IgnoreMissingLocals is set; these have identity
406 // mappings.
407 if ((Flags & RF_NoModuleLevelChanges) && isa<ConstantAsMetadata>(VAM)) {
408 MappedArgs.push_back(VAM);
409 } else if (Value *LV = mapValue(VAM->getValue())) {
410 MappedArgs.push_back(
411 LV == VAM->getValue() ? VAM : ValueAsMetadata::get(LV));
412 } else if ((Flags & RF_IgnoreMissingLocals) && isa<LocalAsMetadata>(VAM)) {
413 MappedArgs.push_back(VAM);
414 } else {
415 // If we cannot map the value, set the argument as poison.
417 PoisonValue::get(VAM->getValue()->getType())));
418 }
419 }
420 return MetadataAsValue::get(V->getContext(),
421 DIArgList::get(V->getContext(), MappedArgs));
422 }
423
424 // If this is a module-level metadata and we know that nothing at the module
425 // level is changing, then use an identity mapping.
426 if (Flags & RF_NoModuleLevelChanges)
427 return getVM()[V] = const_cast<Value *>(V);
428
429 // Map the metadata and turn it into a value.
430 auto *MappedMD = mapMetadata(MD);
431 if (MD == MappedMD)
432 return getVM()[V] = const_cast<Value *>(V);
433 return getVM()[V] = MetadataAsValue::get(V->getContext(), MappedMD);
434 }
435
436 // Okay, this either must be a constant (which may or may not be mappable) or
437 // is something that is not in the mapping table.
438 Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V));
439 if (!C)
440 return nullptr;
441
443 return mapBlockAddress(*BA);
444
445 if (const auto *E = dyn_cast<DSOLocalEquivalent>(C)) {
446 auto *Val = mapValue(E->getGlobalValue());
448 if (GV)
449 return getVM()[E] = DSOLocalEquivalent::get(GV);
450
451 auto *Func = cast<Function>(Val->stripPointerCastsAndAliases());
452 Type *NewTy = E->getType();
453 if (TypeMapper)
454 NewTy = TypeMapper->remapType(NewTy);
455 return getVM()[E] = llvm::ConstantExpr::getBitCast(
456 DSOLocalEquivalent::get(Func), NewTy);
457 }
458
459 if (const auto *NC = dyn_cast<NoCFIValue>(C)) {
460 auto *Val = mapValue(NC->getGlobalValue());
462 return getVM()[NC] = NoCFIValue::get(GV);
463 }
464
465 auto mapValueOrNull = [this](Value *V) {
466 auto Mapped = mapValue(V);
467 assert((Mapped || (Flags & RF_NullMapMissingGlobalValues)) &&
468 "Unexpected null mapping for constant operand without "
469 "NullMapMissingGlobalValues flag");
470 return Mapped;
471 };
472
473 // Otherwise, we have some other constant to remap. Start by checking to see
474 // if all operands have an identity remapping.
475 unsigned OpNo = 0, NumOperands = C->getNumOperands();
476 Value *Mapped = nullptr;
477 for (; OpNo != NumOperands; ++OpNo) {
478 Value *Op = C->getOperand(OpNo);
479 Mapped = mapValueOrNull(Op);
480 if (!Mapped)
481 return nullptr;
482 if (Mapped != Op)
483 break;
484 }
485
486 // See if the type mapper wants to remap the type as well.
487 Type *NewTy = C->getType();
488 if (TypeMapper)
489 NewTy = TypeMapper->remapType(NewTy);
490
491 // If the result type and all operands match up, then just insert an identity
492 // mapping.
493 if (OpNo == NumOperands && NewTy == C->getType())
494 return getVM()[V] = C;
495
496 // Okay, we need to create a new constant. We've already processed some or
497 // all of the operands, set them all up now.
499 Ops.reserve(NumOperands);
500 for (unsigned j = 0; j != OpNo; ++j)
501 Ops.push_back(cast<Constant>(C->getOperand(j)));
502
503 // If one of the operands mismatch, push it and the other mapped operands.
504 if (OpNo != NumOperands) {
505 Ops.push_back(cast<Constant>(Mapped));
506
507 // Map the rest of the operands that aren't processed yet.
508 for (++OpNo; OpNo != NumOperands; ++OpNo) {
509 Mapped = mapValueOrNull(C->getOperand(OpNo));
510 if (!Mapped)
511 return nullptr;
512 Ops.push_back(cast<Constant>(Mapped));
513 }
514 }
515 Type *NewSrcTy = nullptr;
516 if (TypeMapper)
517 if (auto *GEPO = dyn_cast<GEPOperator>(C))
518 NewSrcTy = TypeMapper->remapType(GEPO->getSourceElementType());
519
521 return getVM()[V] = CE->getWithOperands(Ops, NewTy, false, NewSrcTy);
523 return getVM()[V] = ConstantArray::get(cast<ArrayType>(NewTy), Ops);
525 return getVM()[V] = ConstantStruct::get(cast<StructType>(NewTy), Ops);
527 return getVM()[V] = ConstantVector::get(Ops);
529 return getVM()[V] =
531 cast<ConstantInt>(Ops[2]), Ops[3], Ops[4]);
532 // If this is a no-operand constant, it must be because the type was remapped.
533 if (isa<PoisonValue>(C))
534 return getVM()[V] = PoisonValue::get(NewTy);
535 if (isa<UndefValue>(C))
536 return getVM()[V] = UndefValue::get(NewTy);
538 return getVM()[V] = ConstantAggregateZero::get(NewTy);
540 return getVM()[V] = Constant::getNullValue(NewTy);
542 return getVM()[V] = ConstantPointerNull::get(cast<PointerType>(NewTy));
543}
544
545void Mapper::remapDbgRecord(DbgRecord &DR) {
546 // Remap DILocations.
547 auto *MappedDILoc = mapMetadata(DR.getDebugLoc());
548 DR.setDebugLoc(DebugLoc(cast<DILocation>(MappedDILoc)));
549
551 // Remap labels.
552 DLR->setLabel(cast<DILabel>(mapMetadata(DLR->getLabel())));
553 return;
554 }
555
557 // Remap variables.
558 auto *MappedVar = mapMetadata(V.getVariable());
559 V.setVariable(cast<DILocalVariable>(MappedVar));
560
561 bool IgnoreMissingLocals = Flags & RF_IgnoreMissingLocals;
562
563 if (V.isDbgAssign()) {
564 auto *NewAddr = mapValue(V.getAddress());
565 if (!IgnoreMissingLocals && !NewAddr)
566 V.setKillAddress();
567 else if (NewAddr)
568 V.setAddress(NewAddr);
569 V.setAssignId(cast<DIAssignID>(mapMetadata(V.getAssignID())));
570 }
571
572 // Find Value operands and remap those.
573 SmallVector<Value *, 4> Vals(V.location_ops());
575 for (Value *Val : Vals)
576 NewVals.push_back(mapValue(Val));
577
578 // If there are no changes to the Value operands, finished.
579 if (Vals == NewVals)
580 return;
581
582 // Otherwise, do some replacement.
583 if (!IgnoreMissingLocals && llvm::is_contained(NewVals, nullptr)) {
584 V.setKillLocation();
585 } else {
586 // Either we have all non-empty NewVals, or we're permitted to ignore
587 // missing locals.
588 for (unsigned int I = 0; I < Vals.size(); ++I)
589 if (NewVals[I])
590 V.replaceVariableLocationOp(I, NewVals[I]);
591 }
592}
593
594Value *Mapper::mapBlockAddress(const BlockAddress &BA) {
595 Function *F = cast<Function>(mapValue(BA.getFunction()));
596
597 // F may not have materialized its initializer. In that case, create a
598 // dummy basic block for now, and replace it once we've materialized all
599 // the initializers.
600 BasicBlock *BB;
601 if (F->empty()) {
602 DelayedBBs.push_back(DelayedBasicBlock(BA));
603 BB = DelayedBBs.back().TempBB.get();
604 } else {
605 BB = cast_or_null<BasicBlock>(mapValue(BA.getBasicBlock()));
606 }
607
608 return getVM()[&BA] = BlockAddress::get(F, BB ? BB : BA.getBasicBlock());
609}
610
611Metadata *Mapper::mapToMetadata(const Metadata *Key, Metadata *Val) {
612 getVM().MD()[Key].reset(Val);
613 return Val;
614}
615
616Metadata *Mapper::mapToSelf(const Metadata *MD) {
617 return mapToMetadata(MD, const_cast<Metadata *>(MD));
618}
619
620std::optional<Metadata *> MDNodeMapper::tryToMapOperand(const Metadata *Op) {
621 if (!Op)
622 return nullptr;
623
624 if (std::optional<Metadata *> MappedOp = M.mapSimpleMetadata(Op)) {
625#ifndef NDEBUG
626 if (auto *CMD = dyn_cast<ConstantAsMetadata>(Op))
627 assert((!*MappedOp || M.getVM().count(CMD->getValue()) ||
628 M.getVM().getMappedMD(Op)) &&
629 "Expected Value to be memoized");
630 else
631 assert((isa<MDString>(Op) || M.getVM().getMappedMD(Op)) &&
632 "Expected result to be memoized");
633#endif
634 return *MappedOp;
635 }
636
637 const MDNode &N = *cast<MDNode>(Op);
638 if (N.isDistinct())
639 return mapDistinctNode(N);
640 return std::nullopt;
641}
642
643MDNode *MDNodeMapper::mapDistinctNode(const MDNode &N) {
644 assert(N.isDistinct() && "Expected a distinct node");
645 assert(!M.getVM().getMappedMD(&N) && "Expected an unmapped node");
646 Metadata *NewM = nullptr;
647
648 if (M.Flags & RF_ReuseAndMutateDistinctMDs) {
649 NewM = M.mapToSelf(&N);
650 } else {
651 NewM = MDNode::replaceWithDistinct(N.clone());
652 LLVM_DEBUG(dbgs() << "\nMap " << N << "\n"
653 << "To " << *NewM << "\n\n");
654 M.mapToMetadata(&N, NewM);
655 }
656 DistinctWorklist.push_back(cast<MDNode>(NewM));
657
658 return DistinctWorklist.back();
659}
660
662 Value *MappedV) {
663 if (CMD.getValue() == MappedV)
664 return const_cast<ConstantAsMetadata *>(&CMD);
665 return MappedV ? ConstantAsMetadata::getConstant(MappedV) : nullptr;
666}
667
668std::optional<Metadata *> MDNodeMapper::getMappedOp(const Metadata *Op) const {
669 if (!Op)
670 return nullptr;
671
672 if (std::optional<Metadata *> MappedOp = M.getVM().getMappedMD(Op))
673 return *MappedOp;
674
675 if (isa<MDString>(Op))
676 return const_cast<Metadata *>(Op);
677
678 if (auto *CMD = dyn_cast<ConstantAsMetadata>(Op))
679 return wrapConstantAsMetadata(*CMD, M.getVM().lookup(CMD->getValue()));
680
681 return std::nullopt;
682}
683
684Metadata &MDNodeMapper::UniquedGraph::getFwdReference(MDNode &Op) {
685 auto Where = Info.find(&Op);
686 assert(Where != Info.end() && "Expected a valid reference");
687
688 auto &OpD = Where->second;
689 if (!OpD.HasChanged)
690 return Op;
691
692 // Lazily construct a temporary node.
693 if (!OpD.Placeholder)
694 OpD.Placeholder = Op.clone();
695
696 return *OpD.Placeholder;
697}
698
699template <class OperandMapper>
700void MDNodeMapper::remapOperands(MDNode &N, OperandMapper mapOperand) {
701 assert(!N.isUniqued() && "Expected distinct or temporary nodes");
702 for (unsigned I = 0, E = N.getNumOperands(); I != E; ++I) {
703 Metadata *Old = N.getOperand(I);
704 Metadata *New = mapOperand(Old);
705 if (Old != New)
706 LLVM_DEBUG(dbgs() << "Replacing Op " << Old << " with " << New << " in "
707 << N << "\n");
708
709 if (Old != New)
710 N.replaceOperandWith(I, New);
711 }
712}
713
714namespace {
715
716/// An entry in the worklist for the post-order traversal.
717struct POTWorklistEntry {
718 MDNode *N; ///< Current node.
719 MDNode::op_iterator Op; ///< Current operand of \c N.
720
721 /// Keep a flag of whether operands have changed in the worklist to avoid
722 /// hitting the map in \a UniquedGraph.
723 bool HasChanged = false;
724
725 POTWorklistEntry(MDNode &N) : N(&N), Op(N.op_begin()) {}
726};
727
728} // end anonymous namespace
729
730bool MDNodeMapper::createPOT(UniquedGraph &G, const MDNode &FirstN) {
731 assert(G.Info.empty() && "Expected a fresh traversal");
732 assert(FirstN.isUniqued() && "Expected uniqued node in POT");
733
734 // Construct a post-order traversal of the uniqued subgraph under FirstN.
735 bool AnyChanges = false;
737 Worklist.push_back(POTWorklistEntry(const_cast<MDNode &>(FirstN)));
738 (void)G.Info[&FirstN];
739 while (!Worklist.empty()) {
740 // Start or continue the traversal through the this node's operands.
741 auto &WE = Worklist.back();
742 if (MDNode *N = visitOperands(G, WE.Op, WE.N->op_end(), WE.HasChanged)) {
743 // Push a new node to traverse first.
744 Worklist.push_back(POTWorklistEntry(*N));
745 continue;
746 }
747
748 // Push the node onto the POT.
749 assert(WE.N->isUniqued() && "Expected only uniqued nodes");
750 assert(WE.Op == WE.N->op_end() && "Expected to visit all operands");
751 auto &D = G.Info[WE.N];
752 AnyChanges |= D.HasChanged = WE.HasChanged;
753 D.ID = G.POT.size();
754 G.POT.push_back(WE.N);
755
756 // Pop the node off the worklist.
757 Worklist.pop_back();
758 }
759 return AnyChanges;
760}
761
762MDNode *MDNodeMapper::visitOperands(UniquedGraph &G, MDNode::op_iterator &I,
763 MDNode::op_iterator E, bool &HasChanged) {
764 while (I != E) {
765 Metadata *Op = *I++; // Increment even on early return.
766 if (std::optional<Metadata *> MappedOp = tryToMapOperand(Op)) {
767 // Check if the operand changes.
768 HasChanged |= Op != *MappedOp;
769 continue;
770 }
771
772 // A uniqued metadata node.
773 MDNode &OpN = *cast<MDNode>(Op);
774 assert(OpN.isUniqued() &&
775 "Only uniqued operands cannot be mapped immediately");
776 if (G.Info.try_emplace(&OpN).second)
777 return &OpN; // This is a new one. Return it.
778 }
779 return nullptr;
780}
781
782void MDNodeMapper::UniquedGraph::propagateChanges() {
783 bool AnyChanges;
784 do {
785 AnyChanges = false;
786 for (MDNode *N : POT) {
787 auto &D = Info[N];
788 if (D.HasChanged)
789 continue;
790
791 if (llvm::none_of(N->operands(), [&](const Metadata *Op) {
792 auto Where = Info.find(Op);
793 return Where != Info.end() && Where->second.HasChanged;
794 }))
795 continue;
796
797 AnyChanges = D.HasChanged = true;
798 }
799 } while (AnyChanges);
800}
801
802void MDNodeMapper::mapNodesInPOT(UniquedGraph &G) {
803 // Construct uniqued nodes, building forward references as necessary.
804 SmallVector<MDNode *, 16> CyclicNodes;
805 for (auto *N : G.POT) {
806 auto &D = G.Info[N];
807 if (!D.HasChanged) {
808 // The node hasn't changed.
809 M.mapToSelf(N);
810 continue;
811 }
812
813 // Remember whether this node had a placeholder.
814 bool HadPlaceholder(D.Placeholder);
815
816 // Clone the uniqued node and remap the operands.
817 TempMDNode ClonedN = D.Placeholder ? std::move(D.Placeholder) : N->clone();
818 remapOperands(*ClonedN, [this, &D, &G](Metadata *Old) {
819 if (std::optional<Metadata *> MappedOp = getMappedOp(Old))
820 return *MappedOp;
821 (void)D;
822 assert(G.Info[Old].ID > D.ID && "Expected a forward reference");
823 return &G.getFwdReference(*cast<MDNode>(Old));
824 });
825
826 auto *NewN = MDNode::replaceWithUniqued(std::move(ClonedN));
827 if (N && NewN && N != NewN) {
828 LLVM_DEBUG(dbgs() << "\nMap " << *N << "\n"
829 << "To " << *NewN << "\n\n");
830 }
831
832 M.mapToMetadata(N, NewN);
833
834 // Nodes that were referenced out of order in the POT are involved in a
835 // uniquing cycle.
836 if (HadPlaceholder)
837 CyclicNodes.push_back(NewN);
838 }
839
840 // Resolve cycles.
841 for (auto *N : CyclicNodes)
842 if (!N->isResolved())
843 N->resolveCycles();
844}
845
846Metadata *MDNodeMapper::map(const MDNode &N) {
847 assert(DistinctWorklist.empty() && "MDNodeMapper::map is not recursive");
848 assert(!(M.Flags & RF_NoModuleLevelChanges) &&
849 "MDNodeMapper::map assumes module-level changes");
850
851 // Require resolved nodes whenever metadata might be remapped.
852 assert(N.isResolved() && "Unexpected unresolved node");
853
854 Metadata *MappedN =
855 N.isUniqued() ? mapTopLevelUniquedNode(N) : mapDistinctNode(N);
856 while (!DistinctWorklist.empty())
857 remapOperands(*DistinctWorklist.pop_back_val(), [this](Metadata *Old) {
858 if (std::optional<Metadata *> MappedOp = tryToMapOperand(Old))
859 return *MappedOp;
860 return mapTopLevelUniquedNode(*cast<MDNode>(Old));
861 });
862 return MappedN;
863}
864
865Metadata *MDNodeMapper::mapTopLevelUniquedNode(const MDNode &FirstN) {
866 assert(FirstN.isUniqued() && "Expected uniqued node");
867
868 // Create a post-order traversal of uniqued nodes under FirstN.
869 UniquedGraph G;
870 if (!createPOT(G, FirstN)) {
871 // Return early if no nodes have changed.
872 for (const MDNode *N : G.POT)
873 M.mapToSelf(N);
874 return &const_cast<MDNode &>(FirstN);
875 }
876
877 // Update graph with all nodes that have changed.
878 G.propagateChanges();
879
880 // Map all the nodes in the graph.
881 mapNodesInPOT(G);
882
883 // Return the original node, remapped.
884 return *getMappedOp(&FirstN);
885}
886
887std::optional<Metadata *> Mapper::mapSimpleMetadata(const Metadata *MD) {
888 // If the value already exists in the map, use it.
889 if (std::optional<Metadata *> NewMD = getVM().getMappedMD(MD))
890 return *NewMD;
891
892 if (isa<MDString>(MD))
893 return const_cast<Metadata *>(MD);
894
895 // This is a module-level metadata. If nothing at the module level is
896 // changing, use an identity mapping.
897 if ((Flags & RF_NoModuleLevelChanges))
898 return const_cast<Metadata *>(MD);
899
900 if (auto *CMD = dyn_cast<ConstantAsMetadata>(MD)) {
901 // Don't memoize ConstantAsMetadata. Instead of lasting until the
902 // LLVMContext is destroyed, they can be deleted when the GlobalValue they
903 // reference is destructed. These aren't super common, so the extra
904 // indirection isn't that expensive.
905 return wrapConstantAsMetadata(*CMD, mapValue(CMD->getValue()));
906 }
907
908 // Map metadata matching IdentityMD predicate on first use. We need to add
909 // these nodes to the mapping as otherwise metadata nodes numbering gets
910 // messed up.
911 if (IdentityMD && (*IdentityMD)(MD))
912 return getVM().MD()[MD] = TrackingMDRef(const_cast<Metadata *>(MD));
913
914 assert(isa<MDNode>(MD) && "Expected a metadata node");
915
916 return std::nullopt;
917}
918
919Metadata *Mapper::mapMetadata(const Metadata *MD) {
920 assert(MD && "Expected valid metadata");
921 assert(!isa<LocalAsMetadata>(MD) && "Unexpected local metadata");
922
923 if (std::optional<Metadata *> NewMD = mapSimpleMetadata(MD))
924 return *NewMD;
925
926 return MDNodeMapper(*this).map(*cast<MDNode>(MD));
927}
928
929void Mapper::flush() {
930 // Flush out the worklist of global values.
931 while (!Worklist.empty()) {
932 WorklistEntry E = Worklist.pop_back_val();
933 CurrentMCID = E.MCID;
934 switch (E.Kind) {
935 case WorklistEntry::MapGlobalInit:
936 E.Data.GVInit.GV->setInitializer(mapConstant(E.Data.GVInit.Init));
937 remapGlobalObjectMetadata(*E.Data.GVInit.GV);
938 break;
939 case WorklistEntry::MapAppendingVar: {
940 unsigned PrefixSize = AppendingInits.size() - E.AppendingGVNumNewMembers;
941 // mapAppendingVariable call can change AppendingInits if initalizer for
942 // the variable depends on another appending global, because of that inits
943 // need to be extracted and updated before the call.
945 drop_begin(AppendingInits, PrefixSize));
946 AppendingInits.resize(PrefixSize);
947 mapAppendingVariable(*E.Data.AppendingGV.GV,
948 E.Data.AppendingGV.OldGV,
949 E.AppendingGVIsOldCtorDtor, ArrayRef(NewInits));
950 break;
951 }
952 case WorklistEntry::MapAliasOrIFunc: {
953 GlobalValue *GV = E.Data.AliasOrIFunc.GV;
954 Constant *Target = mapConstant(E.Data.AliasOrIFunc.Target);
955 if (auto *GA = dyn_cast<GlobalAlias>(GV))
956 GA->setAliasee(Target);
957 else if (auto *GI = dyn_cast<GlobalIFunc>(GV))
958 GI->setResolver(Target);
959 else
960 llvm_unreachable("Not alias or ifunc");
961 break;
962 }
963 case WorklistEntry::RemapFunction:
964 remapFunction(*E.Data.RemapF);
965 break;
966 }
967 }
968 CurrentMCID = 0;
969
970 // Finish logic for block addresses now that all global values have been
971 // handled.
972 while (!DelayedBBs.empty()) {
973 DelayedBasicBlock DBB = DelayedBBs.pop_back_val();
974 BasicBlock *BB = cast_or_null<BasicBlock>(mapValue(DBB.OldBB));
975 DBB.TempBB->replaceAllUsesWith(BB ? BB : DBB.OldBB);
976 }
977}
978
979void Mapper::remapInstruction(Instruction *I) {
980 // Remap operands.
981 for (Use &Op : I->operands()) {
982 Value *V = mapValue(Op);
983 // If we aren't ignoring missing entries, assert that something happened.
984 if (V)
985 Op = V;
986 else
987 assert((Flags & RF_IgnoreMissingLocals) &&
988 "Referenced value not in value map!");
989 }
990
991 // Drop callee_type metadata from calls that were remapped
992 // into a direct call from an indirect one.
993 if (auto *CB = dyn_cast<CallBase>(I)) {
994 if (CB->getMetadata(LLVMContext::MD_callee_type) && !CB->isIndirectCall())
995 CB->setMetadata(LLVMContext::MD_callee_type, nullptr);
996 }
997
998 // Remap phi nodes' incoming blocks.
999 if (PHINode *PN = dyn_cast<PHINode>(I)) {
1000 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
1001 Value *V = mapValue(PN->getIncomingBlock(i));
1002 // If we aren't ignoring missing entries, assert that something happened.
1003 if (V)
1004 PN->setIncomingBlock(i, cast<BasicBlock>(V));
1005 else
1006 assert((Flags & RF_IgnoreMissingLocals) &&
1007 "Referenced block not in value map!");
1008 }
1009 }
1010
1011 // Remap attached metadata.
1013 I->getAllMetadata(MDs);
1014 for (const auto &MI : MDs) {
1015 MDNode *Old = MI.second;
1016 MDNode *New = cast_or_null<MDNode>(mapMetadata(Old));
1017 if (New != Old)
1018 I->setMetadata(MI.first, New);
1019 }
1020
1021 // Remap source location atom instance.
1022 if (!(Flags & RF_DoNotRemapAtoms))
1023 RemapSourceAtom(I, getVM());
1024
1025 if (!TypeMapper)
1026 return;
1027
1028 // If the instruction's type is being remapped, do so now.
1029 if (auto *CB = dyn_cast<CallBase>(I)) {
1031 FunctionType *FTy = CB->getFunctionType();
1032 Tys.reserve(FTy->getNumParams());
1033 for (Type *Ty : FTy->params())
1034 Tys.push_back(TypeMapper->remapType(Ty));
1035 CB->mutateFunctionType(FunctionType::get(
1036 TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg()));
1037
1038 LLVMContext &C = CB->getContext();
1039 AttributeList Attrs = CB->getAttributes();
1040 for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) {
1041 for (int AttrIdx = Attribute::FirstTypeAttr;
1042 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
1043 Attribute::AttrKind TypedAttr = (Attribute::AttrKind)AttrIdx;
1044 if (Type *Ty =
1045 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
1046 Attrs = Attrs.replaceAttributeTypeAtIndex(C, i, TypedAttr,
1047 TypeMapper->remapType(Ty));
1048 break;
1049 }
1050 }
1051 }
1052 CB->setAttributes(Attrs);
1053 return;
1054 }
1055 if (auto *AI = dyn_cast<AllocaInst>(I))
1056 AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
1057 if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
1058 GEP->setSourceElementType(
1059 TypeMapper->remapType(GEP->getSourceElementType()));
1060 GEP->setResultElementType(
1061 TypeMapper->remapType(GEP->getResultElementType()));
1062 }
1063 I->mutateType(TypeMapper->remapType(I->getType()));
1064}
1065
1066void Mapper::remapGlobalObjectMetadata(GlobalObject &GO) {
1068 GO.getAllMetadata(MDs);
1069 GO.clearMetadata();
1070 for (const auto &I : MDs)
1071 GO.addMetadata(I.first, *cast<MDNode>(mapMetadata(I.second)));
1072}
1073
1074void Mapper::remapFunction(Function &F) {
1075 // Remap the operands.
1076 for (Use &Op : F.operands())
1077 if (Op)
1078 Op = mapValue(Op);
1079
1080 // Remap the metadata attachments.
1081 remapGlobalObjectMetadata(F);
1082
1083 // Remap the argument types.
1084 if (TypeMapper)
1085 for (Argument &A : F.args())
1086 A.mutateType(TypeMapper->remapType(A.getType()));
1087
1088 // Remap the instructions.
1089 for (BasicBlock &BB : F) {
1090 for (Instruction &I : BB) {
1091 remapInstruction(&I);
1092 for (DbgRecord &DR : I.getDbgRecordRange())
1093 remapDbgRecord(DR);
1094 }
1095 }
1096}
1097
1098void Mapper::mapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV,
1099 bool IsOldCtorDtor,
1100 ArrayRef<Constant *> NewMembers) {
1101 Constant *InitPrefix =
1102 (OldGV && !OldGV->isDeclaration()) ? OldGV->getInitializer() : nullptr;
1103
1105 if (InitPrefix) {
1106 unsigned NumElements =
1107 cast<ArrayType>(InitPrefix->getType())->getNumElements();
1108 for (unsigned I = 0; I != NumElements; ++I)
1109 Elements.push_back(InitPrefix->getAggregateElement(I));
1110 OldGV->setInitializer(nullptr);
1111 if (InitPrefix->hasUseList() && InitPrefix->use_empty())
1112 InitPrefix->destroyConstant();
1113 }
1114
1115 PointerType *VoidPtrTy;
1116 Type *EltTy;
1117 if (IsOldCtorDtor) {
1118 // FIXME: This upgrade is done during linking to support the C API. See
1119 // also IRLinker::linkAppendingVarProto() in IRMover.cpp.
1120 VoidPtrTy = PointerType::getUnqual(GV.getContext());
1121 auto &ST = *cast<StructType>(NewMembers.front()->getType());
1122 Type *Tys[3] = {ST.getElementType(0), ST.getElementType(1), VoidPtrTy};
1123 EltTy = StructType::get(GV.getContext(), Tys, false);
1124 }
1125
1126 for (auto *V : NewMembers) {
1127 Constant *NewV;
1128 if (IsOldCtorDtor) {
1129 auto *S = cast<ConstantStruct>(V);
1130 auto *E1 = cast<Constant>(mapValue(S->getOperand(0)));
1131 auto *E2 = cast<Constant>(mapValue(S->getOperand(1)));
1132 Constant *Null = Constant::getNullValue(VoidPtrTy);
1133 NewV = ConstantStruct::get(cast<StructType>(EltTy), E1, E2, Null);
1134 } else {
1135 NewV = cast_or_null<Constant>(mapValue(V));
1136 }
1137 Elements.push_back(NewV);
1138 }
1139
1140 GV.setInitializer(
1142}
1143
1144void Mapper::scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init,
1145 unsigned MCID) {
1146 assert(AlreadyScheduled.insert(&GV).second && "Should not reschedule");
1147 assert(MCID < MCs.size() && "Invalid mapping context");
1148
1149 WorklistEntry WE;
1150 WE.Kind = WorklistEntry::MapGlobalInit;
1151 WE.MCID = MCID;
1152 WE.Data.GVInit.GV = &GV;
1153 WE.Data.GVInit.Init = &Init;
1154 Worklist.push_back(WE);
1155}
1156
1157void Mapper::scheduleMapAppendingVariable(GlobalVariable &GV,
1158 GlobalVariable *OldGV,
1159 bool IsOldCtorDtor,
1160 ArrayRef<Constant *> NewMembers,
1161 unsigned MCID) {
1162 assert(AlreadyScheduled.insert(&GV).second && "Should not reschedule");
1163 assert(MCID < MCs.size() && "Invalid mapping context");
1164
1165 WorklistEntry WE;
1166 WE.Kind = WorklistEntry::MapAppendingVar;
1167 WE.MCID = MCID;
1168 WE.Data.AppendingGV.GV = &GV;
1169 WE.Data.AppendingGV.OldGV = OldGV;
1170 WE.AppendingGVIsOldCtorDtor = IsOldCtorDtor;
1171 WE.AppendingGVNumNewMembers = NewMembers.size();
1172 Worklist.push_back(WE);
1173 AppendingInits.append(NewMembers.begin(), NewMembers.end());
1174}
1175
1176void Mapper::scheduleMapAliasOrIFunc(GlobalValue &GV, Constant &Target,
1177 unsigned MCID) {
1178 assert(AlreadyScheduled.insert(&GV).second && "Should not reschedule");
1180 "Should be alias or ifunc");
1181 assert(MCID < MCs.size() && "Invalid mapping context");
1182
1183 WorklistEntry WE;
1184 WE.Kind = WorklistEntry::MapAliasOrIFunc;
1185 WE.MCID = MCID;
1186 WE.Data.AliasOrIFunc.GV = &GV;
1187 WE.Data.AliasOrIFunc.Target = &Target;
1188 Worklist.push_back(WE);
1189}
1190
1191void Mapper::scheduleRemapFunction(Function &F, unsigned MCID) {
1192 assert(AlreadyScheduled.insert(&F).second && "Should not reschedule");
1193 assert(MCID < MCs.size() && "Invalid mapping context");
1194
1195 WorklistEntry WE;
1196 WE.Kind = WorklistEntry::RemapFunction;
1197 WE.MCID = MCID;
1198 WE.Data.RemapF = &F;
1199 Worklist.push_back(WE);
1200}
1201
1202void Mapper::addFlags(RemapFlags Flags) {
1203 assert(!hasWorkToDo() && "Expected to have flushed the worklist");
1204 this->Flags = this->Flags | Flags;
1205}
1206
1207static Mapper *getAsMapper(void *pImpl) {
1208 return reinterpret_cast<Mapper *>(pImpl);
1209}
1210
1211namespace {
1212
1213class FlushingMapper {
1214 Mapper &M;
1215
1216public:
1217 explicit FlushingMapper(void *pImpl) : M(*getAsMapper(pImpl)) {
1218 assert(!M.hasWorkToDo() && "Expected to be flushed");
1219 }
1220
1221 ~FlushingMapper() { M.flush(); }
1222
1223 Mapper *operator->() const { return &M; }
1224};
1225
1226} // end anonymous namespace
1227
1229 ValueMapTypeRemapper *TypeMapper,
1230 ValueMaterializer *Materializer,
1231 const MetadataPredicate *IdentityMD)
1232 : pImpl(new Mapper(VM, Flags, TypeMapper, Materializer, IdentityMD)) {}
1233
1235
1236unsigned
1238 ValueMaterializer *Materializer) {
1239 return getAsMapper(pImpl)->registerAlternateMappingContext(VM, Materializer);
1240}
1241
1243 FlushingMapper(pImpl)->addFlags(Flags);
1244}
1245
1247 return FlushingMapper(pImpl)->mapValue(&V);
1248}
1249
1253
1255 return FlushingMapper(pImpl)->mapMetadata(&MD);
1256}
1257
1261
1263 FlushingMapper(pImpl)->remapInstruction(&I);
1264}
1265
1267 FlushingMapper(pImpl)->remapDbgRecord(DR);
1268}
1269
1276
1278 FlushingMapper(pImpl)->remapFunction(F);
1279}
1280
1282 FlushingMapper(pImpl)->remapGlobalObjectMetadata(GO);
1283}
1284
1286 Constant &Init,
1287 unsigned MCID) {
1288 getAsMapper(pImpl)->scheduleMapGlobalInitializer(GV, Init, MCID);
1289}
1290
1292 GlobalVariable *OldGV,
1293 bool IsOldCtorDtor,
1294 ArrayRef<Constant *> NewMembers,
1295 unsigned MCID) {
1296 getAsMapper(pImpl)->scheduleMapAppendingVariable(
1297 GV, OldGV, IsOldCtorDtor, NewMembers, MCID);
1298}
1299
1301 unsigned MCID) {
1302 getAsMapper(pImpl)->scheduleMapAliasOrIFunc(GA, Aliasee, MCID);
1303}
1304
1306 unsigned MCID) {
1307 getAsMapper(pImpl)->scheduleMapAliasOrIFunc(GI, Resolver, MCID);
1308}
1309
1311 getAsMapper(pImpl)->scheduleRemapFunction(F, MCID);
1312}
1313
1315 const DebugLoc &DL = I->getDebugLoc();
1316 if (!DL)
1317 return;
1318
1319 auto AtomGroup = DL->getAtomGroup();
1320 if (!AtomGroup)
1321 return;
1322
1323 auto R = VM.AtomMap.find({DL->getInlinedAt(), AtomGroup});
1324 if (R == VM.AtomMap.end())
1325 return;
1326 AtomGroup = R->second;
1327
1328 // Remap the atom group and copy all other fields.
1330 I->getContext(), DL.getLine(), DL.getCol(), DL.getScope(),
1331 DL.getInlinedAt(), DL.isImplicitCode(), AtomGroup, DL->getAtomRank());
1332 I->setDebugLoc(New);
1333}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static unsigned getMappedOp(unsigned PseudoOp)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Hexagon Common GEP
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file contains the declarations for metadata subclasses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
LoopAnalysisManager LAM
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:114
static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, DenseMap< VPValue *, VPValue * > &Old2NewVPValues)
Definition VPlan.cpp:1115
static Mapper * getAsMapper(void *pImpl)
static ConstantAsMetadata * wrapConstantAsMetadata(const ConstantAsMetadata &CMD, Value *MappedV)
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
const T & front() const
front - Get the first element.
Definition ArrayRef.h:145
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:88
LLVM Basic Block Representation.
Definition BasicBlock.h:62
The address of a basic block.
Definition Constants.h:899
Function * getFunction() const
Definition Constants.h:935
BasicBlock * getBasicBlock() const
Definition Constants.h:934
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
Constant * getValue() const
Definition Metadata.h:544
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1125
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
LLVM_ABI void destroyConstant()
Called if some element of this constant is no longer valid.
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
void setDebugLoc(DebugLoc Loc)
Record of a variable value-assignment, aka a non instruction representation of the dbg....
A debug info location.
Definition DebugLoc.h:124
Class to represent function types.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI void clearMetadata()
Erase all metadata attached to this Value.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:328
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
Definition Globals.cpp:524
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
Definition InlineAsm.cpp:43
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Metadata node.
Definition Metadata.h:1078
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithDistinct(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a distinct one.
Definition Metadata.h:1327
bool isUniqued() const
Definition Metadata.h:1260
const MDOperand * op_iterator
Definition Metadata.h:1429
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithUniqued(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a uniqued one.
Definition Metadata.h:1317
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1526
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:104
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Interface for looking up the initializer for a variable name, used by Init::resolveReferences.
Definition Record.h:2199
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:413
Target - Wrapper for Target specific information.
Tracking metadata reference.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:503
static ConstantAsMetadata * getConstant(Value *C)
Definition Metadata.h:480
This is a class that can be implemented by clients to remap types when cloning constants and instruct...
Definition ValueMapper.h:45
virtual Type * remapType(Type *SrcTy)=0
The client should implement this method if they want to remap types while mapping values.
ValueMapIteratorImpl< MapT, const Value *, false > iterator
Definition ValueMap.h:135
DMAtomT AtomMap
Map {(InlinedAt, old atom number) -> new atom number}.
Definition ValueMap.h:123
LLVM_ABI void remapDbgRecord(Module *M, DbgRecord &V)
LLVM_ABI ~ValueMapper()
LLVM_ABI void remapDbgRecordRange(Module *M, iterator_range< DbgRecordIterator > Range)
LLVM_ABI MDNode * mapMDNode(const MDNode &N)
LLVM_ABI Metadata * mapMetadata(const Metadata &MD)
LLVM_ABI void remapInstruction(Instruction &I)
LLVM_ABI void scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init, unsigned MappingContextID=0)
LLVM_ABI void scheduleRemapFunction(Function &F, unsigned MappingContextID=0)
LLVM_ABI ValueMapper(ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
LLVM_ABI void scheduleMapGlobalIFunc(GlobalIFunc &GI, Constant &Resolver, unsigned MappingContextID=0)
LLVM_ABI unsigned registerAlternateMappingContext(ValueToValueMapTy &VM, ValueMaterializer *Materializer=nullptr)
Register an alternate mapping context.
LLVM_ABI void remapFunction(Function &F)
LLVM_ABI Constant * mapConstant(const Constant &C)
LLVM_ABI void scheduleMapGlobalAlias(GlobalAlias &GA, Constant &Aliasee, unsigned MappingContextID=0)
LLVM_ABI void remapGlobalObjectMetadata(GlobalObject &GO)
LLVM_ABI Value * mapValue(const Value &V)
LLVM_ABI void scheduleMapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV, bool IsOldCtorDtor, ArrayRef< Constant * > NewMembers, unsigned MappingContextID=0)
LLVM_ABI void addFlags(RemapFlags Flags)
Add to the current RemapFlags.
This is a class that can be implemented by clients to materialize Values on demand.
Definition ValueMapper.h:58
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasUseList() const
Check if this Value has a use-list.
Definition Value.h:344
bool use_empty() const
Definition Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1099
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
A range adaptor for a pair of iterators.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ CE
Windows NT (Windows on ARM)
Definition MCAsmInfo.h:48
NodeAddr< FuncNode * > Func
Definition RDFGraph.h:393
Context & getContext() const
Definition BasicBlock.h:99
iterator end() const
Definition BasicBlock.h:89
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
std::function< bool(const Metadata *)> MetadataPredicate
Definition ValueMapper.h:41
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto cast_or_null(const Y &Val)
Definition Casting.h:714
RemapFlags
These are flags that the value mapping APIs allow.
Definition ValueMapper.h:74
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
Definition ValueMapper.h:98
@ RF_NullMapMissingGlobalValues
Any global values not in value map are mapped to null instead of mapping to self.
@ RF_NoModuleLevelChanges
If this flag is set, the remapper knows that only local values within a function (such as an instruct...
Definition ValueMapper.h:80
@ RF_DoNotRemapAtoms
Do not remap source location atoms.
@ RF_ReuseAndMutateDistinctMDs
Instruct the remapper to reuse and mutate distinct metadata (remapping them in place) instead of clon...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
void RemapFunction(Function &F, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)
Remap the operands, metadata, arguments, and instructions of a function.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1897
LLVM_ABI void RemapSourceAtom(Instruction *I, ValueToValueMapTy &VM)
Remap source location atom.
#define N
#define NC
Definition regutils.h:42