48#define DEBUG_TYPE "value-mapper"
51void ValueMapTypeRemapper::anchor() {}
52void ValueMaterializer::anchor() {}
58struct DelayedBasicBlock {
60 std::unique_ptr<BasicBlock> TempBB;
63 : OldBB(Old.getBasicBlock()),
64 TempBB(
BasicBlock::Create(Old.getContext())) {}
78 struct AppendingGVTy {
82 struct AliasOrIFuncTy {
89 unsigned AppendingGVIsOldCtorDtor : 1;
90 unsigned AppendingGVNumNewMembers;
93 AppendingGVTy AppendingGV;
94 AliasOrIFuncTy AliasOrIFunc;
99struct MappingContext {
106 : VM(&VM), Materializer(Materializer) {}
110 friend class MDNodeMapper;
118 unsigned CurrentMCID = 0;
130 MCs(1, MappingContext(VM, Materializer)), IdentityMD(IdentityMD) {}
133 ~Mapper() {
assert(!hasWorkToDo() &&
"Expected to be flushed"); }
135 bool hasWorkToDo()
const {
return !Worklist.
empty(); }
140 MCs.
push_back(MappingContext(VM, Materializer));
141 return MCs.
size() - 1;
154 return cast_or_null<Constant>(mapValue(
C));
171 void scheduleRemapFunction(
Function &
F,
unsigned MCID);
186 std::optional<Metadata *> mapSimpleMetadata(
const Metadata *MD);
197 bool HasChanged =
false;
198 unsigned ID = std::numeric_limits<unsigned>::max();
199 TempMDNode Placeholder;
203 struct UniquedGraph {
211 void propagateChanges();
225 MDNodeMapper(Mapper &M) :
M(
M) {}
278 std::optional<Metadata *> tryToMapOperand(
const Metadata *
Op);
306 bool createPOT(UniquedGraph &
G,
const MDNode &FirstN);
327 void mapNodesInPOT(UniquedGraph &
G);
335 template <
class OperandMapper>
345 if (
I != getVM().
end()) {
346 assert(
I->second &&
"Unexpected null mapping");
351 if (
auto *Materializer = getMaterializer()) {
352 if (
Value *NewV = Materializer->materialize(
const_cast<Value *
>(V))) {
360 if (isa<GlobalValue>(V)) {
363 return getVM()[
V] =
const_cast<Value *
>(
V);
366 if (
const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
370 NewTy = cast<FunctionType>(TypeMapper->
remapType(NewTy));
372 if (NewTy !=
IA->getFunctionType())
374 IA->hasSideEffects(),
IA->isAlignStack(),
375 IA->getDialect(),
IA->canThrow());
378 return getVM()[
V] =
const_cast<Value *
>(
V);
381 if (
const auto *MDV = dyn_cast<MetadataAsValue>(V)) {
382 const Metadata *MD = MDV->getMetadata();
384 if (
auto *
LAM = dyn_cast<LocalAsMetadata>(MD)) {
386 if (
Value *LV = mapValue(
LAM->getValue())) {
387 if (V ==
LAM->getValue())
388 return const_cast<Value *
>(V);
399 if (
auto *AL = dyn_cast<DIArgList>(MD)) {
401 for (
auto *VAM :
AL->getArgs()) {
409 }
else if (
Value *LV = mapValue(VAM->getValue())) {
427 return getVM()[
V] =
const_cast<Value *
>(
V);
430 auto *MappedMD = mapMetadata(MD);
432 return getVM()[
V] =
const_cast<Value *
>(
V);
443 return mapBlockAddress(*BA);
445 if (
const auto *E = dyn_cast<DSOLocalEquivalent>(
C)) {
446 auto *Val = mapValue(E->getGlobalValue());
451 auto *
Func = cast<Function>(Val->stripPointerCastsAndAliases());
452 Type *NewTy = E->getType();
459 if (
const auto *
NC = dyn_cast<NoCFIValue>(
C)) {
460 auto *Val = mapValue(
NC->getGlobalValue());
465 auto mapValueOrNull = [
this](
Value *
V) {
466 auto Mapped = mapValue(V);
468 "Unexpected null mapping for constant operand without "
469 "NullMapMissingGlobalValues flag");
475 unsigned OpNo = 0, NumOperands =
C->getNumOperands();
476 Value *Mapped =
nullptr;
477 for (; OpNo != NumOperands; ++OpNo) {
479 Mapped = mapValueOrNull(
Op);
487 Type *NewTy =
C->getType();
493 if (OpNo == NumOperands && NewTy ==
C->getType())
494 return getVM()[
V] =
C;
500 for (
unsigned j = 0;
j != OpNo; ++
j)
501 Ops.
push_back(cast<Constant>(
C->getOperand(j)));
504 if (OpNo != NumOperands) {
508 for (++OpNo; OpNo != NumOperands; ++OpNo) {
509 Mapped = mapValueOrNull(
C->getOperand(OpNo));
515 Type *NewSrcTy =
nullptr;
517 if (
auto *GEPO = dyn_cast<GEPOperator>(
C))
518 NewSrcTy = TypeMapper->
remapType(GEPO->getSourceElementType());
521 return getVM()[
V] =
CE->getWithOperands(Ops, NewTy,
false, NewSrcTy);
522 if (isa<ConstantArray>(
C))
524 if (isa<ConstantStruct>(
C))
526 if (isa<ConstantVector>(
C))
528 if (isa<ConstantPtrAuth>(
C))
530 cast<ConstantInt>(Ops[2]), Ops[3]);
532 if (isa<PoisonValue>(
C))
534 if (isa<UndefValue>(
C))
536 if (isa<ConstantAggregateZero>(
C))
538 if (isa<ConstantTargetNone>(
C))
540 assert(isa<ConstantPointerNull>(
C));
544void Mapper::remapDbgRecord(
DbgRecord &DR) {
551 DLR->setLabel(cast<DILabel>(mapMetadata(DLR->getLabel())));
557 auto *MappedVar = mapMetadata(
V.getVariable());
558 V.setVariable(cast<DILocalVariable>(MappedVar));
562 if (
V.isDbgAssign()) {
563 auto *NewAddr = mapValue(
V.getAddress());
564 if (!IgnoreMissingLocals && !NewAddr)
567 V.setAddress(NewAddr);
568 V.setAssignId(cast<DIAssignID>(mapMetadata(
V.getAssignID())));
574 for (
Value *Val : Vals)
587 for (
unsigned int I = 0;
I < Vals.size(); ++
I)
589 V.replaceVariableLocationOp(
I, NewVals[
I]);
601 DelayedBBs.
push_back(DelayedBasicBlock(BA));
602 BB = DelayedBBs.
back().TempBB.get();
611 getVM().MD()[
Key].reset(Val);
616 return mapToMetadata(MD,
const_cast<Metadata *
>(MD));
619std::optional<Metadata *> MDNodeMapper::tryToMapOperand(
const Metadata *
Op) {
623 if (std::optional<Metadata *> MappedOp =
M.mapSimpleMetadata(
Op)) {
625 if (
auto *CMD = dyn_cast<ConstantAsMetadata>(
Op))
626 assert((!*MappedOp ||
M.getVM().count(CMD->getValue()) ||
627 M.getVM().getMappedMD(
Op)) &&
628 "Expected Value to be memoized");
630 assert((isa<MDString>(
Op) ||
M.getVM().getMappedMD(
Op)) &&
631 "Expected result to be memoized");
638 return mapDistinctNode(
N);
643 assert(
N.isDistinct() &&
"Expected a distinct node");
644 assert(!
M.getVM().getMappedMD(&
N) &&
"Expected an unmapped node");
648 NewM =
M.mapToSelf(&
N);
652 <<
"To " << *NewM <<
"\n\n");
653 M.mapToMetadata(&
N, NewM);
655 DistinctWorklist.push_back(cast<MDNode>(NewM));
657 return DistinctWorklist.back();
667std::optional<Metadata *> MDNodeMapper::getMappedOp(
const Metadata *
Op)
const {
671 if (std::optional<Metadata *> MappedOp =
M.getVM().getMappedMD(
Op))
674 if (isa<MDString>(
Op))
677 if (
auto *CMD = dyn_cast<ConstantAsMetadata>(
Op))
684 auto Where =
Info.find(&
Op);
685 assert(Where !=
Info.end() &&
"Expected a valid reference");
687 auto &OpD = Where->second;
692 if (!OpD.Placeholder)
693 OpD.Placeholder =
Op.clone();
695 return *OpD.Placeholder;
698template <
class OperandMapper>
699void MDNodeMapper::remapOperands(
MDNode &
N, OperandMapper mapOperand) {
700 assert(!
N.isUniqued() &&
"Expected distinct or temporary nodes");
701 for (
unsigned I = 0, E =
N.getNumOperands();
I != E; ++
I) {
705 LLVM_DEBUG(
dbgs() <<
"Replacing Op " << Old <<
" with " << New <<
" in "
709 N.replaceOperandWith(
I, New);
716struct POTWorklistEntry {
722 bool HasChanged =
false;
724 POTWorklistEntry(
MDNode &
N) :
N(&
N),
Op(
N.op_begin()) {}
729bool MDNodeMapper::createPOT(UniquedGraph &
G,
const MDNode &FirstN) {
730 assert(
G.Info.empty() &&
"Expected a fresh traversal");
734 bool AnyChanges =
false;
737 (void)
G.Info[&FirstN];
738 while (!Worklist.
empty()) {
740 auto &WE = Worklist.
back();
741 if (
MDNode *
N = visitOperands(
G, WE.Op, WE.N->op_end(), WE.HasChanged)) {
748 assert(WE.N->isUniqued() &&
"Expected only uniqued nodes");
749 assert(WE.Op == WE.N->op_end() &&
"Expected to visit all operands");
750 auto &
D =
G.Info[WE.N];
751 AnyChanges |=
D.HasChanged = WE.HasChanged;
753 G.POT.push_back(WE.N);
765 if (std::optional<Metadata *> MappedOp = tryToMapOperand(
Op)) {
767 HasChanged |=
Op != *MappedOp;
774 "Only uniqued operands cannot be mapped immediately");
775 if (
G.Info.try_emplace(&OpN).second)
781void MDNodeMapper::UniquedGraph::propagateChanges() {
791 auto Where = Info.find(Op);
792 return Where != Info.end() && Where->second.HasChanged;
796 AnyChanges =
D.HasChanged =
true;
798 }
while (AnyChanges);
801void MDNodeMapper::mapNodesInPOT(UniquedGraph &
G) {
804 for (
auto *
N :
G.POT) {
813 bool HadPlaceholder(
D.Placeholder);
816 TempMDNode ClonedN =
D.Placeholder ? std::move(
D.Placeholder) :
N->clone();
818 if (std::optional<Metadata *> MappedOp =
getMappedOp(Old))
821 assert(
G.Info[Old].ID >
D.ID &&
"Expected a forward reference");
822 return &
G.getFwdReference(*cast<MDNode>(Old));
826 if (
N && NewN &&
N != NewN) {
828 <<
"To " << *NewN <<
"\n\n");
831 M.mapToMetadata(
N, NewN);
840 for (
auto *
N : CyclicNodes)
841 if (!
N->isResolved())
846 assert(DistinctWorklist.empty() &&
"MDNodeMapper::map is not recursive");
848 "MDNodeMapper::map assumes module-level changes");
851 assert(
N.isResolved() &&
"Unexpected unresolved node");
854 N.isUniqued() ? mapTopLevelUniquedNode(
N) : mapDistinctNode(
N);
855 while (!DistinctWorklist.empty())
857 if (std::optional<Metadata *> MappedOp = tryToMapOperand(Old))
859 return mapTopLevelUniquedNode(*cast<MDNode>(Old));
864Metadata *MDNodeMapper::mapTopLevelUniquedNode(
const MDNode &FirstN) {
869 if (!createPOT(
G, FirstN)) {
873 return &
const_cast<MDNode &
>(FirstN);
877 G.propagateChanges();
886std::optional<Metadata *> Mapper::mapSimpleMetadata(
const Metadata *MD) {
888 if (std::optional<Metadata *> NewMD = getVM().getMappedMD(MD))
891 if (isa<MDString>(MD))
899 if (
auto *CMD = dyn_cast<ConstantAsMetadata>(MD)) {
910 if (IdentityMD && (*IdentityMD)(MD))
913 assert(isa<MDNode>(MD) &&
"Expected a metadata node");
919 assert(MD &&
"Expected valid metadata");
920 assert(!isa<LocalAsMetadata>(MD) &&
"Unexpected local metadata");
922 if (std::optional<Metadata *> NewMD = mapSimpleMetadata(MD))
925 return MDNodeMapper(*this).map(*cast<MDNode>(MD));
928void Mapper::flush() {
930 while (!Worklist.
empty()) {
932 CurrentMCID = E.MCID;
934 case WorklistEntry::MapGlobalInit:
935 E.Data.GVInit.GV->setInitializer(mapConstant(E.Data.GVInit.Init));
936 remapGlobalObjectMetadata(*E.Data.GVInit.GV);
938 case WorklistEntry::MapAppendingVar: {
939 unsigned PrefixSize = AppendingInits.
size() - E.AppendingGVNumNewMembers;
945 AppendingInits.
resize(PrefixSize);
946 mapAppendingVariable(*E.Data.AppendingGV.GV,
947 E.Data.AppendingGV.InitPrefix,
948 E.AppendingGVIsOldCtorDtor,
ArrayRef(NewInits));
951 case WorklistEntry::MapAliasOrIFunc: {
954 if (
auto *GA = dyn_cast<GlobalAlias>(GV))
956 else if (
auto *GI = dyn_cast<GlobalIFunc>(GV))
962 case WorklistEntry::RemapFunction:
963 remapFunction(*E.Data.RemapF);
971 while (!DelayedBBs.
empty()) {
973 BasicBlock *BB = cast_or_null<BasicBlock>(mapValue(DBB.OldBB));
974 DBB.TempBB->replaceAllUsesWith(BB ? BB : DBB.OldBB);
980 for (
Use &
Op :
I->operands()) {
987 "Referenced value not in value map!");
992 if (
auto *CB = dyn_cast<CallBase>(
I)) {
993 if (CB->getMetadata(LLVMContext::MD_callee_type) && !CB->isIndirectCall())
994 CB->setMetadata(LLVMContext::MD_callee_type,
nullptr);
998 if (
PHINode *PN = dyn_cast<PHINode>(
I)) {
999 for (
unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
1000 Value *
V = mapValue(PN->getIncomingBlock(i));
1003 PN->setIncomingBlock(i, cast<BasicBlock>(V));
1006 "Referenced block not in value map!");
1012 I->getAllMetadata(MDs);
1013 for (
const auto &
MI : MDs) {
1015 MDNode *
New = cast_or_null<MDNode>(mapMetadata(Old));
1017 I->setMetadata(
MI.first, New);
1028 if (
auto *CB = dyn_cast<CallBase>(
I)) {
1031 Tys.
reserve(FTy->getNumParams());
1032 for (
Type *Ty : FTy->params())
1035 TypeMapper->
remapType(
I->getType()), Tys, FTy->isVarArg()));
1039 for (
unsigned i = 0; i <
Attrs.getNumAttrSets(); ++i) {
1040 for (
int AttrIdx = Attribute::FirstTypeAttr;
1041 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
1044 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
1045 Attrs =
Attrs.replaceAttributeTypeAtIndex(
C, i, TypedAttr,
1051 CB->setAttributes(Attrs);
1054 if (
auto *AI = dyn_cast<AllocaInst>(
I))
1055 AI->setAllocatedType(TypeMapper->
remapType(AI->getAllocatedType()));
1056 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
I)) {
1057 GEP->setSourceElementType(
1059 GEP->setResultElementType(
1062 I->mutateType(TypeMapper->
remapType(
I->getType()));
1065void Mapper::remapGlobalObjectMetadata(
GlobalObject &GO) {
1069 for (
const auto &
I : MDs)
1070 GO.
addMetadata(
I.first, *cast<MDNode>(mapMetadata(
I.second)));
1073void Mapper::remapFunction(
Function &
F) {
1075 for (
Use &
Op :
F.operands())
1080 remapGlobalObjectMetadata(
F);
1090 remapInstruction(&
I);
1102 unsigned NumElements =
1103 cast<ArrayType>(InitPrefix->
getType())->getNumElements();
1104 for (
unsigned I = 0;
I != NumElements; ++
I)
1110 if (IsOldCtorDtor) {
1114 auto &
ST = *cast<StructType>(NewMembers.
front()->getType());
1115 Type *Tys[3] = {
ST.getElementType(0),
ST.getElementType(1), VoidPtrTy};
1119 for (
auto *V : NewMembers) {
1121 if (IsOldCtorDtor) {
1122 auto *S = cast<ConstantStruct>(V);
1123 auto *E1 = cast<Constant>(mapValue(S->getOperand(0)));
1124 auto *E2 = cast<Constant>(mapValue(S->getOperand(1)));
1128 NewV = cast_or_null<Constant>(mapValue(V));
1139 assert(AlreadyScheduled.
insert(&GV).second &&
"Should not reschedule");
1140 assert(MCID < MCs.
size() &&
"Invalid mapping context");
1143 WE.Kind = WorklistEntry::MapGlobalInit;
1145 WE.Data.GVInit.GV = &GV;
1146 WE.Data.GVInit.Init = &
Init;
1155 assert(AlreadyScheduled.
insert(&GV).second &&
"Should not reschedule");
1156 assert(MCID < MCs.
size() &&
"Invalid mapping context");
1159 WE.Kind = WorklistEntry::MapAppendingVar;
1161 WE.Data.AppendingGV.GV = &GV;
1162 WE.Data.AppendingGV.InitPrefix = InitPrefix;
1163 WE.AppendingGVIsOldCtorDtor = IsOldCtorDtor;
1164 WE.AppendingGVNumNewMembers = NewMembers.
size();
1171 assert(AlreadyScheduled.
insert(&GV).second &&
"Should not reschedule");
1172 assert((isa<GlobalAlias>(GV) || isa<GlobalIFunc>(GV)) &&
1173 "Should be alias or ifunc");
1174 assert(MCID < MCs.
size() &&
"Invalid mapping context");
1177 WE.Kind = WorklistEntry::MapAliasOrIFunc;
1179 WE.Data.AliasOrIFunc.GV = &GV;
1180 WE.Data.AliasOrIFunc.Target = &
Target;
1184void Mapper::scheduleRemapFunction(
Function &
F,
unsigned MCID) {
1185 assert(AlreadyScheduled.
insert(&
F).second &&
"Should not reschedule");
1186 assert(MCID < MCs.
size() &&
"Invalid mapping context");
1189 WE.Kind = WorklistEntry::RemapFunction;
1191 WE.Data.RemapF = &
F;
1196 assert(!hasWorkToDo() &&
"Expected to have flushed the worklist");
1197 this->Flags = this->Flags |
Flags;
1201 return reinterpret_cast<Mapper *
>(pImpl);
1206class FlushingMapper {
1210 explicit FlushingMapper(
void *pImpl) :
M(*
getAsMapper(pImpl)) {
1211 assert(!
M.hasWorkToDo() &&
"Expected to be flushed");
1214 ~FlushingMapper() {
M.flush(); }
1216 Mapper *operator->()
const {
return &
M; }
1225 : pImpl(new Mapper(VM, Flags, TypeMapper, Materializer, IdentityMD)) {}
1232 return getAsMapper(pImpl)->registerAlternateMappingContext(VM, Materializer);
1236 FlushingMapper(pImpl)->addFlags(Flags);
1240 return FlushingMapper(pImpl)->mapValue(&V);
1244 return cast_or_null<Constant>(
mapValue(
C));
1248 return FlushingMapper(pImpl)->mapMetadata(&MD);
1256 FlushingMapper(pImpl)->remapInstruction(&
I);
1260 FlushingMapper(pImpl)->remapDbgRecord(DR);
1271 FlushingMapper(pImpl)->remapFunction(
F);
1275 FlushingMapper(pImpl)->remapGlobalObjectMetadata(GO);
1290 GV, InitPrefix, IsOldCtorDtor, NewMembers, MCID);
1295 getAsMapper(pImpl)->scheduleMapAliasOrIFunc(GA, Aliasee, MCID);
1312 auto AtomGroup =
DL->getAtomGroup();
1319 AtomGroup = R->second;
1323 I->getContext(),
DL.getLine(),
DL.getCol(),
DL.getScope(),
1324 DL.getInlinedAt(),
DL.isImplicitCode(), AtomGroup,
DL->getAtomRank());
1325 I->setDebugLoc(New);
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
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file defines the SmallVector class.
static void remapOperands(VPBlockBase *Entry, VPBlockBase *NewEntry, DenseMap< VPValue *, VPValue * > &Old2NewVPValues)
static Mapper * getAsMapper(void *pImpl)
static ConstantAsMetadata * wrapConstantAsMetadata(const ConstantAsMetadata &CMD, Value *MappedV)
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & front() const
front - Get the first element.
size_t size() const
size - Get the array size.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
The address of a basic block.
Function * getFunction() const
BasicBlock * getBasicBlock() const
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)
A constant value that is initialized with an expression using other constant values.
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)
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.
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...
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.
This class represents an Operation in the Expression.
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....
iterator find(const_arg_type_t< KeyT > Val)
Implements a dense probed hash-table based set.
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.
Type * getValueType() const
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
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.
This is an important class for using LLVM in a threaded context.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
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.
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.
Tracking metadata reference owned by Metadata.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
A Module instance is used to store all the information related to an LLVM module.
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
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.
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
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.
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.
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.
This is a class that can be implemented by clients to remap types when cloning constants and instruct...
virtual Type * remapType(Type *SrcTy)=0
The client should implement this method if they want to remap types while mapping values.
DMAtomT AtomMap
Map {(InlinedAt, old atom number) -> new atom number}.
LLVM_ABI void remapDbgRecord(Module *M, DbgRecord &V)
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 scheduleMapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix, bool IsOldCtorDtor, ArrayRef< Constant * > NewMembers, unsigned MappingContextID=0)
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 addFlags(RemapFlags Flags)
Add to the current RemapFlags.
This is a class that can be implemented by clients to materialize Values on demand.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
std::pair< iterator, bool > insert(const ValueT &V)
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.
@ C
The default llvm calling convention, compatible with C.
@ CE
Windows NT (Windows on ARM)
NodeAddr< FuncNode * > Func
LLVM_ABI const_iterator end(StringRef path LLVM_LIFETIME_BOUND)
Get end iterator over path.
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.
RemapFlags
These are flags that the value mapping APIs allow.
@ RF_IgnoreMissingLocals
If this flag is set, the remapper ignores missing function-local entries (Argument,...
@ 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...
@ 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.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
std::function< bool(const Metadata *)> MetadataPredicate
DWARFExpression::Operation Op
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.
LLVM_ABI void RemapSourceAtom(Instruction *I, ValueToValueMapTy &VM)
Remap source location atom.