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) {
953 NewGV = copyGlobalValueProto(SGV,
false);
954 NeedsRenaming =
true;
960 if (DoneLinkingBodies)
963 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
964 if (ShouldLink || !ForIndirectSymbol)
965 NeedsRenaming =
true;
976 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
979 NeedsRenaming =
false;
985 if (ShouldLink || ForIndirectSymbol) {
995 if (!ShouldLink && ForIndirectSymbol)
1004 if (DGV && NewGV != SGV) {
1006 NewGV, TypeMap.get(SGV->
getType()));
1009 if (DGV && NewGV != DGV) {
1013 RAUWWorklist.push_back(std::make_pair(
1032 assert(Dst.isDeclaration() && !Src.isDeclaration());
1035 if (
Error Err = Src.materialize())
1039 if (Src.hasPrefixData())
1040 Dst.setPrefixData(Src.getPrefixData());
1041 if (Src.hasPrologueData())
1042 Dst.setPrologueData(Src.getPrologueData());
1043 if (Src.hasPersonalityFn())
1044 Dst.setPersonalityFn(Src.getPersonalityFn());
1047 Dst.copyMetadata(&Src, 0);
1050 Dst.stealArgumentListFrom(Src);
1051 Dst.splice(Dst.end(), &Src);
1081void IRLinker::flushRAUWWorklist() {
1082 for (
const auto &Elem : RAUWWorklist) {
1085 std::tie(Old, New) = Elem;
1090 RAUWWorklist.clear();
1093void IRLinker::prepareCompileUnitsForImport() {
1094 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1095 if (!SrcCompileUnits)
1102 assert(CU &&
"Expected valid compile unit");
1106 CU->replaceEnumTypes(
nullptr);
1107 CU->replaceMacros(
nullptr);
1108 CU->replaceRetainedTypes(
nullptr);
1119 CU->replaceGlobalVariables(
nullptr);
1121 CU->replaceImportedEntities(
nullptr);
1126void IRLinker::linkNamedMDNodes() {
1127 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1128 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1130 if (&NMD == SrcModFlags)
1136 emitWarning(
"Pseudo-probe ignored: source module '" +
1137 SrcM->getModuleIdentifier() +
1138 "' is compiled with -fpseudo-probe-for-profiling while "
1139 "destination module '" +
1145 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1150 auto &
Inserted = NamedMDNodes[DestNMD];
1157 for (
const MDNode *
Op : NMD.operands()) {
1166Error IRLinker::linkModuleFlagsMetadata() {
1168 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1216 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1243 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1245 auto overrideDstValue = [&]() {
1254 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1255 return stringErr(
"linking module flags '" +
ID->getString() +
1256 "': IDs have conflicting override values in '" +
1257 SrcM->getModuleIdentifier() +
"' and '" +
1267 if (SrcBehaviorValue != DstBehaviorValue) {
1268 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1272 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1276 if (!(MaxAndWarn || MinAndWarn))
1277 return stringErr(
"linking module flags '" +
ID->getString() +
1278 "': IDs have conflicting behaviors in '" +
1279 SrcM->getModuleIdentifier() +
"' and '" +
1283 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1285 "Expected MDTuple when appending module flags");
1286 if (DstValue->isDistinct())
1302 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1305 <<
"linking module flags '" <<
ID->getString()
1306 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1307 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1352 switch (SrcBehaviorValue) {
1358 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1361 <<
"linking module flags '" <<
ID->getString()
1362 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1363 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1378 for (
const auto &O : SrcValue->
operands())
1398 for (
auto Idx : Mins) {
1404 Op->getOperand(0),
ID,
1411 for (
MDNode *Requirement : Requirements) {
1413 Metadata *ReqValue = Requirement->getOperand(1);
1416 if (!
Op ||
Op->getOperand(2) != ReqValue)
1417 return stringErr(
"linking module flags '" +
Flag->getString() +
1418 "': does not have the required value");
1429 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1431 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1451 if (!
F->isIntrinsic())
1452 F->removeFnAttr(llvm::Attribute::NoCallback);
1458 CI->removeFnAttr(Attribute::NoCallback);
1462Error IRLinker::run() {
1464 if (SrcM->getMaterializer())
1465 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1484 bool EnableDLWarning =
true;
1485 bool EnableTripleWarning =
true;
1486 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1487 bool SrcHasLibDeviceDL =
1488 (SrcM->getDataLayoutStr().
empty() ||
1489 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1493 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1494 SrcTriple.getOSName() ==
"gpulibs") ||
1495 (SrcTriple.getVendorName() ==
"unknown" &&
1496 SrcTriple.getOSName() ==
"unknown");
1497 EnableTripleWarning = !SrcHasLibDeviceTriple;
1498 EnableDLWarning = !(SrcHasLibDeviceTriple && SrcHasLibDeviceDL);
1501 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1502 emitWarning(
"Linking two modules of different data layouts: '" +
1503 SrcM->getModuleIdentifier() +
"' is '" +
1504 SrcM->getDataLayoutStr() +
"' whereas '" +
1509 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1510 !SrcTriple.isCompatibleWith(DstTriple))
1511 emitWarning(
"Linking two modules of different target triples: '" +
1512 SrcM->getModuleIdentifier() +
"' is '" +
1513 SrcM->getTargetTriple().str() +
"' whereas '" +
1520 computeTypeMapping();
1527 std::reverse(Worklist.begin(), Worklist.end());
1528 while (!Worklist.empty()) {
1530 Worklist.pop_back();
1534 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1540 return std::move(*FoundError);
1541 flushRAUWWorklist();
1546 DoneLinkingBodies =
true;
1557 if (NGO->isDeclaration())
1561 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1565 }
else if (IsPerformingImport) {
1586 return std::move(*FoundError);
1597 return linkModuleFlagsMetadata();
1614StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1618StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1622unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &
Key) {
1626unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1627 return getHashValue(KeyTy(ST));
1630bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &
LHS,
1631 const StructType *
RHS) {
1632 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1637bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *
LHS,
1638 const StructType *
RHS) {
1639 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1646 NonOpaqueStructTypes.insert(Ty);
1651 NonOpaqueStructTypes.insert(Ty);
1652 bool Removed = OpaqueStructTypes.erase(Ty);
1659 OpaqueStructTypes.insert(Ty);
1666 auto I = NonOpaqueStructTypes.find_as(
Key);
1667 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1672 return OpaqueStructTypes.count(Ty);
1673 auto I = NonOpaqueStructTypes.find(Ty);
1674 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1679 StructTypes.
run(M,
false);
1682 IdentifiedStructTypes.addOpaque(Ty);
1684 IdentifiedStructTypes.addNonOpaque(Ty);
1690 SharedMDs[MD].reset(const_cast<MDNode *>(MD));
1702 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1703 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1704 IsPerformingImport, NamedMDNodes);
1705 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_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