51 : DstStructTypesSet(DstStructTypesSet) {}
56 void addTypeMapping(
Type *DstTy,
Type *SrcTy);
63 return cast<FunctionType>(
get((
Type *)
T));
69 bool recursivelyAddMappingIfTypesAreIsomorphic(
Type *DstTy,
Type *SrcTy);
73void TypeMapTy::addTypeMapping(
Type *DstTy,
Type *SrcTy) {
74 recursivelyAddMappingIfTypesAreIsomorphic(DstTy, SrcTy);
80bool TypeMapTy::recursivelyAddMappingIfTypesAreIsomorphic(
Type *DstTy,
89 return Entry == DstTy;
101 if (
StructType *SSTy = dyn_cast<StructType>(SrcTy)) {
102 if (SSTy->isOpaque() || cast<StructType>(DstTy)->isOpaque())
111 if (isa<IntegerType>(DstTy))
113 if (
PointerType *PT = dyn_cast<PointerType>(DstTy)) {
114 if (PT->getAddressSpace() != cast<PointerType>(SrcTy)->getAddressSpace())
116 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(DstTy)) {
117 if (FT->isVarArg() != cast<FunctionType>(SrcTy)->isVarArg())
119 }
else if (
StructType *DSTy = dyn_cast<StructType>(DstTy)) {
121 if (DSTy->isLiteral() != SSTy->
isLiteral() ||
122 DSTy->isPacked() != SSTy->
isPacked())
124 }
else if (
auto *DArrTy = dyn_cast<ArrayType>(DstTy)) {
125 if (DArrTy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements())
127 }
else if (
auto *DVecTy = dyn_cast<VectorType>(DstTy)) {
128 if (DVecTy->getElementCount() != cast<VectorType>(SrcTy)->getElementCount())
139 [[maybe_unused]]
auto Res = MappedTypes.
insert({SrcTy, DstTy});
140 assert(!Res.second &&
"Recursive type?");
142 if (
auto *STy = dyn_cast<StructType>(SrcTy)) {
162 bool IsUniqued = !isa<StructType>(Ty) || cast<StructType>(Ty)->isLiteral();
166 for (
auto &Pair : MappedTypes) {
167 assert(!(Pair.first != Ty && Pair.second == Ty) &&
168 "mapping to a source type");
183 bool AnyChange =
false;
191 Entry = &MappedTypes[Ty];
192 assert(!*Entry &&
"Recursive type!");
196 if (!AnyChange && IsUniqued)
204 return *
Entry = ArrayType::get(ElementTypes[0],
208 return *
Entry = VectorType::get(ElementTypes[0],
209 cast<VectorType>(Ty)->getElementCount());
211 return *
Entry = FunctionType::get(ElementTypes[0],
213 cast<FunctionType>(Ty)->isVarArg());
215 auto *STy = cast<StructType>(Ty);
221 if (STy->isOpaque()) {
229 return *
Entry = OldT;
241 if (STy->hasName()) {
269 IRLinker &TheIRLinker;
272 GlobalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
277 IRLinker &TheIRLinker;
280 LocalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
291 std::unique_ptr<Module> SrcM;
297 GlobalValueMaterializer GValMaterializer;
298 LocalValueMaterializer LValMaterializer;
311 std::vector<GlobalValue *> Worklist;
312 std::vector<std::pair<GlobalValue *, Value*>> RAUWWorklist;
319 if (ValuesToLink.
insert(GV).second)
320 Worklist.push_back(GV);
328 bool IsPerformingImport;
333 bool DoneLinkingBodies =
false;
337 std::optional<Error> FoundError;
340 FoundError = std::move(
E);
345 unsigned IndirectSymbolMCID;
351 void emitWarning(
const Twine &Message) {
375 if (
auto *FDGV = dyn_cast<Function>(DGV))
376 if (FDGV->isIntrinsic())
377 if (
const auto *FSrcGV = dyn_cast<Function>(SrcGV))
378 if (FDGV->getFunctionType() != TypeMap.get(FSrcGV->getFunctionType()))
385 void computeTypeMapping();
397 bool ForIndirectSymbol);
399 Error linkModuleFlagsMetadata();
423 void flushRAUWWorklist();
428 void prepareCompileUnitsForImport();
429 void linkNamedMDNodes();
435 IRLinker(
Module &DstM, MDMapT &SharedMDs,
439 : DstM(DstM), SrcM(
std::
move(SrcM)), AddLazyFor(
std::
move(AddLazyFor)),
440 TypeMap(
Set), GValMaterializer(*this), LValMaterializer(*this),
441 SharedMDs(SharedMDs), IsPerformingImport(IsPerformingImport),
443 &TypeMap, &GValMaterializer),
444 IndirectSymbolMCID(Mapper.registerAlternateMappingContext(
445 IndirectSymbolValueMap, &LValMaterializer)) {
449 if (IsPerformingImport)
450 prepareCompileUnitsForImport();
455 Value *materialize(
Value *V,
bool ForIndirectSymbol);
473 ConflictGV->setName(
Name);
474 assert(ConflictGV->getName() !=
Name &&
"forceRenaming didn't work");
480Value *GlobalValueMaterializer::materialize(
Value *SGV) {
481 return TheIRLinker.materialize(SGV,
false);
484Value *LocalValueMaterializer::materialize(
Value *SGV) {
485 return TheIRLinker.materialize(SGV,
true);
488Value *IRLinker::materialize(
Value *V,
bool ForIndirectSymbol) {
489 auto *SGV = dyn_cast<GlobalValue>(V);
494 if (SGV->getParent() == &DstM)
501 if (SGV->getParent() != SrcM.get())
517 if (
auto *
F = dyn_cast<Function>(New)) {
518 if (!
F->isDeclaration())
520 }
else if (
auto *V = dyn_cast<GlobalVariable>(New)) {
521 if (
V->hasInitializer() ||
V->hasAppendingLinkage())
523 }
else if (
auto *GA = dyn_cast<GlobalAlias>(New)) {
524 if (GA->getAliasee())
526 }
else if (
auto *GI = dyn_cast<GlobalIFunc>(New)) {
527 if (GI->getResolver())
542 (!ForIndirectSymbol && IndirectSymbolValueMap.
lookup(SGV) == New))
545 if (ForIndirectSymbol || shouldLink(New, *SGV))
546 setError(linkGlobalValueBody(*New, *SGV));
548 updateAttributes(*New);
570 for (
unsigned i = 0; i <
Attrs.getNumAttrSets(); ++i) {
571 for (
int AttrIdx = Attribute::FirstTypeAttr;
572 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
574 if (
Attrs.hasAttributeAtIndex(i, TypedAttr)) {
576 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
577 Attrs =
Attrs.replaceAttributeTypeAtIndex(
C, i, TypedAttr,
595 F->copyAttributesFrom(SF);
596 F->setAttributes(mapAttributeTypes(
F->getContext(),
F->getAttributes()));
607 if (
auto *GA = dyn_cast<GlobalAlias>(SGV)) {
611 DGA->copyAttributesFrom(GA);
615 if (
auto *GI = dyn_cast<GlobalIFunc>(SGV)) {
618 SGV->
getName(),
nullptr, &DstM);
619 DGI->copyAttributesFrom(GI);
627 bool ForDefinition) {
629 if (
auto *SGVar = dyn_cast<GlobalVariable>(SGV)) {
630 NewGV = copyGlobalVariableProto(SGVar);
631 }
else if (
auto *SF = dyn_cast<Function>(SGV)) {
632 NewGV = copyFunctionProto(SF);
635 NewGV = copyIndirectSymbolProto(SGV);
655 if (
auto *NewGO = dyn_cast<GlobalObject>(NewGV)) {
658 NewGO->copyMetadata(cast<GlobalObject>(SGV), 0);
660 UnmappedMetadata.
insert(NewGO);
667 if (
auto *NewF = dyn_cast<Function>(NewGV)) {
668 NewF->setPersonalityFn(
nullptr);
669 NewF->setPrefixData(
nullptr);
670 NewF->setPrologueData(
nullptr);
677 size_t DotPos =
Name.rfind(
'.');
679 !isdigit(
static_cast<unsigned char>(
Name[DotPos + 1])))
681 :
Name.substr(0, DotPos);
688void IRLinker::computeTypeMapping() {
702 TypeMap.addTypeMapping(DAT->getElementType(),
SAT->getElementType());
727 std::vector<StructType *>
Types = SrcM->getIdentifiedStructTypes();
732 if (TypeMap.DstStructTypesSet.hasType(ST)) {
741 if (STTypePrefix.size() ==
ST->getName().size())
766 if (TypeMap.DstStructTypesSet.hasType(DST))
767 TypeMap.addTypeMapping(DST, ST);
773 unsigned NumElements = cast<ArrayType>(
C->getType())->getNumElements();
775 for (
unsigned i = 0; i != NumElements; ++i)
787 "Linking globals named '" + SrcGV->
getName() +
788 "': can only link appending global with another appending "
792 return stringErr(
"Appending variables linked with different const'ness!");
796 "Appending variables with different alignment need to be linked!");
800 "Appending variables with different visibility need to be linked!");
804 "Appending variables with different unnamed_addr need to be linked!");
808 "Appending variables with different section name need to be linked!");
811 return stringErr(
"Appending variables with different address spaces need "
827 bool IsNewStructor =
false;
828 bool IsOldStructor =
false;
829 if (
Name ==
"llvm.global_ctors" ||
Name ==
"llvm.global_dtors") {
831 IsNewStructor =
true;
833 IsOldStructor =
true;
838 auto &
ST = *cast<StructType>(EltTy);
839 Type *Tys[3] = {
ST.getElementType(0),
ST.getElementType(1), VoidPtrTy};
846 DstNumElements = DstTy->getNumElements();
849 if (EltTy != DstTy->getElementType())
850 return stringErr(
"Appending variables with different element types!");
863 return !shouldLink(DGV, *Key);
881 IsOldStructor, SrcElements);
886 RAUWWorklist.push_back(std::make_pair(DstGV, NG));
904 bool LazilyAdded =
false;
906 AddLazyFor(SGV, [
this, &LazilyAdded](
GlobalValue &GV) {
914 bool ForIndirectSymbol) {
917 bool ShouldLink = shouldLink(DGV, *SGV);
923 return cast<Constant>(
I->second);
925 I = IndirectSymbolValueMap.
find(SGV);
926 if (
I != IndirectSymbolValueMap.
end())
927 return cast<Constant>(
I->second);
930 if (!ShouldLink && ForIndirectSymbol)
935 return linkAppendingVarProto(cast_or_null<GlobalVariable>(DGV),
936 cast<GlobalVariable>(SGV));
938 bool NeedsRenaming =
false;
940 if (DGV && !ShouldLink) {
946 if (DoneLinkingBodies)
949 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
950 if (ShouldLink || !ForIndirectSymbol)
951 NeedsRenaming =
true;
957 if (
Function *
F = dyn_cast<Function>(NewGV))
962 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
965 NeedsRenaming =
false;
971 if (ShouldLink || ForIndirectSymbol) {
973 if (
auto *GO = dyn_cast<GlobalObject>(NewGV)) {
981 if (!ShouldLink && ForIndirectSymbol)
990 if (DGV && NewGV != SGV) {
992 NewGV, TypeMap.get(SGV->
getType()));
995 if (DGV && NewGV != DGV) {
999 RAUWWorklist.push_back(std::make_pair(
1018 assert(Dst.isDeclaration() && !Src.isDeclaration());
1021 if (
Error Err = Src.materialize())
1025 if (Src.hasPrefixData())
1026 Dst.setPrefixData(Src.getPrefixData());
1027 if (Src.hasPrologueData())
1028 Dst.setPrologueData(Src.getPrologueData());
1029 if (Src.hasPersonalityFn())
1030 Dst.setPersonalityFn(Src.getPersonalityFn());
1033 Dst.copyMetadata(&Src, 0);
1036 Dst.stealArgumentListFrom(Src);
1037 Dst.splice(Dst.end(), &Src);
1053 if (
auto *
F = dyn_cast<Function>(&Src))
1054 return linkFunctionBody(cast<Function>(Dst), *
F);
1055 if (
auto *GVar = dyn_cast<GlobalVariable>(&Src)) {
1056 linkGlobalVariable(cast<GlobalVariable>(Dst), *GVar);
1059 if (
auto *GA = dyn_cast<GlobalAlias>(&Src)) {
1060 linkAliasAliasee(cast<GlobalAlias>(Dst), *GA);
1063 linkIFuncResolver(cast<GlobalIFunc>(Dst), cast<GlobalIFunc>(Src));
1067void IRLinker::flushRAUWWorklist() {
1068 for (
const auto &Elem : RAUWWorklist) {
1071 std::tie(Old, New) = Elem;
1076 RAUWWorklist.clear();
1079void IRLinker::prepareCompileUnitsForImport() {
1080 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1081 if (!SrcCompileUnits)
1087 auto *
CU = cast<DICompileUnit>(
N);
1088 assert(
CU &&
"Expected valid compile unit");
1092 CU->replaceEnumTypes(
nullptr);
1093 CU->replaceMacros(
nullptr);
1094 CU->replaceRetainedTypes(
nullptr);
1105 CU->replaceGlobalVariables(
nullptr);
1107 CU->replaceImportedEntities(
nullptr);
1112void IRLinker::linkNamedMDNodes() {
1113 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1114 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1116 if (&NMD == SrcModFlags)
1122 emitWarning(
"Pseudo-probe ignored: source module '" +
1123 SrcM->getModuleIdentifier() +
1124 "' is compiled with -fpseudo-probe-for-profiling while "
1125 "destination module '" +
1131 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1136 for (
const MDNode *
Op : NMD.operands()) {
1145Error IRLinker::linkModuleFlagsMetadata() {
1147 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1173 mdconst::extract<ConstantInt>(
Op->getOperand(0))->getZExtValue();
1177 Requirements.
insert(cast<MDNode>(
Op->getOperand(2)));
1190 mdconst::extract<ConstantInt>(
SrcOp->getOperand(0));
1195 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1202 if (Requirements.
insert(cast<MDNode>(
SrcOp->getOperand(2)))) {
1221 mdconst::extract<ConstantInt>(
DstOp->getOperand(0));
1222 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1224 auto overrideDstValue = [&]() {
1233 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1234 return stringErr(
"linking module flags '" +
ID->getString() +
1235 "': IDs have conflicting override values in '" +
1236 SrcM->getModuleIdentifier() +
"' and '" +
1246 if (SrcBehaviorValue != DstBehaviorValue) {
1247 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1251 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1255 if (!(MaxAndWarn || MinAndWarn))
1256 return stringErr(
"linking module flags '" +
ID->getString() +
1257 "': IDs have conflicting behaviors in '" +
1258 SrcM->getModuleIdentifier() +
"' and '" +
1262 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1263 assert(isa<MDTuple>(DstValue) &&
1264 "Expected MDTuple when appending module flags");
1265 if (DstValue->isDistinct())
1266 return dyn_cast<MDTuple>(DstValue);
1281 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1284 <<
"linking module flags '" <<
ID->getString()
1285 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1286 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1295 mdconst::extract<ConstantInt>(
DstOp->getOperand(2));
1297 mdconst::extract<ConstantInt>(
SrcOp->getOperand(2));
1314 mdconst::extract<ConstantInt>(
DstOp->getOperand(2));
1316 mdconst::extract<ConstantInt>(
SrcOp->getOperand(2));
1331 switch (SrcBehaviorValue) {
1337 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1340 <<
"linking module flags '" <<
ID->getString()
1341 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1342 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1355 MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(
DstOp->getOperand(2)));
1356 MDNode *SrcValue = cast<MDNode>(
SrcOp->getOperand(2));
1357 for (
const auto &O : SrcValue->
operands())
1363 MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(
DstOp->getOperand(2)));
1364 MDNode *SrcValue = cast<MDNode>(
SrcOp->getOperand(2));
1377 for (
auto Idx : Mins) {
1381 ConstantInt *
V = mdconst::extract<ConstantInt>(
Op->getOperand(2));
1383 Op->getOperand(0),
ID,
1390 for (
MDNode *Requirement : Requirements) {
1391 MDString *
Flag = cast<MDString>(Requirement->getOperand(0));
1392 Metadata *ReqValue = Requirement->getOperand(1);
1395 if (!
Op ||
Op->getOperand(2) != ReqValue)
1396 return stringErr(
"linking module flags '" +
Flag->getString() +
1397 "': does not have the required value");
1408 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1410 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1429 if (
auto *
F = dyn_cast<Function>(&GV)) {
1430 if (!
F->isIntrinsic())
1431 F->removeFnAttr(llvm::Attribute::NoCallback);
1436 if (
CallBase *CI = dyn_cast<CallBase>(&
I))
1437 CI->removeFnAttr(Attribute::NoCallback);
1441Error IRLinker::run() {
1443 if (SrcM->getMaterializer())
1444 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1463 bool EnableDLWarning =
true;
1464 bool EnableTripleWarning =
true;
1465 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1466 bool SrcHasLibDeviceDL =
1467 (SrcM->getDataLayoutStr().empty() ||
1468 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1472 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1473 SrcTriple.getOSName() ==
"gpulibs") ||
1474 (SrcTriple.getVendorName() ==
"unknown" &&
1475 SrcTriple.getOSName() ==
"unknown");
1476 EnableTripleWarning = !SrcHasLibDeviceTriple;
1477 EnableDLWarning = !(SrcHasLibDeviceTriple && SrcHasLibDeviceDL);
1480 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1481 emitWarning(
"Linking two modules of different data layouts: '" +
1482 SrcM->getModuleIdentifier() +
"' is '" +
1483 SrcM->getDataLayoutStr() +
"' whereas '" +
1488 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1489 !SrcTriple.isCompatibleWith(DstTriple))
1490 emitWarning(
"Linking two modules of different target triples: '" +
1491 SrcM->getModuleIdentifier() +
"' is '" +
1492 SrcM->getTargetTriple().str() +
"' whereas '" +
1499 computeTypeMapping();
1501 std::reverse(Worklist.begin(), Worklist.end());
1502 while (!Worklist.empty()) {
1504 Worklist.pop_back();
1508 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1514 return std::move(*FoundError);
1515 flushRAUWWorklist();
1520 DoneLinkingBodies =
true;
1531 if (NGO->isDeclaration())
1535 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1539 }
else if (IsPerformingImport) {
1544 SmallString<256> S(
".symver ");
1548 DstM.appendModuleInlineAsm(S);
1560 return std::move(*FoundError);
1571 return linkModuleFlagsMetadata();
1575 : ETypes(E), IsPacked(
P) {}
1578 : ETypes(ST->elements()), IsPacked(ST->isPacked()) {}
1588StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1592StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1596unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &Key) {
1600unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1601 return getHashValue(KeyTy(ST));
1604bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &LHS,
1606 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
1608 return LHS == KeyTy(RHS);
1611bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *LHS,
1613 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
1615 return KeyTy(LHS) == KeyTy(RHS);
1620 NonOpaqueStructTypes.insert(Ty);
1625 NonOpaqueStructTypes.insert(Ty);
1626 bool Removed = OpaqueStructTypes.erase(Ty);
1633 OpaqueStructTypes.insert(Ty);
1640 auto I = NonOpaqueStructTypes.find_as(Key);
1641 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1646 return OpaqueStructTypes.count(Ty);
1647 auto I = NonOpaqueStructTypes.find(Ty);
1648 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1653 StructTypes.
run(M,
false);
1664 SharedMDs[MD].reset(
const_cast<MDNode *
>(MD));
1671 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1672 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1673 IsPerformingImport);
1674 return TheIRLinker.run();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static void forceRenaming(GlobalValue *GV, StringRef Name)
The LLVM SymbolTable class autorenames globals that conflict in the symbol table.
static void getArrayElements(const Constant *C, SmallVectorImpl< Constant * > &Dest)
static std::string adjustInlineAsm(const std::string &InlineAsm, const Triple &Triple)
Return InlineAsm adjusted with target-specific directives if required.
static StringRef getTypeNamePrefix(StringRef Name)
static Error stringErr(const Twine &T)
Most of the errors produced by this module are inconvertible StringErrors.
Module.h This file contains the declarations for the Module class.
static unsigned getNumElements(Type *Ty)
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallString class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
LLVM Basic Block Representation.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setSelectionKind(SelectionKind Val)
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
This is an important base class in LLVM.
const Constant * stripPointerCasts() const
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
This class represents an Operation in the Expression.
bool isDefault() const
Test if the DataLayout was constructed from an empty string.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
This is the base abstract class for diagnostic reporting in the backend.
Interface for custom diagnostic printing.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
FunctionType * getFunctionType() const
Returns the FunctionType for me.
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
StringRef getSection() const
Get the custom section of this global if it has one.
VisibilityTypes getVisibility() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
LLVM_ABI const Comdat * getComdat() const
bool hasExternalWeakLinkage() const
ThreadLocalMode getThreadLocalMode() const
void setLinkage(LinkageTypes LT)
bool isDeclarationForLinker() const
unsigned getAddressSpace() const
Module * getParent()
Get the module that this global value is contained inside of...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
PointerType * getType() const
Global values are always pointers.
bool hasGlobalUnnamedAddr() const
bool hasAppendingLinkage() const
LLVM_ABI void removeFromParent()
This method unlinks 'this' from the containing module, but does not delete it.
@ InternalLinkage
Rename collisions when linking (static functions).
@ ExternalLinkage
Externally visible function.
@ ExternalWeakLinkage
ExternalWeak linkage description.
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
LLVM_ABI void copyAttributesFrom(const GlobalVariable *Src)
copyAttributesFrom - copy all additional attributes (those not needed to create a GlobalVariable) fro...
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addNonOpaque(StructType *Ty)
LLVM_ABI bool hasType(StructType *Ty)
LLVM_ABI void switchToNonOpaque(StructType *Ty)
LLVM_ABI void addOpaque(StructType *Ty)
LLVM_ABI StructType * findNonOpaque(ArrayRef< Type * > ETypes, bool IsPacked)
LLVM_ABI IRMover(Module &M)
LLVM_ABI Error move(std::unique_ptr< Module > Src, ArrayRef< GlobalValue * > ValuesToLink, LazyCallback AddLazyFor, bool IsPerformingImport)
Move in the provide values in ValuesToLink from Src.
This is an important class for using LLVM in a threaded context.
LinkDiagnosticInfo(DiagnosticSeverity Severity, const Twine &Msg LLVM_LIFETIME_BOUND)
void print(DiagnosticPrinter &DP) const override
Print using the given DP a user-friendly message.
ArrayRef< MDOperand > operands() const
op_iterator op_end() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
op_iterator op_begin() const
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
void push_back(Metadata *MD)
Append an element to the tuple. This will resize the node.
static LLVM_ABI void CollectAsmSymvers(const Module &M, function_ref< void(StringRef, StringRef)> AsmSymver)
Parse inline ASM and collect the symvers directives that are defined in the current module.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
@ AppendUnique
Appends the two values, which are required to be metadata nodes.
@ Override
Uses the specified value, regardless of the behavior or value of the other module.
@ Warning
Emits a warning if two values disagree.
@ Error
Emits an error if two values disagree, otherwise the resulting value is that of the operands.
@ Min
Takes the min of the two values, which are required to be integers.
@ Append
Appends the two values, which are required to be metadata nodes.
@ Max
Takes the max of the two values, which are required to be integers.
@ Require
Adds a requirement that another module flag be present and have a specified value after linking is pe...
LLVMContext & getContext() const
Get the global data context.
void setTargetTriple(Triple T)
Set the target triple.
NamedMDNode * getOrInsertModuleFlagsMetadata()
Returns the NamedMDNode in the module that represents module-level flags.
const std::string & getModuleIdentifier() const
Get the module identifier which is, essentially, the name of the module.
void setDataLayout(StringRef Desc)
Set the data layout.
void insertGlobalVariable(GlobalVariable *GV)
Insert global variable GV at the end of the global variable list and take ownership.
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
const std::string & getDataLayoutStr() const
Get the data layout string for the module's target platform.
void appendModuleInlineAsm(StringRef Asm)
Append to the module-scope inline assembly blocks.
LLVM_ABI void setOperand(unsigned I, MDNode *New)
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
iterator_range< op_iterator > operands()
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
size_type size() const
Determine the number of elements in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
Class to represent struct types.
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.
static LLVM_ABI StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
LLVM_ABI void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition.
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
Triple - Helper class for working with autoconf configuration names.
ArchType getArch() const
Get the parsed architecture type of this triple.
const std::string & str() const
bool empty() const
Whether the triple is empty / default constructed.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
TypeFinder - Walk over a module, identifying all of the types that are used by the module.
DenseSet< const MDNode * > & getVisitedMetadata()
void run(const Module &M, bool onlyNamed)
The instances of the Type class are immutable: once they are created, they are never changed.
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FixedVectorTyID
Fixed width SIMD vector type.
unsigned getNumContainedTypes() const
Return the number of types in the derived type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isFunctionTy() const
True if this is an instance of FunctionType.
TypeID getTypeID() const
Return the type id for the type.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
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.
ValueT lookup(const KeyT &Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
std::optional< MDMapT > & getMDMap()
iterator find(const KeyT &Val)
Context for (re-)mapping values (and metadata).
LLVM_ABI MDNode * mapMDNode(const MDNode &N)
LLVM_ABI void scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init, unsigned MappingContextID=0)
LLVM_ABI void scheduleRemapFunction(Function &F, unsigned MappingContextID=0)
LLVM_ABI void scheduleMapGlobalIFunc(GlobalIFunc &GI, Constant &Resolver, unsigned MappingContextID=0)
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.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
bool erase(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
A raw_ostream that writes to an std::string.
unique_function is a type-erasing functor similar to std::function.
#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.
@ C
The default llvm calling convention, compatible with C.
LLVM_ABI std::optional< Function * > remangleIntrinsicFunction(Function *F)
Flag
These should be considered private to the implementation of the MCInstrDesc class.
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
@ 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_ReuseAndMutateDistinctMDs
Instruct the remapper to reuse and mutate distinct metadata (remapping them in place) instead of clon...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
DiagnosticSeverity
Defines the different supported severity of a diagnostic.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
constexpr const char * PseudoProbeDescMetadataName
Implement std::hash so that hash_code can be used in STL containers.
An information struct used to provide DenseMap with the various necessary components for a given valu...
LLVM_ABI KeyTy(ArrayRef< Type * > E, bool P)
LLVM_ABI bool operator==(const KeyTy &that) const
ArrayRef< Type * > ETypes
LLVM_ABI bool operator!=(const KeyTy &that) const