49 DenseMap<Type *, Type *> MappedTypes;
52 TypeMapTy(IRMover::IdentifiedStructTypeSet &DstStructTypesSet)
53 : DstStructTypesSet(DstStructTypesSet) {}
55 IRMover::IdentifiedStructTypeSet &DstStructTypesSet;
58 void addTypeMapping(
Type *DstTy,
Type *SrcTy);
64 FunctionType *
get(FunctionType *
T) {
69 Type *remapType(
Type *SrcTy)
override {
return get(SrcTy); }
71 bool recursivelyAddMappingIfTypesAreIsomorphic(
Type *DstTy,
Type *SrcTy);
75void TypeMapTy::addTypeMapping(
Type *DstTy,
Type *SrcTy) {
76 recursivelyAddMappingIfTypesAreIsomorphic(DstTy, SrcTy);
82bool TypeMapTy::recursivelyAddMappingIfTypesAreIsomorphic(
Type *DstTy,
91 return Entry == DstTy;
123 if (DSTy->isLiteral() != SSTy->
isLiteral() ||
124 DSTy->isPacked() != SSTy->
isPacked())
127 if (DArrTy->getNumElements() !=
cast<ArrayType>(SrcTy)->getNumElements())
130 if (DVecTy->getElementCount() !=
cast<VectorType>(SrcTy)->getElementCount())
141 [[maybe_unused]]
auto Res = MappedTypes.
insert({SrcTy, DstTy});
142 assert(!Res.second &&
"Recursive type?");
168 for (
auto &Pair : MappedTypes) {
169 assert(!(Pair.first != Ty && Pair.second == Ty) &&
170 "mapping to a source type");
185 bool AnyChange =
false;
193 Entry = &MappedTypes[Ty];
194 assert(!*Entry &&
"Recursive type!");
198 if (!AnyChange && IsUniqued)
205 case Type::ArrayTyID:
206 return *
Entry = ArrayType::get(ElementTypes[0],
208 case Type::ScalableVectorTyID:
209 case Type::FixedVectorTyID:
210 return *
Entry = VectorType::get(ElementTypes[0],
212 case Type::FunctionTyID:
213 return *
Entry = FunctionType::get(ElementTypes[0],
216 case Type::StructTyID: {
223 if (STy->isOpaque()) {
228 if (StructType *OldT =
231 return *
Entry = OldT;
243 if (STy->hasName()) {
244 SmallString<16> TmpName = STy->getName();
271 IRLinker &TheIRLinker;
274 GlobalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
279 IRLinker &TheIRLinker;
282 LocalValueMaterializer(IRLinker &TheIRLinker) : TheIRLinker(TheIRLinker) {}
293 std::unique_ptr<Module> SrcM;
302 GlobalValueMaterializer GValMaterializer;
303 LocalValueMaterializer LValMaterializer;
315 DenseSet<GlobalValue *> ValuesToLink;
316 std::vector<GlobalValue *> Worklist;
317 std::vector<std::pair<GlobalValue *, Value*>> RAUWWorklist;
321 DenseSet<GlobalObject *> UnmappedMetadata;
323 void maybeAdd(GlobalValue *GV) {
324 if (ValuesToLink.
insert(GV).second)
325 Worklist.push_back(GV);
333 bool IsPerformingImport;
338 bool DoneLinkingBodies =
false;
342 std::optional<Error> FoundError;
345 FoundError = std::move(
E);
350 unsigned IndirectSymbolMCID;
354 GlobalValue *copyGlobalValueProto(
const GlobalValue *SGV,
bool ForDefinition);
356 void emitWarning(
const Twine &Message) {
357 SrcM->getContext().diagnose(LinkDiagnosticInfo(
DS_Warning, Message));
362 GlobalValue *getLinkedToGlobal(
const GlobalValue *SrcGV) {
381 if (FDGV->isIntrinsic())
383 if (FDGV->getFunctionType() != TypeMap.get(FSrcGV->getFunctionType()))
390 void computeTypeMapping();
392 Expected<Constant *> linkAppendingVarProto(GlobalVariable *DstGV,
393 const GlobalVariable *SrcGV);
400 bool shouldLink(GlobalValue *DGV, GlobalValue &SGV);
401 Expected<Constant *> linkGlobalValueProto(GlobalValue *GV,
402 bool ForIndirectSymbol);
404 Error linkModuleFlagsMetadata();
406 void linkGlobalVariable(GlobalVariable &Dst, GlobalVariable &Src);
407 Error linkFunctionBody(Function &Dst, Function &Src);
408 void linkAliasAliasee(GlobalAlias &Dst, GlobalAlias &Src);
409 void linkIFuncResolver(GlobalIFunc &Dst, GlobalIFunc &Src);
410 Error linkGlobalValueBody(GlobalValue &Dst, GlobalValue &Src);
414 AttributeList mapAttributeTypes(LLVMContext &
C, AttributeList Attrs);
418 GlobalVariable *copyGlobalVariableProto(
const GlobalVariable *SGVar);
419 Function *copyFunctionProto(
const Function *SF);
420 GlobalValue *copyIndirectSymbolProto(
const GlobalValue *SGV);
428 void flushRAUWWorklist();
433 void prepareCompileUnitsForImport();
434 void linkNamedMDNodes();
437 void updateAttributes(GlobalValue &GV);
440 IRLinker(
Module &DstM, MDMapT &SharedMDs,
441 IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr<Module> SrcM,
445 : DstM(DstM), SrcM(std::
move(SrcM)), NamedMDNodes(NamedMDNodes),
446 AddLazyFor(std::
move(AddLazyFor)), TypeMap(
Set),
447 GValMaterializer(*this), LValMaterializer(*this), SharedMDs(SharedMDs),
448 IsPerformingImport(IsPerformingImport),
452 &TypeMap, &GValMaterializer),
453 IndirectSymbolMCID(Mapper.registerAlternateMappingContext(
454 IndirectSymbolValueMap, &LValMaterializer)) {
455 ValueMap.
getMDMap() = std::move(SharedMDs);
456 for (GlobalValue *GV : ValuesToLink)
458 if (IsPerformingImport)
459 prepareCompileUnitsForImport();
461 ~IRLinker() { SharedMDs = std::move(*ValueMap.
getMDMap()); }
464 Value *materialize(
Value *V,
bool ForIndirectSymbol);
480 if (
GlobalValue *ConflictGV = M->getNamedValue(Name)) {
482 ConflictGV->setName(Name);
483 assert(ConflictGV->getName() != Name &&
"forceRenaming didn't work");
489Value *GlobalValueMaterializer::materialize(
Value *SGV) {
490 return TheIRLinker.materialize(SGV,
false);
493Value *LocalValueMaterializer::materialize(
Value *SGV) {
494 return TheIRLinker.materialize(SGV,
true);
497Value *IRLinker::materialize(
Value *V,
bool ForIndirectSymbol) {
503 if (SGV->getParent() == &DstM)
510 if (SGV->getParent() != SrcM.get())
527 if (!
F->isDeclaration())
530 if (
V->hasInitializer() ||
V->hasAppendingLinkage())
533 if (GA->getAliasee())
536 if (GI->getResolver())
551 (!ForIndirectSymbol && IndirectSymbolValueMap.
lookup(SGV) == New))
554 if (ForIndirectSymbol || shouldLink(New, *SGV))
555 setError(linkGlobalValueBody(*New, *SGV));
557 updateAttributes(*New);
578AttributeList IRLinker::mapAttributeTypes(
LLVMContext &
C, AttributeList Attrs) {
579 for (
unsigned i = 0; i <
Attrs.getNumAttrSets(); ++i) {
580 for (
int AttrIdx = Attribute::FirstTypeAttr;
581 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
583 if (
Attrs.hasAttributeAtIndex(i, TypedAttr)) {
585 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
586 Attrs =
Attrs.replaceAttributeTypeAtIndex(
C, i, TypedAttr,
604 F->copyAttributesFrom(SF);
605 F->setAttributes(mapAttributeTypes(
F->getContext(),
F->getAttributes()));
620 DGA->copyAttributesFrom(GA);
627 SGV->
getName(),
nullptr, &DstM);
628 DGI->copyAttributesFrom(GI);
636 bool ForDefinition) {
639 NewGV = copyGlobalVariableProto(SGVar);
641 NewGV = copyFunctionProto(SF);
644 NewGV = copyIndirectSymbolProto(SGV);
669 UnmappedMetadata.
insert(NewGO);
677 NewF->setPersonalityFn(
nullptr);
678 NewF->setPrefixData(
nullptr);
679 NewF->setPrologueData(
nullptr);
686 size_t DotPos = Name.rfind(
'.');
687 return (DotPos == 0 || DotPos ==
StringRef::npos || Name.back() ==
'.' ||
688 !isdigit(
static_cast<unsigned char>(Name[DotPos + 1])))
690 : Name.substr(0, DotPos);
697void IRLinker::computeTypeMapping() {
711 TypeMap.addTypeMapping(DAT->getElementType(),
SAT->getElementType());
736 std::vector<StructType *>
Types = SrcM->getIdentifiedStructTypes();
741 if (TypeMap.DstStructTypesSet.
hasType(ST)) {
750 if (STTypePrefix.size() ==
ST->getName().size())
775 if (TypeMap.DstStructTypesSet.
hasType(DST))
776 TypeMap.addTypeMapping(DST, ST);
784 for (
unsigned i = 0; i != NumElements; ++i)
796 "Linking globals named '" + SrcGV->
getName() +
797 "': can only link appending global with another appending "
801 return stringErr(
"Appending variables linked with different const'ness!");
805 "Appending variables with different alignment need to be linked!");
809 "Appending variables with different visibility need to be linked!");
813 "Appending variables with different unnamed_addr need to be linked!");
817 "Appending variables with different section name need to be linked!");
820 return stringErr(
"Appending variables with different address spaces need "
836 bool IsNewStructor =
false;
837 bool IsOldStructor =
false;
838 if (Name ==
"llvm.global_ctors" || Name ==
"llvm.global_dtors") {
840 IsNewStructor =
true;
842 IsOldStructor =
true;
848 Type *Tys[3] = {
ST.getElementType(0),
ST.getElementType(1), VoidPtrTy};
852 uint64_t DstNumElements = 0;
855 DstNumElements = DstTy->getNumElements();
858 if (EltTy != DstTy->getElementType())
859 return stringErr(
"Appending variables with different element types!");
872 return !shouldLink(DGV, *
Key);
875 uint64_t NewSize = DstNumElements + SrcElements.
size();
892 RAUWWorklist.push_back(std::make_pair(DstGV, NG));
910 bool LazilyAdded =
false;
912 AddLazyFor(SGV, [
this, &LazilyAdded](
GlobalValue &GV) {
920 bool ForIndirectSymbol) {
923 bool ShouldLink = shouldLink(DGV, *SGV);
931 I = IndirectSymbolValueMap.
find(SGV);
932 if (
I != IndirectSymbolValueMap.
end())
936 if (!ShouldLink && ForIndirectSymbol)
944 bool NeedsRenaming =
false;
946 if (DGV && !ShouldLink) {
955 NewGV = copyGlobalValueProto(SGV,
false);
956 NeedsRenaming =
true;
962 if (DoneLinkingBodies)
965 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
966 if (ShouldLink || !ForIndirectSymbol)
967 NeedsRenaming =
true;
978 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
981 NeedsRenaming =
false;
987 if (ShouldLink || ForIndirectSymbol) {
997 if (!ShouldLink && ForIndirectSymbol)
1006 if (DGV && NewGV != SGV) {
1008 NewGV, TypeMap.get(SGV->
getType()));
1011 if (DGV && NewGV != DGV) {
1015 RAUWWorklist.push_back(std::make_pair(
1034 assert(Dst.isDeclaration() && !Src.isDeclaration());
1037 if (
Error Err = Src.materialize())
1041 if (Src.hasPrefixData())
1042 Dst.setPrefixData(Src.getPrefixData());
1043 if (Src.hasPrologueData())
1044 Dst.setPrologueData(Src.getPrologueData());
1045 if (Src.hasPersonalityFn())
1046 Dst.setPersonalityFn(Src.getPersonalityFn());
1049 Dst.copyMetadata(&Src, 0);
1052 Dst.stealArgumentListFrom(Src);
1053 Dst.splice(Dst.end(), &Src);
1083void IRLinker::flushRAUWWorklist() {
1084 for (
const auto &Elem : RAUWWorklist) {
1087 std::tie(Old, New) = Elem;
1092 RAUWWorklist.clear();
1095void IRLinker::prepareCompileUnitsForImport() {
1096 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1097 if (!SrcCompileUnits)
1104 assert(CU &&
"Expected valid compile unit");
1108 CU->replaceEnumTypes(
nullptr);
1109 CU->replaceMacros(
nullptr);
1110 CU->replaceRetainedTypes(
nullptr);
1121 CU->replaceGlobalVariables(
nullptr);
1123 CU->replaceImportedEntities(
nullptr);
1128void IRLinker::linkNamedMDNodes() {
1129 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1130 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1132 if (&NMD == SrcModFlags)
1138 emitWarning(
"Pseudo-probe ignored: source module '" +
1139 SrcM->getModuleIdentifier() +
1140 "' is compiled with -fpseudo-probe-for-profiling while "
1141 "destination module '" +
1147 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1152 auto &
Inserted = NamedMDNodes[DestNMD];
1159 for (
const MDNode *
Op : NMD.operands()) {
1168Error IRLinker::linkModuleFlagsMetadata() {
1170 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1218 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1245 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1247 auto overrideDstValue = [&]() {
1256 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1257 return stringErr(
"linking module flags '" +
ID->getString() +
1258 "': IDs have conflicting override values in '" +
1259 SrcM->getModuleIdentifier() +
"' and '" +
1269 if (SrcBehaviorValue != DstBehaviorValue) {
1270 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1274 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1278 if (!(MaxAndWarn || MinAndWarn))
1279 return stringErr(
"linking module flags '" +
ID->getString() +
1280 "': IDs have conflicting behaviors in '" +
1281 SrcM->getModuleIdentifier() +
"' and '" +
1285 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1287 "Expected MDTuple when appending module flags");
1288 if (DstValue->isDistinct())
1304 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1307 <<
"linking module flags '" <<
ID->getString()
1308 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1309 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1354 switch (SrcBehaviorValue) {
1360 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1363 <<
"linking module flags '" <<
ID->getString()
1364 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1365 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1380 for (
const auto &O : SrcValue->
operands())
1400 for (
auto Idx : Mins) {
1406 Op->getOperand(0),
ID,
1413 for (
MDNode *Requirement : Requirements) {
1415 Metadata *ReqValue = Requirement->getOperand(1);
1418 if (!
Op ||
Op->getOperand(2) != ReqValue)
1419 return stringErr(
"linking module flags '" +
Flag->getString() +
1420 "': does not have the required value");
1431 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1433 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1453 if (!
F->isIntrinsic())
1454 F->removeFnAttr(llvm::Attribute::NoCallback);
1460 CI->removeFnAttr(Attribute::NoCallback);
1464Error IRLinker::run() {
1466 if (SrcM->getMaterializer())
1467 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1486 bool EnableDLWarning =
true;
1487 bool EnableTripleWarning =
true;
1488 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1489 bool SrcHasLibDeviceDL =
1490 (SrcM->getDataLayoutStr().
empty() ||
1491 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1495 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1496 SrcTriple.getOSName() ==
"gpulibs") ||
1497 (SrcTriple.getVendorName() ==
"unknown" &&
1498 SrcTriple.getOSName() ==
"unknown");
1499 EnableTripleWarning = !SrcHasLibDeviceTriple;
1500 EnableDLWarning = !(SrcHasLibDeviceTriple && SrcHasLibDeviceDL);
1503 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1504 emitWarning(
"Linking two modules of different data layouts: '" +
1505 SrcM->getModuleIdentifier() +
"' is '" +
1506 SrcM->getDataLayoutStr() +
"' whereas '" +
1511 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1512 !SrcTriple.isCompatibleWith(DstTriple))
1513 emitWarning(
"Linking two modules of different target triples: '" +
1514 SrcM->getModuleIdentifier() +
"' is '" +
1515 SrcM->getTargetTriple().str() +
"' whereas '" +
1522 computeTypeMapping();
1529 std::reverse(Worklist.begin(), Worklist.end());
1530 while (!Worklist.empty()) {
1532 Worklist.pop_back();
1536 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1542 return std::move(*FoundError);
1543 flushRAUWWorklist();
1548 DoneLinkingBodies =
true;
1559 if (NGO->isDeclaration())
1563 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1567 }
else if (IsPerformingImport) {
1588 return std::move(*FoundError);
1599 return linkModuleFlagsMetadata();
1616StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1620StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1624unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &
Key) {
1628unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1629 return getHashValue(KeyTy(ST));
1632bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &
LHS,
1633 const StructType *
RHS) {
1634 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1639bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *
LHS,
1640 const StructType *
RHS) {
1641 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1648 NonOpaqueStructTypes.insert(Ty);
1653 NonOpaqueStructTypes.insert(Ty);
1654 bool Removed = OpaqueStructTypes.erase(Ty);
1661 OpaqueStructTypes.insert(Ty);
1668 auto I = NonOpaqueStructTypes.find_as(
Key);
1669 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1674 return OpaqueStructTypes.count(Ty);
1675 auto I = NonOpaqueStructTypes.find(Ty);
1676 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1681 StructTypes.
run(M,
false);
1684 IdentifiedStructTypes.addOpaque(Ty);
1686 IdentifiedStructTypes.addNonOpaque(Ty);
1692 SharedMDs[MD].reset(const_cast<MDNode *>(MD));
1704 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1705 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1706 IsPerformingImport, NamedMDNodes);
1707 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...
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
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.
Machine Check Debug Module
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),...
Class to represent array types.
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.
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.
DiagnosticInfo(int Kind, DiagnosticSeverity Severity)
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
bool hasExactDefinition() const
Return true if this global has an exact defintion.
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.
DenseMap< const NamedMDNode *, SmallPtrSet< const MDNode *, 8 > > NamedMDNodesT
llvm::unique_function< void(GlobalValue &GV, ValueAdder Add)> LazyCallback
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)
Class to represent pointers.
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.
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.
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...
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)
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 scheduleMapGlobalAlias(GlobalAlias &GA, Constant &Aliasee, unsigned MappingContextID=0)
LLVM_ABI void remapGlobalObjectMetadata(GlobalObject &GO)
LLVM_ABI Value * mapValue(const Value &V)
LLVM_ABI void scheduleMapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV, bool IsOldCtorDtor, ArrayRef< Constant * > NewMembers, unsigned MappingContextID=0)
LLVM_ABI void addFlags(RemapFlags Flags)
Add to the current RemapFlags.
This is a class that can be implemented by clients to materialize Values on demand.
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.
LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
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.
#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.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
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.
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
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_Importing
Indicate that we are importing functions, specifically in the context of ThinLTO.
@ RF_ReuseAndMutateDistinctMDs
Instruct the remapper to reuse and mutate distinct metadata (remapping them in place) instead of clon...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy
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.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
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
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