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();
 
 1520  std::reverse(Worklist.begin(), Worklist.end());
 
 1521  while (!Worklist.empty()) {
 
 1523    Worklist.pop_back();
 
 1527        IndirectSymbolValueMap.
find(GV) != IndirectSymbolValueMap.
end())
 
 1533      return std::move(*FoundError);
 
 1534    flushRAUWWorklist();
 
 1539  DoneLinkingBodies = 
true;
 
 1550    if (NGO->isDeclaration())
 
 1554  if (!IsPerformingImport && !SrcM->getModuleInlineAsm().empty()) {
 
 1558  } 
else if (IsPerformingImport) {
 
 1579      return std::move(*FoundError);
 
 1590  return linkModuleFlagsMetadata();
 
 1607StructType *IRMover::StructTypeKeyInfo::getEmptyKey() {
 
 1611StructType *IRMover::StructTypeKeyInfo::getTombstoneKey() {
 
 1615unsigned IRMover::StructTypeKeyInfo::getHashValue(
const KeyTy &
Key) {
 
 1619unsigned IRMover::StructTypeKeyInfo::getHashValue(
const StructType *ST) {
 
 1620  return getHashValue(KeyTy(ST));
 
 1623bool IRMover::StructTypeKeyInfo::isEqual(
const KeyTy &
LHS,
 
 1624                                         const StructType *
RHS) {
 
 1625  if (
RHS == getEmptyKey() || 
RHS == getTombstoneKey())
 
 1630bool IRMover::StructTypeKeyInfo::isEqual(
const StructType *
LHS,
 
 1631                                         const StructType *
RHS) {
 
 1632  if (
RHS == getEmptyKey() || 
RHS == getTombstoneKey())
 
 1639  NonOpaqueStructTypes.insert(Ty);
 
 
 1644  NonOpaqueStructTypes.insert(Ty);
 
 1645  bool Removed = OpaqueStructTypes.erase(Ty);
 
 
 1652  OpaqueStructTypes.insert(Ty);
 
 
 1659  auto I = NonOpaqueStructTypes.find_as(
Key);
 
 1660  return I == NonOpaqueStructTypes.end() ? nullptr : *
I;
 
 
 1665    return OpaqueStructTypes.count(Ty);
 
 1666  auto I = NonOpaqueStructTypes.find(Ty);
 
 1667  return I == NonOpaqueStructTypes.end() ? 
false : *
I == Ty;
 
 
 1672  StructTypes.
run(M,  
false);
 
 1675      IdentifiedStructTypes.addOpaque(Ty);
 
 1677      IdentifiedStructTypes.addNonOpaque(Ty);
 
 1683    SharedMDs[MD].reset(const_cast<MDNode *>(MD));
 
 
 1695  IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes,
 
 1696                       std::move(Src), ValuesToLink, std::move(AddLazyFor),
 
 1697                       IsPerformingImport, NamedMDNodes);
 
 1698  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.
 
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