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();
888 IsOldStructor, SrcElements);
893 RAUWWorklist.push_back(std::make_pair(DstGV, NG));
911 bool LazilyAdded =
false;
913 AddLazyFor(SGV, [
this, &LazilyAdded](
GlobalValue &GV) {
921 bool ForIndirectSymbol) {
924 bool ShouldLink = shouldLink(DGV, *SGV);
932 I = IndirectSymbolValueMap.
find(SGV);
933 if (
I != IndirectSymbolValueMap.
end())
937 if (!ShouldLink && ForIndirectSymbol)
945 bool NeedsRenaming =
false;
947 if (DGV && !ShouldLink) {
953 if (DoneLinkingBodies)
956 NewGV = copyGlobalValueProto(SGV, ShouldLink || ForIndirectSymbol);
957 if (ShouldLink || !ForIndirectSymbol)
958 NeedsRenaming =
true;
969 assert(!UnmappedMetadata.
count(
F) &&
"intrinsic has unmapped metadata");
972 NeedsRenaming =
false;
978 if (ShouldLink || ForIndirectSymbol) {
988 if (!ShouldLink && ForIndirectSymbol)
997 if (DGV && NewGV != SGV) {
999 NewGV, TypeMap.get(SGV->
getType()));
1002 if (DGV && NewGV != DGV) {
1006 RAUWWorklist.push_back(std::make_pair(
1025 assert(Dst.isDeclaration() && !Src.isDeclaration());
1028 if (
Error Err = Src.materialize())
1032 if (Src.hasPrefixData())
1033 Dst.setPrefixData(Src.getPrefixData());
1034 if (Src.hasPrologueData())
1035 Dst.setPrologueData(Src.getPrologueData());
1036 if (Src.hasPersonalityFn())
1037 Dst.setPersonalityFn(Src.getPersonalityFn());
1040 Dst.copyMetadata(&Src, 0);
1043 Dst.stealArgumentListFrom(Src);
1044 Dst.splice(Dst.end(), &Src);
1074void IRLinker::flushRAUWWorklist() {
1075 for (
const auto &Elem : RAUWWorklist) {
1078 std::tie(Old, New) = Elem;
1083 RAUWWorklist.clear();
1086void IRLinker::prepareCompileUnitsForImport() {
1087 NamedMDNode *SrcCompileUnits = SrcM->getNamedMetadata(
"llvm.dbg.cu");
1088 if (!SrcCompileUnits)
1095 assert(CU &&
"Expected valid compile unit");
1099 CU->replaceEnumTypes(
nullptr);
1100 CU->replaceMacros(
nullptr);
1101 CU->replaceRetainedTypes(
nullptr);
1112 CU->replaceGlobalVariables(
nullptr);
1114 CU->replaceImportedEntities(
nullptr);
1119void IRLinker::linkNamedMDNodes() {
1120 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1121 for (
const NamedMDNode &NMD : SrcM->named_metadata()) {
1123 if (&NMD == SrcModFlags)
1129 emitWarning(
"Pseudo-probe ignored: source module '" +
1130 SrcM->getModuleIdentifier() +
1131 "' is compiled with -fpseudo-probe-for-profiling while "
1132 "destination module '" +
1138 if (IsPerformingImport && NMD.getName() ==
"llvm.stats")
1143 auto &
Inserted = NamedMDNodes[DestNMD];
1150 for (
const MDNode *
Op : NMD.operands()) {
1159Error IRLinker::linkModuleFlagsMetadata() {
1161 const NamedMDNode *SrcModFlags = SrcM->getModuleFlagsMetadata();
1209 unsigned SrcBehaviorValue = SrcBehavior->
getZExtValue();
1236 unsigned DstBehaviorValue = DstBehavior->
getZExtValue();
1238 auto overrideDstValue = [&]() {
1247 SrcOp->getOperand(2) !=
DstOp->getOperand(2))
1248 return stringErr(
"linking module flags '" +
ID->getString() +
1249 "': IDs have conflicting override values in '" +
1250 SrcM->getModuleIdentifier() +
"' and '" +
1260 if (SrcBehaviorValue != DstBehaviorValue) {
1261 bool MinAndWarn = (SrcBehaviorValue ==
Module::Min &&
1265 bool MaxAndWarn = (SrcBehaviorValue ==
Module::Max &&
1269 if (!(MaxAndWarn || MinAndWarn))
1270 return stringErr(
"linking module flags '" +
ID->getString() +
1271 "': IDs have conflicting behaviors in '" +
1272 SrcM->getModuleIdentifier() +
"' and '" +
1276 auto ensureDistinctOp = [&](
MDNode *DstValue) {
1278 "Expected MDTuple when appending module flags");
1279 if (DstValue->isDistinct())
1295 SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1298 <<
"linking module flags '" <<
ID->getString()
1299 <<
"': IDs have conflicting values ('" << *
SrcOp->getOperand(2)
1300 <<
"' from " << SrcM->getModuleIdentifier() <<
" with '"
1345 switch (SrcBehaviorValue) {
1351 if (
SrcOp->getOperand(2) !=
DstOp->getOperand(2)) {
1354 <<
"linking module flags '" <<
ID->getString()
1355 <<
"': IDs have conflicting values: '" << *
SrcOp->getOperand(2)
1356 <<
"' from " << SrcM->getModuleIdentifier() <<
", and '"
1371 for (
const auto &O : SrcValue->
operands())
1391 for (
auto Idx : Mins) {
1397 Op->getOperand(0),
ID,
1404 for (
MDNode *Requirement : Requirements) {
1406 Metadata *ReqValue = Requirement->getOperand(1);
1409 if (!
Op ||
Op->getOperand(2) != ReqValue)
1410 return stringErr(
"linking module flags '" +
Flag->getString() +
1411 "': does not have the required value");
1422 return ".text\n.balign 2\n.thumb\n" +
InlineAsm;
1424 return ".text\n.balign 4\n.arm\n" +
InlineAsm;
1444 if (!
F->isIntrinsic())
1445 F->removeFnAttr(llvm::Attribute::NoCallback);
1451 CI->removeFnAttr(Attribute::NoCallback);
1455Error IRLinker::run() {
1457 if (SrcM->getMaterializer())
1458 if (
Error Err = SrcM->getMaterializer()->materializeMetadata())
1477 bool EnableDLWarning =
true;
1478 bool EnableTripleWarning =
true;
1479 if (SrcTriple.isNVPTX() && DstTriple.isNVPTX()) {
1480 bool SrcHasLibDeviceDL =
1481 (SrcM->getDataLayoutStr().
empty() ||
1482 SrcM->getDataLayoutStr() ==
"e-i64:64-v16:16-v32:32-n16:32:64");
1486 bool SrcHasLibDeviceTriple = (SrcTriple.getVendor() ==
Triple::NVIDIA &&
1487 SrcTriple.getOSName() ==
"gpulibs") ||
1488 (SrcTriple.getVendorName() ==
"unknown" &&
1489 SrcTriple.getOSName() ==
"unknown");
1490 EnableTripleWarning = !SrcHasLibDeviceTriple;
1491 EnableDLWarning = !(SrcHasLibDeviceTriple && SrcHasLibDeviceDL);
1494 if (EnableDLWarning && (SrcM->getDataLayout() != DstM.
getDataLayout())) {
1495 emitWarning(
"Linking two modules of different data layouts: '" +
1496 SrcM->getModuleIdentifier() +
"' is '" +
1497 SrcM->getDataLayoutStr() +
"' whereas '" +
1502 if (EnableTripleWarning && !SrcM->getTargetTriple().empty() &&
1503 !SrcTriple.isCompatibleWith(DstTriple))
1504 emitWarning(
"Linking two modules of different target triples: '" +
1505 SrcM->getModuleIdentifier() +
"' is '" +
1506 SrcM->getTargetTriple().str() +
"' whereas '" +
1513 computeTypeMapping();
1515 std::reverse(Worklist.begin(), Worklist.end());
1516 while (!Worklist.empty()) {
1518 Worklist.pop_back();
1522 IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
1528 return std::move(*FoundError);
1529 flushRAUWWorklist();
1534 DoneLinkingBodies =
true;
1545 if (NGO->isDeclaration())
1549 if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
1553 }
else if (IsPerformingImport) {
1574 return std::move(*FoundError);
1585 return linkModuleFlagsMetadata();
1602StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
1606StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
1610unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &
Key) {
1614unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
1615 return getHashValue(KeyTy(ST));
1618bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &
LHS,
1619 const StructType *
RHS) {
1620 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1625bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *
LHS,
1626 const StructType *
RHS) {
1627 if (
RHS == getEmptyKey() ||
RHS == getTombstoneKey())
1634 NonOpaqueStructTypes.insert(Ty);
1639 NonOpaqueStructTypes.insert(Ty);
1640 bool Removed = OpaqueStructTypes.erase(Ty);
1647 OpaqueStructTypes.insert(Ty);
1654 auto I = NonOpaqueStructTypes.find_as(
Key);
1655 return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
1660 return OpaqueStructTypes.count(Ty);
1661 auto I = NonOpaqueStructTypes.find(Ty);
1662 return I == NonOpaqueStructTypes.end() ?
false : *
I == Ty;
1667 StructTypes.
run(M,
false);
1670 IdentifiedStructTypes.addOpaque(Ty);
1672 IdentifiedStructTypes.addNonOpaque(Ty);
1678 SharedMDs[MD].reset(const_cast<MDNode *>(MD));
1685 IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
1686 std::move(Src), ValuesToLink, std::move(AddLazyFor),
1687 IsPerformingImport, NamedMDNodes);
1688 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 scheduleMapAppendingVariable(GlobalVariable &GV, Constant *InitPrefix, bool IsOldCtorDtor, ArrayRef< Constant * > NewMembers, unsigned MappingContextID=0)
LLVM_ABI void scheduleMapGlobalAlias(GlobalAlias &GA, Constant &Aliasee, unsigned MappingContextID=0)
LLVM_ABI void remapGlobalObjectMetadata(GlobalObject &GO)
LLVM_ABI Value * mapValue(const Value &V)
LLVM_ABI void addFlags(RemapFlags Flags)
Add to the current RemapFlags.
This is a class that can be implemented by clients to materialize Values on demand.
LLVM Value Representation.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
bool erase(const ValueT &V)
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
A raw_ostream that writes to an std::string.
#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.
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