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),
450 &TypeMap, &GValMaterializer),
451 IndirectSymbolMCID(Mapper.registerAlternateMappingContext(
452 IndirectSymbolValueMap, &LValMaterializer)) {
453 ValueMap.
getMDMap() = std::move(SharedMDs);
454 for (GlobalValue *GV : ValuesToLink)
456 if (IsPerformingImport)
457 prepareCompileUnitsForImport();
459 ~IRLinker() { SharedMDs = std::move(*ValueMap.
getMDMap()); }
462 Value *materialize(
Value *V,
bool ForIndirectSymbol);
478 if (
GlobalValue *ConflictGV = M->getNamedValue(Name)) {
480 ConflictGV->setName(Name);
481 assert(ConflictGV->getName() != Name &&
"forceRenaming didn't work");
487Value *GlobalValueMaterializer::materialize(
Value *SGV) {
488 return TheIRLinker.materialize(SGV,
false);
491Value *LocalValueMaterializer::materialize(
Value *SGV) {
492 return TheIRLinker.materialize(SGV,
true);
495Value *IRLinker::materialize(
Value *V,
bool ForIndirectSymbol) {
501 if (SGV->getParent() == &DstM)
508 if (SGV->getParent() != SrcM.get())
525 if (!
F->isDeclaration())
528 if (
V->hasInitializer() ||
V->hasAppendingLinkage())
531 if (GA->getAliasee())
534 if (GI->getResolver())
549 (!ForIndirectSymbol && IndirectSymbolValueMap.
lookup(SGV) == New))
552 if (ForIndirectSymbol || shouldLink(New, *SGV))
553 setError(linkGlobalValueBody(*New, *SGV));
555 updateAttributes(*New);
576AttributeList IRLinker::mapAttributeTypes(
LLVMContext &
C, AttributeList Attrs) {
577 for (
unsigned i = 0; i <
Attrs.getNumAttrSets(); ++i) {
578 for (
int AttrIdx = Attribute::FirstTypeAttr;
579 AttrIdx <= Attribute::LastTypeAttr; AttrIdx++) {
581 if (
Attrs.hasAttributeAtIndex(i, TypedAttr)) {
583 Attrs.getAttributeAtIndex(i, TypedAttr).getValueAsType()) {
584 Attrs =
Attrs.replaceAttributeTypeAtIndex(
C, i, TypedAttr,
602 F->copyAttributesFrom(SF);
603 F->setAttributes(mapAttributeTypes(
F->getContext(),
F->getAttributes()));
618 DGA->copyAttributesFrom(GA);
625 SGV->
getName(),
nullptr, &DstM);
626 DGI->copyAttributesFrom(GI);
634 bool ForDefinition) {
637 NewGV = copyGlobalVariableProto(SGVar);
639 NewGV = copyFunctionProto(SF);
642 NewGV = copyIndirectSymbolProto(SGV);
667 UnmappedMetadata.
insert(NewGO);
675 NewF->setPersonalityFn(
nullptr);
676 NewF->setPrefixData(
nullptr);
677 NewF->setPrologueData(
nullptr);
684 size_t DotPos = Name.rfind(
'.');
685 return (DotPos == 0 || DotPos ==
StringRef::npos || Name.back() ==
'.' ||
686 !isdigit(
static_cast<unsigned char>(Name[DotPos + 1])))
688 : Name.substr(0, DotPos);
695void IRLinker::computeTypeMapping() {
709 TypeMap.addTypeMapping(DAT->getElementType(),
SAT->getElementType());
734 std::vector<StructType *>
Types = SrcM->getIdentifiedStructTypes();
739 if (TypeMap.DstStructTypesSet.
hasType(ST)) {
748 if (STTypePrefix.size() ==
ST->getName().size())
773 if (TypeMap.DstStructTypesSet.
hasType(DST))
774 TypeMap.addTypeMapping(DST, ST);
782 for (
unsigned i = 0; i != NumElements; ++i)
794 "Linking globals named '" + SrcGV->
getName() +
795 "': can only link appending global with another appending "
799 return stringErr(
"Appending variables linked with different const'ness!");
803 "Appending variables with different alignment need to be linked!");
807 "Appending variables with different visibility need to be linked!");
811 "Appending variables with different unnamed_addr need to be linked!");
815 "Appending variables with different section name need to be linked!");
818 return stringErr(
"Appending variables with different address spaces need "
834 bool IsNewStructor =
false;
835 bool IsOldStructor =
false;
836 if (Name ==
"llvm.global_ctors" || Name ==
"llvm.global_dtors") {
838 IsNewStructor =
true;
840 IsOldStructor =
true;
846 Type *Tys[3] = {
ST.getElementType(0),
ST.getElementType(1), VoidPtrTy};
850 uint64_t DstNumElements = 0;
853 DstNumElements = DstTy->getNumElements();
856 if (EltTy != DstTy->getElementType())
857 return stringErr(
"Appending variables with different element types!");
870 return !shouldLink(DGV, *
Key);
873 uint64_t NewSize = DstNumElements + SrcElements.
size();
890 RAUWWorklist.push_back(std::make_pair(DstGV, NG));
908 bool LazilyAdded =
false;
910 AddLazyFor(SGV, [
this, &LazilyAdded](
GlobalValue &GV) {
918 bool ForIndirectSymbol) {
921 bool ShouldLink = shouldLink(DGV, *SGV);
929 I = IndirectSymbolValueMap.
find(SGV);
930 if (
I != IndirectSymbolValueMap.
end())
934 if (!ShouldLink && ForIndirectSymbol)
942 bool NeedsRenaming =
false;
944 if (DGV && !ShouldLink) {
950 if (DoneLinkingBodies)
953 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
954 if (ShouldLink || !ForIndirectSymbol)
955 NeedsRenaming =
true;
966 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
969 NeedsRenaming =
false;
975 if (ShouldLink || ForIndirectSymbol) {
985 if (!ShouldLink && ForIndirectSymbol)
994 if (DGV && NewGV != SGV) {
996 NewGV, TypeMap.get(SGV->
getType()));
999 if (DGV && NewGV != DGV) {
1003 RAUWWorklist.push_back(std::make_pair(
1022 assert(Dst.isDeclaration() && !Src.isDeclaration());
1025 if (
Error Err = Src.materialize())
1029 if (Src.hasPrefixData())
1030 Dst.setPrefixData(Src.getPrefixData());
1031 if (Src.hasPrologueData())
1032 Dst.setPrologueData(Src.getPrologueData());
1033 if (Src.hasPersonalityFn())
1034 Dst.setPersonalityFn(Src.getPersonalityFn());
1037 Dst.copyMetadata(&Src, 0);
1040 Dst.stealArgumentListFrom(Src);
1041 Dst.splice(Dst.end(), &Src);
1071void IRLinker::flushRAUWWorklist() {
1072 for (
const auto &Elem : RAUWWorklist) {
1075 std::tie(Old, New) = Elem;
1080 RAUWWorklist.clear();
1083void IRLinker::prepareCompileUnitsForImport() {
1084 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1085 if (!SrcCompileUnits)
1092 assert(CU &&
"Expected valid compile unit");
1096 CU->replaceEnumTypes(
nullptr);
1097 CU->replaceMacros(
nullptr);
1098 CU->replaceRetainedTypes(
nullptr);
1109 CU->replaceGlobalVariables(
nullptr);
1111 CU->replaceImportedEntities(
nullptr);
1116void IRLinker::linkNamedMDNodes() {
1117 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1118 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1120 if (&NMD == SrcModFlags)
1126 emitWarning(
"Pseudo-probe ignored: source module '" +
1127 SrcM->getModuleIdentifier() +
1128 "' is compiled with -fpseudo-probe-for-profiling while "
1129 "destination module '" +
1135 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1140 auto &
Inserted = NamedMDNodes[DestNMD];
1147 for (
const MDNode *
Op : NMD.operands()) {
1156Error IRLinker::linkModuleFlagsMetadata() {
1158 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1206 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1233 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1235 auto overrideDstValue = [&]() {
1244 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1245 return stringErr(
"linking module flags '" +
ID->getString() +
1246 "': IDs have conflicting override values in '" +
1247 SrcM->getModuleIdentifier() +
"' and '" +
1257 if (SrcBehaviorValue != DstBehaviorValue) {
1258 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1262 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1266 if (!(MaxAndWarn || MinAndWarn))
1267 return stringErr(
"linking module flags '" +
ID->getString() +
1268 "': IDs have conflicting behaviors in '" +
1269 SrcM->getModuleIdentifier() +
"' and '" +
1273 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1275 "Expected MDTuple when appending module flags");
1276 if (DstValue->isDistinct())
1292 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1295 <<
"linking module flags '" <<
ID->getString()
1296 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1297 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1342 switch (SrcBehaviorValue) {
1348 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1351 <<
"linking module flags '" <<
ID->getString()
1352 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1353 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1368 for (
const auto &O : SrcValue->
operands())
1388 for (
auto Idx : Mins) {
1394 Op->getOperand(0),
ID,
1401 for (
MDNode *Requirement : Requirements) {
1403 Metadata *ReqValue = Requirement->getOperand(1);
1406 if (!
Op ||
Op->getOperand(2) != ReqValue)
1407 return stringErr(
"linking module flags '" +
Flag->getString() +
1408 "': does not have the required value");
1419 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1421 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1441 if (!
F->isIntrinsic())
1442 F->removeFnAttr(llvm::Attribute::NoCallback);
1448 CI->removeFnAttr(Attribute::NoCallback);
1452Error IRLinker::run() {
1454 if (SrcM->getMaterializer())
1455 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1474 bool EnableDLWarning =
true;
1475 bool EnableTripleWarning =
true;
1476 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1477 bool SrcHasLibDeviceDL =
1478 (SrcM->getDataLayoutStr().
empty() ||
1479 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1483 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1484 SrcTriple.getOSName() ==
"gpulibs") ||
1485 (SrcTriple.getVendorName() ==
"unknown" &&
1486 SrcTriple.getOSName() ==
"unknown");
1487 EnableTripleWarning = !SrcHasLibDeviceTriple;
1488 EnableDLWarning = !(SrcHasLibDeviceTriple && SrcHasLibDeviceDL);
1491 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1492 emitWarning(
"Linking two modules of different data layouts: '" +
1493 SrcM->getModuleIdentifier() +
"' is '" +
1494 SrcM->getDataLayoutStr() +
"' whereas '" +
1499 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1500 !SrcTriple.isCompatibleWith(DstTriple))
1501 emitWarning(
"Linking two modules of different target triples: '" +
1502 SrcM->getModuleIdentifier() +
"' is '" +
1503 SrcM->getTargetTriple().str() +
"' whereas '" +
1510 computeTypeMapping();
1517 std::reverse(Worklist.begin(), Worklist.end());
1518 while (!Worklist.empty()) {
1520 Worklist.pop_back();
1524 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1530 return std::move(*FoundError);
1531 flushRAUWWorklist();
1536 DoneLinkingBodies =
true;
1547 if (NGO->isDeclaration())
1551 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1555 }
else if (IsPerformingImport) {
1576 return std::move(*FoundError);
1587 return linkModuleFlagsMetadata();
1604StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1608StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1612unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &
Key) {
1616unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1617 return getHashValue(KeyTy(ST));
1620bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &
LHS,
1621 const StructType *
RHS) {
1622 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1627bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *
LHS,
1628 const StructType *
RHS) {
1629 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1636 NonOpaqueStructTypes.insert(Ty);
1641 NonOpaqueStructTypes.insert(Ty);
1642 bool Removed = OpaqueStructTypes.erase(Ty);
1649 OpaqueStructTypes.insert(Ty);
1656 auto I = NonOpaqueStructTypes.find_as(
Key);
1657 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1662 return OpaqueStructTypes.count(Ty);
1663 auto I = NonOpaqueStructTypes.find(Ty);
1664 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1669 StructTypes.
run(M,
false);
1672 IdentifiedStructTypes.addOpaque(Ty);
1674 IdentifiedStructTypes.addNonOpaque(Ty);
1680 SharedMDs[MD].reset(const_cast<MDNode *>(MD));
1692 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1693 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1694 IsPerformingImport, NamedMDNodes);
1695 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
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.
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.
#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_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