69 : DstStructTypesSet(DstStructTypesSet) {}
74 void addTypeMapping(
Type *DstTy,
Type *SrcTy);
78 Error linkDefinedTypeBodies();
86 return cast<FunctionType>(
get((
Type *)
T));
92 bool areTypesIsomorphic(
Type *DstTy,
Type *SrcTy);
96void TypeMapTy::addTypeMapping(
Type *DstTy,
Type *SrcTy) {
102 if (!areTypesIsomorphic(DstTy, SrcTy)) {
105 for (
Type *Ty : SpeculativeTypes)
106 MappedTypes.
erase(Ty);
108 SrcDefinitionsToResolve.
resize(SrcDefinitionsToResolve.
size() -
109 SpeculativeDstOpaqueTypes.
size());
110 for (
StructType *Ty : SpeculativeDstOpaqueTypes)
111 DstResolvedOpaqueTypes.
erase(Ty);
119 for (
Type *Ty : SpeculativeTypes)
120 if (
auto *STy = dyn_cast<StructType>(Ty))
124 SpeculativeTypes.clear();
125 SpeculativeDstOpaqueTypes.clear();
130bool TypeMapTy::areTypesIsomorphic(
Type *DstTy,
Type *SrcTy) {
138 return Entry == DstTy;
142 if (DstTy == SrcTy) {
150 if (
StructType *SSTy = dyn_cast<StructType>(SrcTy)) {
152 if (SSTy->isOpaque()) {
154 SpeculativeTypes.push_back(SrcTy);
162 if (cast<StructType>(DstTy)->isOpaque()) {
164 if (!DstResolvedOpaqueTypes.
insert(cast<StructType>(DstTy)).second)
167 SpeculativeTypes.push_back(SrcTy);
168 SpeculativeDstOpaqueTypes.push_back(cast<StructType>(DstTy));
179 if (isa<IntegerType>(DstTy))
181 if (
PointerType *PT = dyn_cast<PointerType>(DstTy)) {
182 if (PT->getAddressSpace() != cast<PointerType>(SrcTy)->getAddressSpace())
184 }
else if (
FunctionType *FT = dyn_cast<FunctionType>(DstTy)) {
185 if (FT->isVarArg() != cast<FunctionType>(SrcTy)->isVarArg())
187 }
else if (
StructType *DSTy = dyn_cast<StructType>(DstTy)) {
189 if (DSTy->isLiteral() != SSTy->
isLiteral() ||
190 DSTy->isPacked() != SSTy->
isPacked())
192 }
else if (
auto *DArrTy = dyn_cast<ArrayType>(DstTy)) {
193 if (DArrTy->getNumElements() != cast<ArrayType>(SrcTy)->getNumElements())
195 }
else if (
auto *DVecTy = dyn_cast<VectorType>(DstTy)) {
196 if (DVecTy->getElementCount() != cast<VectorType>(SrcTy)->getElementCount())
203 SpeculativeTypes.push_back(SrcTy);
214Error TypeMapTy::linkDefinedTypeBodies() {
216 for (
StructType *SrcSTy : SrcDefinitionsToResolve) {
217 StructType *DstSTy = cast<StructType>(MappedTypes[SrcSTy]);
221 Elements.resize(SrcSTy->getNumElements());
222 for (
unsigned I = 0, E =
Elements.size();
I != E; ++
I)
225 if (
auto E = DstSTy->
setBodyOrError(Elements, SrcSTy->isPacked()))
229 SrcDefinitionsToResolve.clear();
230 DstResolvedOpaqueTypes.
clear();
236 return get(Ty, Visited);
246 bool IsUniqued = !isa<StructType>(Ty) || cast<StructType>(Ty)->isLiteral();
250 for (
auto &Pair : MappedTypes) {
251 assert(!(Pair.first != Ty && Pair.second == Ty) &&
252 "mapping to a source type");
256 if (!Visited.
insert(cast<StructType>(Ty)).second) {
272 bool AnyChange =
false;
280 Entry = &MappedTypes[Ty];
281 assert(!*Entry &&
"Recursive type!");
285 if (!AnyChange && IsUniqued)
293 return *
Entry = ArrayType::get(ElementTypes[0],
297 return *
Entry = VectorType::get(ElementTypes[0],
298 cast<VectorType>(Ty)->getElementCount());
300 return *
Entry = PointerType::get(ElementTypes[0],
303 return *
Entry = FunctionType::get(ElementTypes[0],
305 cast<FunctionType>(Ty)->isVarArg());
307 auto *STy = cast<StructType>(Ty);
313 if (STy->isOpaque()) {
321 return *
Entry = OldT;
333 if (STy->hasName()) {
361 IRLinker &TheIRLinker;
364 GlobalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
369 IRLinker &TheIRLinker;
372 LocalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
383 std::unique_ptr<Module> SrcM;
389 GlobalValueMaterializer GValMaterializer;
390 LocalValueMaterializer LValMaterializer;
403 std::vector<GlobalValue *> Worklist;
404 std::vector<std::pair<GlobalValue *, Value*>> RAUWWorklist;
411 if (ValuesToLink.
insert(GV).second)
412 Worklist.push_back(GV);
420 bool IsPerformingImport;
425 bool DoneLinkingBodies =
false;
429 std::optional<Error> FoundError;
432 FoundError = std::move(
E);
437 unsigned IndirectSymbolMCID;
443 void emitWarning(
const Twine &Message) {
467 if (
auto *FDGV = dyn_cast<Function>(DGV))
468 if (FDGV->isIntrinsic())
469 if (
const auto *FSrcGV = dyn_cast<Function>(SrcGV))
470 if (FDGV->getFunctionType() != TypeMap.get(FSrcGV->getFunctionType()))
477 void computeTypeMapping();
489 bool ForIndirectSymbol);
491 Error linkModuleFlagsMetadata();
515 void flushRAUWWorklist();
520 void prepareCompileUnitsForImport();
521 void linkNamedMDNodes();
527 IRLinker(
Module &DstM, MDMapT &SharedMDs,
531 : DstM(DstM), SrcM(
std::
move(SrcM)), AddLazyFor(
std::
move(AddLazyFor)),
532 TypeMap(
Set), GValMaterializer(*this), LValMaterializer(*this),
533 SharedMDs(SharedMDs), IsPerformingImport(IsPerformingImport),
535 &TypeMap, &GValMaterializer),
536 IndirectSymbolMCID(Mapper.registerAlternateMappingContext(
537 IndirectSymbolValueMap, &LValMaterializer)) {
541 if (IsPerformingImport)
542 prepareCompileUnitsForImport();
547 Value *materialize(
Value *V,
bool ForIndirectSymbol);
565 ConflictGV->setName(
Name);
566 assert(ConflictGV->getName() !=
Name &&
"forceRenaming didn't work");
572Value *GlobalValueMaterializer::materialize(
Value *SGV) {
573 return TheIRLinker.materialize(SGV,
false);
576Value *LocalValueMaterializer::materialize(
Value *SGV) {
577 return TheIRLinker.materialize(SGV,
true);
580Value *IRLinker::materialize(
Value *V,
bool ForIndirectSymbol) {
581 auto *SGV = dyn_cast<GlobalValue>(V);
586 if (SGV->getParent() == &DstM)
593 if (SGV->getParent() != SrcM.get())
609 if (
auto *
F = dyn_cast<Function>(New)) {
610 if (!
F->isDeclaration())
612 }
else if (
auto *V = dyn_cast<GlobalVariable>(New)) {
613 if (
V->hasInitializer() ||
V->hasAppendingLinkage())
615 }
else if (
auto *GA = dyn_cast<GlobalAlias>(New)) {
616 if (GA->getAliasee())
618 }
else if (
auto *GI = dyn_cast<GlobalIFunc>(New)) {
619 if (GI->getResolver())
634 (!ForIndirectSymbol && IndirectSymbolValueMap.
lookup(SGV) == New))
637 if (ForIndirectSymbol || shouldLink(New, *SGV))
638 setError(linkGlobalValueBody(*New, *SGV));
640 updateAttributes(*New);
662 for (
unsigned i = 0; i <
Attrs.getNumAttrSets(); ++i) {
663 for (
int AttrIdx = Attribute::FirstTypeAttr;
664 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
666 if (
Attrs.hasAttributeAtIndex(i, TypedAttr)) {
668 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
669 Attrs =
Attrs.replaceAttributeTypeAtIndex(
C, i, TypedAttr,
687 F->copyAttributesFrom(SF);
688 F->setAttributes(mapAttributeTypes(
F->getContext(),
F->getAttributes()));
700 if (
auto *GA = dyn_cast<GlobalAlias>(SGV)) {
704 DGA->copyAttributesFrom(GA);
708 if (
auto *GI = dyn_cast<GlobalIFunc>(SGV)) {
711 SGV->
getName(),
nullptr, &DstM);
712 DGI->copyAttributesFrom(GI);
720 bool ForDefinition) {
722 if (
auto *SGVar = dyn_cast<GlobalVariable>(SGV)) {
723 NewGV = copyGlobalVariableProto(SGVar);
724 }
else if (
auto *SF = dyn_cast<Function>(SGV)) {
725 NewGV = copyFunctionProto(SF);
728 NewGV = copyIndirectSymbolProto(SGV);
748 if (
auto *NewGO = dyn_cast<GlobalObject>(NewGV)) {
751 NewGO->copyMetadata(cast<GlobalObject>(SGV), 0);
753 UnmappedMetadata.
insert(NewGO);
760 if (
auto *NewF = dyn_cast<Function>(NewGV)) {
761 NewF->setPersonalityFn(
nullptr);
762 NewF->setPrefixData(
nullptr);
763 NewF->setPrologueData(
nullptr);
770 size_t DotPos =
Name.rfind(
'.');
772 !isdigit(
static_cast<unsigned char>(
Name[DotPos + 1])))
774 :
Name.substr(0, DotPos);
781void IRLinker::computeTypeMapping() {
795 TypeMap.addTypeMapping(DAT->getElementType(),
SAT->getElementType());
820 std::vector<StructType *>
Types = SrcM->getIdentifiedStructTypes();
825 if (TypeMap.DstStructTypesSet.hasType(ST)) {
834 if (STTypePrefix.size() ==
ST->getName().size())
859 if (TypeMap.DstStructTypesSet.hasType(DST))
860 TypeMap.addTypeMapping(DST, ST);
865 setError(TypeMap.linkDefinedTypeBodies());
870 unsigned NumElements = cast<ArrayType>(
C->getType())->getNumElements();
872 for (
unsigned i = 0; i != NumElements; ++i)
884 "Linking globals named '" + SrcGV->
getName() +
885 "': can only link appending global with another appending "
889 return stringErr(
"Appending variables linked with different const'ness!");
893 "Appending variables with different alignment need to be linked!");
897 "Appending variables with different visibility need to be linked!");
901 "Appending variables with different unnamed_addr need to be linked!");
905 "Appending variables with different section name need to be linked!");
908 return stringErr(
"Appending variables with different address spaces need "
924 bool IsNewStructor =
false;
925 bool IsOldStructor =
false;
926 if (
Name ==
"llvm.global_ctors" ||
Name ==
"llvm.global_dtors") {
928 IsNewStructor =
true;
930 IsOldStructor =
true;
935 auto &
ST = *cast<StructType>(EltTy);
936 Type *
Tys[3] = {
ST.getElementType(0),
ST.getElementType(1), VoidPtrTy};
943 DstNumElements = DstTy->getNumElements();
946 if (EltTy != DstTy->getElementType())
947 return stringErr(
"Appending variables with different element types!");
960 return !shouldLink(DGV, *Key);
980 IsOldStructor, SrcElements);
985 RAUWWorklist.push_back(std::make_pair(DstGV, NG));
1003 bool LazilyAdded =
false;
1005 AddLazyFor(SGV, [
this, &LazilyAdded](
GlobalValue &GV) {
1013 bool ForIndirectSymbol) {
1016 bool ShouldLink = shouldLink(DGV, *SGV);
1022 return cast<Constant>(
I->second);
1024 I = IndirectSymbolValueMap.
find(SGV);
1025 if (
I != IndirectSymbolValueMap.
end())
1026 return cast<Constant>(
I->second);
1029 if (!ShouldLink && ForIndirectSymbol)
1034 return linkAppendingVarProto(cast_or_null<GlobalVariable>(DGV),
1035 cast<GlobalVariable>(SGV));
1037 bool NeedsRenaming =
false;
1039 if (DGV && !ShouldLink) {
1045 if (DoneLinkingBodies)
1048 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
1049 if (ShouldLink || !ForIndirectSymbol)
1050 NeedsRenaming =
true;
1056 if (
Function *
F = dyn_cast<Function>(NewGV))
1061 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
1064 NeedsRenaming =
false;
1070 if (ShouldLink || ForIndirectSymbol) {
1072 if (
auto *GO = dyn_cast<GlobalObject>(NewGV)) {
1080 if (!ShouldLink && ForIndirectSymbol)
1089 if (DGV && NewGV != SGV) {
1091 NewGV, TypeMap.get(SGV->
getType()));
1094 if (DGV && NewGV != DGV) {
1098 RAUWWorklist.push_back(std::make_pair(
1117 assert(Dst.isDeclaration() && !Src.isDeclaration());
1120 if (
Error Err = Src.materialize())
1124 if (Src.hasPrefixData())
1125 Dst.setPrefixData(Src.getPrefixData());
1126 if (Src.hasPrologueData())
1127 Dst.setPrologueData(Src.getPrologueData());
1128 if (Src.hasPersonalityFn())
1129 Dst.setPersonalityFn(Src.getPersonalityFn());
1130 assert(Src.IsNewDbgInfoFormat == Dst.IsNewDbgInfoFormat);
1133 Dst.copyMetadata(&Src, 0);
1136 Dst.stealArgumentListFrom(Src);
1137 Dst.splice(Dst.end(), &Src);
1153 if (
auto *
F = dyn_cast<Function>(&Src))
1154 return linkFunctionBody(cast<Function>(Dst), *
F);
1155 if (
auto *GVar = dyn_cast<GlobalVariable>(&Src)) {
1156 linkGlobalVariable(cast<GlobalVariable>(Dst), *GVar);
1159 if (
auto *GA = dyn_cast<GlobalAlias>(&Src)) {
1160 linkAliasAliasee(cast<GlobalAlias>(Dst), *GA);
1163 linkIFuncResolver(cast<GlobalIFunc>(Dst), cast<GlobalIFunc>(Src));
1167void IRLinker::flushRAUWWorklist() {
1168 for (
const auto &Elem : RAUWWorklist) {
1171 std::tie(Old, New) = Elem;
1176 RAUWWorklist.clear();
1179void IRLinker::prepareCompileUnitsForImport() {
1180 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1181 if (!SrcCompileUnits)
1187 auto *
CU = cast<DICompileUnit>(
N);
1188 assert(
CU &&
"Expected valid compile unit");
1192 CU->replaceEnumTypes(
nullptr);
1193 CU->replaceMacros(
nullptr);
1194 CU->replaceRetainedTypes(
nullptr);
1205 CU->replaceGlobalVariables(
nullptr);
1207 CU->replaceImportedEntities(
nullptr);
1212void IRLinker::linkNamedMDNodes() {
1213 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1214 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1216 if (&NMD == SrcModFlags)
1222 emitWarning(
"Pseudo-probe ignored: source module '" +
1223 SrcM->getModuleIdentifier() +
1224 "' is compiled with -fpseudo-probe-for-profiling while "
1225 "destination module '" +
1231 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1236 for (
const MDNode *
Op : NMD.operands())
1242Error IRLinker::linkModuleFlagsMetadata() {
1244 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1269 mdconst::extract<ConstantInt>(
Op->getOperand(0))->getZExtValue();
1273 Requirements.
insert(cast<MDNode>(
Op->getOperand(2)));
1286 mdconst::extract<ConstantInt>(
SrcOp->getOperand(0));
1291 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1298 if (Requirements.
insert(cast<MDNode>(
SrcOp->getOperand(2)))) {
1317 mdconst::extract<ConstantInt>(
DstOp->getOperand(0));
1318 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1320 auto overrideDstValue = [&]() {
1329 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1330 return stringErr(
"linking module flags '" +
ID->getString() +
1331 "': IDs have conflicting override values in '" +
1332 SrcM->getModuleIdentifier() +
"' and '" +
1342 if (SrcBehaviorValue != DstBehaviorValue) {
1343 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1347 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1351 if (!(MaxAndWarn || MinAndWarn))
1352 return stringErr(
"linking module flags '" +
ID->getString() +
1353 "': IDs have conflicting behaviors in '" +
1354 SrcM->getModuleIdentifier() +
"' and '" +
1358 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1359 assert(isa<MDTuple>(DstValue) &&
1360 "Expected MDTuple when appending module flags");
1361 if (DstValue->isDistinct())
1362 return dyn_cast<MDTuple>(DstValue);
1377 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1380 <<
"linking module flags '" <<
ID->getString()
1381 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1382 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1391 mdconst::extract<ConstantInt>(
DstOp->getOperand(2));
1393 mdconst::extract<ConstantInt>(
SrcOp->getOperand(2));
1410 mdconst::extract<ConstantInt>(
DstOp->getOperand(2));
1412 mdconst::extract<ConstantInt>(
SrcOp->getOperand(2));
1427 switch (SrcBehaviorValue) {
1433 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1436 <<
"linking module flags '" <<
ID->getString()
1437 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1438 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1451 MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(
DstOp->getOperand(2)));
1452 MDNode *SrcValue = cast<MDNode>(
SrcOp->getOperand(2));
1453 for (
const auto &O : SrcValue->
operands())
1459 MDTuple *DstValue = ensureDistinctOp(cast<MDNode>(
DstOp->getOperand(2)));
1460 MDNode *SrcValue = cast<MDNode>(
SrcOp->getOperand(2));
1473 for (
auto Idx : Mins) {
1477 ConstantInt *
V = mdconst::extract<ConstantInt>(
Op->getOperand(2));
1479 Op->getOperand(0),
ID,
1486 for (
MDNode *Requirement : Requirements) {
1487 MDString *
Flag = cast<MDString>(Requirement->getOperand(0));
1488 Metadata *ReqValue = Requirement->getOperand(1);
1491 if (!
Op ||
Op->getOperand(2) != ReqValue)
1492 return stringErr(
"linking module flags '" +
Flag->getString() +
1493 "': does not have the required value");
1504 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1506 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1525 if (
auto *
F = dyn_cast<Function>(&GV)) {
1526 if (!
F->isIntrinsic())
1527 F->removeFnAttr(llvm::Attribute::NoCallback);
1532 if (
CallBase *CI = dyn_cast<CallBase>(&
I))
1533 CI->removeFnAttr(Attribute::NoCallback);
1537Error IRLinker::run() {
1539 if (SrcM->getMaterializer())
1540 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1552 if (DstM.
getTargetTriple().empty() && !SrcM->getTargetTriple().empty())
1562 bool EnableDLWarning =
true;
1563 bool EnableTripleWarning =
true;
1564 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1565 std::string ModuleId = SrcM->getModuleIdentifier();
1567 bool SrcIsLibDevice =
1569 bool SrcHasLibDeviceDL =
1570 (SrcM->getDataLayoutStr().empty() ||
1571 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1575 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1576 SrcTriple.getOSName() ==
"gpulibs") ||
1577 (SrcTriple.getVendorName() ==
"unknown" &&
1578 SrcTriple.getOSName() ==
"unknown");
1579 EnableTripleWarning = !(SrcIsLibDevice && SrcHasLibDeviceTriple);
1580 EnableDLWarning = !(SrcIsLibDevice && SrcHasLibDeviceDL);
1583 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1584 emitWarning(
"Linking two modules of different data layouts: '" +
1585 SrcM->getModuleIdentifier() +
"' is '" +
1586 SrcM->getDataLayoutStr() +
"' whereas '" +
1591 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1592 !SrcTriple.isCompatibleWith(DstTriple))
1593 emitWarning(
"Linking two modules of different target triples: '" +
1594 SrcM->getModuleIdentifier() +
"' is '" +
1595 SrcM->getTargetTriple() +
"' whereas '" +
1602 computeTypeMapping();
1604 std::reverse(Worklist.begin(), Worklist.end());
1605 while (!Worklist.empty()) {
1607 Worklist.pop_back();
1611 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1617 return std::move(*FoundError);
1618 flushRAUWWorklist();
1623 DoneLinkingBodies =
true;
1634 if (NGO->isDeclaration())
1638 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1642 }
else if (IsPerformingImport) {
1647 SmallString<256> S(
".symver ");
1651 DstM.appendModuleInlineAsm(S);
1672 return linkModuleFlagsMetadata();
1676 : ETypes(E), IsPacked(
P) {}
1679 : ETypes(ST->elements()), IsPacked(ST->isPacked()) {}
1689StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1693StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1697unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &Key) {
1702unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1703 return getHashValue(KeyTy(ST));
1706bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &LHS,
1708 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
1710 return LHS == KeyTy(RHS);
1713bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *LHS,
1715 if (RHS == getEmptyKey() || RHS == getTombstoneKey())
1717 return KeyTy(LHS) == KeyTy(RHS);
1722 NonOpaqueStructTypes.insert(Ty);
1727 NonOpaqueStructTypes.insert(Ty);
1728 bool Removed = OpaqueStructTypes.erase(Ty);
1735 OpaqueStructTypes.insert(Ty);
1742 auto I = NonOpaqueStructTypes.find_as(Key);
1743 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1748 return OpaqueStructTypes.count(Ty);
1749 auto I = NonOpaqueStructTypes.find(Ty);
1750 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1755 StructTypes.
run(M,
false);
1766 SharedMDs[MD].reset(
const_cast<MDNode *
>(MD));
1773 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1774 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1775 IsPerformingImport);
1776 Error E = TheIRLinker.run();
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 getAddressSpace(const Value *V, unsigned MaxLookup)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static unsigned getNumElements(Type *Ty)
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static 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 Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
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
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.
bool erase(const KeyT &Val)
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.
bool IsNewDbgInfoFormat
Is this function using intrinsics to record the position of debugging information,...
static 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 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.
MaybeAlign getAlign() const
Returns the alignment of the given variable or function.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
VisibilityTypes getVisibility() const
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
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...
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
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.
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 addNonOpaque(StructType *Ty)
bool hasType(StructType *Ty)
void switchToNonOpaque(StructType *Ty)
void addOpaque(StructType *Ty)
StructType * findNonOpaque(ArrayRef< Type * > ETypes, bool IsPacked)
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)
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 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.
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.
bool IsNewDbgInfoFormat
Is this Module using intrinsics to record the position of debugging information, or non-intrinsic rec...
void dropTriviallyDeadConstantArrays()
Destroy ConstantArrays in LLVMContext if they are not used.
NamedMDNode * getOrInsertModuleFlagsMetadata()
Returns the NamedMDNode in the module that represents module-level flags.
const std::string & getTargetTriple() const
Get the target triple which is a string describing the target host.
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.
void setTargetTriple(StringRef T)
Set the target triple.
void setOperand(unsigned I, MDNode *New)
MDNode * getOperand(unsigned i) const
unsigned getNumOperands() const
iterator_range< op_iterator > operands()
void addOperand(MDNode *M)
static 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.
bool erase(PtrType Ptr)
Remove pointer from the set.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
static constexpr size_t npos
Class to represent struct types.
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
static StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
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...
Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
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.
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).
MDNode * mapMDNode(const MDNode &N)
void scheduleMapGlobalInitializer(GlobalVariable &GV, Constant &Init, unsigned MappingContextID=0)
void scheduleRemapFunction(Function &F, unsigned MappingContextID=0)
void scheduleMapGlobalIFunc(GlobalIFunc &GI, Constant &Resolver, unsigned MappingContextID=0)
void scheduleMapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix, bool IsOldCtorDtor, ArrayRef< Constant * > NewMembers, unsigned MappingContextID=0)
void scheduleMapGlobalAlias(GlobalAlias &GA, Constant &Aliasee, unsigned MappingContextID=0)
void remapGlobalObjectMetadata(GlobalObject &GO)
Value * mapValue(const Value &V)
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.
void setName(const Twine &Name)
Change the name of the value.
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVMContext & getContext() const
All values hold a context through their type.
StringRef getName() const
Return a constant reference to the value's name.
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.
@ C
The default llvm calling convention, compatible with C.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
ID ArrayRef< Type * > Tys
std::optional< Function * > remangleIntrinsicFunction(Function *F)
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ SC
CHAIN = SC CHAIN, Imm128 - System call.
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
StringRef filename(StringRef path, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
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...
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...
KeyTy(ArrayRef< Type * > E, bool P)
bool operator==(const KeyTy &that) const
ArrayRef< Type * > ETypes
bool operator!=(const KeyTy &that) const