xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Module.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===- Module.cpp - Implement the Module class ----------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the Module class for the IR library.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "llvm/IR/Module.h"
140b57cec5SDimitry Andric #include "SymbolTableListTraitsImpl.h"
150b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
160b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
170b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h"
180b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
190b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
200b57cec5SDimitry Andric #include "llvm/IR/Attributes.h"
210b57cec5SDimitry Andric #include "llvm/IR/Comdat.h"
220b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
230b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
240b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
250b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h"
260b57cec5SDimitry Andric #include "llvm/IR/Function.h"
270b57cec5SDimitry Andric #include "llvm/IR/GVMaterializer.h"
280b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h"
290b57cec5SDimitry Andric #include "llvm/IR/GlobalIFunc.h"
300b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h"
310b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
320b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h"
330b57cec5SDimitry Andric #include "llvm/IR/Metadata.h"
345ffd83dbSDimitry Andric #include "llvm/IR/ModuleSummaryIndex.h"
350b57cec5SDimitry Andric #include "llvm/IR/SymbolTableListTraits.h"
360b57cec5SDimitry Andric #include "llvm/IR/Type.h"
370b57cec5SDimitry Andric #include "llvm/IR/TypeFinder.h"
380b57cec5SDimitry Andric #include "llvm/IR/Value.h"
390b57cec5SDimitry Andric #include "llvm/IR/ValueSymbolTable.h"
400b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
410b57cec5SDimitry Andric #include "llvm/Support/CodeGen.h"
420b57cec5SDimitry Andric #include "llvm/Support/Error.h"
430b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
440b57cec5SDimitry Andric #include "llvm/Support/Path.h"
450b57cec5SDimitry Andric #include "llvm/Support/RandomNumberGenerator.h"
460b57cec5SDimitry Andric #include "llvm/Support/VersionTuple.h"
470b57cec5SDimitry Andric #include <algorithm>
480b57cec5SDimitry Andric #include <cassert>
490b57cec5SDimitry Andric #include <cstdint>
500b57cec5SDimitry Andric #include <memory>
51*bdd1243dSDimitry Andric #include <optional>
520b57cec5SDimitry Andric #include <utility>
530b57cec5SDimitry Andric #include <vector>
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric using namespace llvm;
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
580b57cec5SDimitry Andric // Methods to implement the globals and functions lists.
590b57cec5SDimitry Andric //
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric // Explicit instantiations of SymbolTableListTraits since some of the methods
620b57cec5SDimitry Andric // are not in the public header file.
630b57cec5SDimitry Andric template class llvm::SymbolTableListTraits<Function>;
640b57cec5SDimitry Andric template class llvm::SymbolTableListTraits<GlobalVariable>;
650b57cec5SDimitry Andric template class llvm::SymbolTableListTraits<GlobalAlias>;
660b57cec5SDimitry Andric template class llvm::SymbolTableListTraits<GlobalIFunc>;
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
690b57cec5SDimitry Andric // Primitive Module methods.
700b57cec5SDimitry Andric //
710b57cec5SDimitry Andric 
720b57cec5SDimitry Andric Module::Module(StringRef MID, LLVMContext &C)
73fe6060f1SDimitry Andric     : Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
7481ad6265SDimitry Andric       ModuleID(std::string(MID)), SourceFileName(std::string(MID)), DL("") {
750b57cec5SDimitry Andric   Context.addModule(this);
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric Module::~Module() {
790b57cec5SDimitry Andric   Context.removeModule(this);
800b57cec5SDimitry Andric   dropAllReferences();
810b57cec5SDimitry Andric   GlobalList.clear();
820b57cec5SDimitry Andric   FunctionList.clear();
830b57cec5SDimitry Andric   AliasList.clear();
840b57cec5SDimitry Andric   IFuncList.clear();
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
875ffd83dbSDimitry Andric std::unique_ptr<RandomNumberGenerator>
885ffd83dbSDimitry Andric Module::createRNG(const StringRef Name) const {
895ffd83dbSDimitry Andric   SmallString<32> Salt(Name);
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric   // This RNG is guaranteed to produce the same random stream only
920b57cec5SDimitry Andric   // when the Module ID and thus the input filename is the same. This
930b57cec5SDimitry Andric   // might be problematic if the input filename extension changes
940b57cec5SDimitry Andric   // (e.g. from .c to .bc or .ll).
950b57cec5SDimitry Andric   //
960b57cec5SDimitry Andric   // We could store this salt in NamedMetadata, but this would make
970b57cec5SDimitry Andric   // the parameter non-const. This would unfortunately make this
980b57cec5SDimitry Andric   // interface unusable by any Machine passes, since they only have a
990b57cec5SDimitry Andric   // const reference to their IR Module. Alternatively we can always
1000b57cec5SDimitry Andric   // store salt metadata from the Module constructor.
1010b57cec5SDimitry Andric   Salt += sys::path::filename(getModuleIdentifier());
1020b57cec5SDimitry Andric 
1035ffd83dbSDimitry Andric   return std::unique_ptr<RandomNumberGenerator>(
1045ffd83dbSDimitry Andric       new RandomNumberGenerator(Salt));
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric /// getNamedValue - Return the first global value in the module with
1080b57cec5SDimitry Andric /// the specified name, of arbitrary type.  This method returns null
1090b57cec5SDimitry Andric /// if a global with the specified name is not found.
1100b57cec5SDimitry Andric GlobalValue *Module::getNamedValue(StringRef Name) const {
1110b57cec5SDimitry Andric   return cast_or_null<GlobalValue>(getValueSymbolTable().lookup(Name));
1120b57cec5SDimitry Andric }
1130b57cec5SDimitry Andric 
1146e75b2fbSDimitry Andric unsigned Module::getNumNamedValues() const {
1156e75b2fbSDimitry Andric   return getValueSymbolTable().size();
1166e75b2fbSDimitry Andric }
1176e75b2fbSDimitry Andric 
1180b57cec5SDimitry Andric /// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
1190b57cec5SDimitry Andric /// This ID is uniqued across modules in the current LLVMContext.
1200b57cec5SDimitry Andric unsigned Module::getMDKindID(StringRef Name) const {
1210b57cec5SDimitry Andric   return Context.getMDKindID(Name);
1220b57cec5SDimitry Andric }
1230b57cec5SDimitry Andric 
1240b57cec5SDimitry Andric /// getMDKindNames - Populate client supplied SmallVector with the name for
1250b57cec5SDimitry Andric /// custom metadata IDs registered in this LLVMContext.   ID #0 is not used,
1260b57cec5SDimitry Andric /// so it is filled in as an empty string.
1270b57cec5SDimitry Andric void Module::getMDKindNames(SmallVectorImpl<StringRef> &Result) const {
1280b57cec5SDimitry Andric   return Context.getMDKindNames(Result);
1290b57cec5SDimitry Andric }
1300b57cec5SDimitry Andric 
1310b57cec5SDimitry Andric void Module::getOperandBundleTags(SmallVectorImpl<StringRef> &Result) const {
1320b57cec5SDimitry Andric   return Context.getOperandBundleTags(Result);
1330b57cec5SDimitry Andric }
1340b57cec5SDimitry Andric 
1350b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1360b57cec5SDimitry Andric // Methods for easy access to the functions in the module.
1370b57cec5SDimitry Andric //
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric // getOrInsertFunction - Look up the specified function in the module symbol
1400b57cec5SDimitry Andric // table.  If it does not exist, add a prototype for the function and return
1410b57cec5SDimitry Andric // it.  This is nice because it allows most passes to get away with not handling
1420b57cec5SDimitry Andric // the symbol table directly for this common task.
1430b57cec5SDimitry Andric //
1440b57cec5SDimitry Andric FunctionCallee Module::getOrInsertFunction(StringRef Name, FunctionType *Ty,
1450b57cec5SDimitry Andric                                            AttributeList AttributeList) {
1460b57cec5SDimitry Andric   // See if we have a definition for the specified function already.
1470b57cec5SDimitry Andric   GlobalValue *F = getNamedValue(Name);
1480b57cec5SDimitry Andric   if (!F) {
1490b57cec5SDimitry Andric     // Nope, add it
1500b57cec5SDimitry Andric     Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage,
1510b57cec5SDimitry Andric                                      DL.getProgramAddressSpace(), Name);
1520b57cec5SDimitry Andric     if (!New->isIntrinsic())       // Intrinsics get attrs set on construction
1530b57cec5SDimitry Andric       New->setAttributes(AttributeList);
1540b57cec5SDimitry Andric     FunctionList.push_back(New);
1550b57cec5SDimitry Andric     return {Ty, New}; // Return the new prototype.
1560b57cec5SDimitry Andric   }
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   // If the function exists but has the wrong type, return a bitcast to the
1590b57cec5SDimitry Andric   // right type.
1600b57cec5SDimitry Andric   auto *PTy = PointerType::get(Ty, F->getAddressSpace());
1610b57cec5SDimitry Andric   if (F->getType() != PTy)
1620b57cec5SDimitry Andric     return {Ty, ConstantExpr::getBitCast(F, PTy)};
1630b57cec5SDimitry Andric 
1640b57cec5SDimitry Andric   // Otherwise, we just found the existing function or a prototype.
1650b57cec5SDimitry Andric   return {Ty, F};
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric FunctionCallee Module::getOrInsertFunction(StringRef Name, FunctionType *Ty) {
1690b57cec5SDimitry Andric   return getOrInsertFunction(Name, Ty, AttributeList());
1700b57cec5SDimitry Andric }
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric // getFunction - Look up the specified function in the module symbol table.
1730b57cec5SDimitry Andric // If it does not exist, return null.
1740b57cec5SDimitry Andric //
1750b57cec5SDimitry Andric Function *Module::getFunction(StringRef Name) const {
1760b57cec5SDimitry Andric   return dyn_cast_or_null<Function>(getNamedValue(Name));
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
1800b57cec5SDimitry Andric // Methods for easy access to the global variables in the module.
1810b57cec5SDimitry Andric //
1820b57cec5SDimitry Andric 
1830b57cec5SDimitry Andric /// getGlobalVariable - Look up the specified global variable in the module
1840b57cec5SDimitry Andric /// symbol table.  If it does not exist, return null.  The type argument
1850b57cec5SDimitry Andric /// should be the underlying type of the global, i.e., it should not have
1860b57cec5SDimitry Andric /// the top-level PointerType, which represents the address of the global.
1870b57cec5SDimitry Andric /// If AllowLocal is set to true, this function will return types that
1880b57cec5SDimitry Andric /// have an local. By default, these types are not returned.
1890b57cec5SDimitry Andric ///
1900b57cec5SDimitry Andric GlobalVariable *Module::getGlobalVariable(StringRef Name,
1910b57cec5SDimitry Andric                                           bool AllowLocal) const {
1920b57cec5SDimitry Andric   if (GlobalVariable *Result =
1930b57cec5SDimitry Andric       dyn_cast_or_null<GlobalVariable>(getNamedValue(Name)))
1940b57cec5SDimitry Andric     if (AllowLocal || !Result->hasLocalLinkage())
1950b57cec5SDimitry Andric       return Result;
1960b57cec5SDimitry Andric   return nullptr;
1970b57cec5SDimitry Andric }
1980b57cec5SDimitry Andric 
1990b57cec5SDimitry Andric /// getOrInsertGlobal - Look up the specified global in the module symbol table.
2000b57cec5SDimitry Andric ///   1. If it does not exist, add a declaration of the global and return it.
2010b57cec5SDimitry Andric ///   2. Else, the global exists but has the wrong type: return the function
2020b57cec5SDimitry Andric ///      with a constantexpr cast to the right type.
2030b57cec5SDimitry Andric ///   3. Finally, if the existing global is the correct declaration, return the
2040b57cec5SDimitry Andric ///      existing global.
2050b57cec5SDimitry Andric Constant *Module::getOrInsertGlobal(
2060b57cec5SDimitry Andric     StringRef Name, Type *Ty,
2070b57cec5SDimitry Andric     function_ref<GlobalVariable *()> CreateGlobalCallback) {
2080b57cec5SDimitry Andric   // See if we have a definition for the specified global already.
2090b57cec5SDimitry Andric   GlobalVariable *GV = dyn_cast_or_null<GlobalVariable>(getNamedValue(Name));
2100b57cec5SDimitry Andric   if (!GV)
2110b57cec5SDimitry Andric     GV = CreateGlobalCallback();
2120b57cec5SDimitry Andric   assert(GV && "The CreateGlobalCallback is expected to create a global");
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric   // If the variable exists but has the wrong type, return a bitcast to the
2150b57cec5SDimitry Andric   // right type.
2160b57cec5SDimitry Andric   Type *GVTy = GV->getType();
2170b57cec5SDimitry Andric   PointerType *PTy = PointerType::get(Ty, GVTy->getPointerAddressSpace());
2180b57cec5SDimitry Andric   if (GVTy != PTy)
2190b57cec5SDimitry Andric     return ConstantExpr::getBitCast(GV, PTy);
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric   // Otherwise, we just found the existing function or a prototype.
2220b57cec5SDimitry Andric   return GV;
2230b57cec5SDimitry Andric }
2240b57cec5SDimitry Andric 
2250b57cec5SDimitry Andric // Overload to construct a global variable using its constructor's defaults.
2260b57cec5SDimitry Andric Constant *Module::getOrInsertGlobal(StringRef Name, Type *Ty) {
2270b57cec5SDimitry Andric   return getOrInsertGlobal(Name, Ty, [&] {
2280b57cec5SDimitry Andric     return new GlobalVariable(*this, Ty, false, GlobalVariable::ExternalLinkage,
2290b57cec5SDimitry Andric                               nullptr, Name);
2300b57cec5SDimitry Andric   });
2310b57cec5SDimitry Andric }
2320b57cec5SDimitry Andric 
2330b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
2340b57cec5SDimitry Andric // Methods for easy access to the global variables in the module.
2350b57cec5SDimitry Andric //
2360b57cec5SDimitry Andric 
2370b57cec5SDimitry Andric // getNamedAlias - Look up the specified global in the module symbol table.
2380b57cec5SDimitry Andric // If it does not exist, return null.
2390b57cec5SDimitry Andric //
2400b57cec5SDimitry Andric GlobalAlias *Module::getNamedAlias(StringRef Name) const {
2410b57cec5SDimitry Andric   return dyn_cast_or_null<GlobalAlias>(getNamedValue(Name));
2420b57cec5SDimitry Andric }
2430b57cec5SDimitry Andric 
2440b57cec5SDimitry Andric GlobalIFunc *Module::getNamedIFunc(StringRef Name) const {
2450b57cec5SDimitry Andric   return dyn_cast_or_null<GlobalIFunc>(getNamedValue(Name));
2460b57cec5SDimitry Andric }
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric /// getNamedMetadata - Return the first NamedMDNode in the module with the
2490b57cec5SDimitry Andric /// specified name. This method returns null if a NamedMDNode with the
2500b57cec5SDimitry Andric /// specified name is not found.
2510b57cec5SDimitry Andric NamedMDNode *Module::getNamedMetadata(const Twine &Name) const {
2520b57cec5SDimitry Andric   SmallString<256> NameData;
2530b57cec5SDimitry Andric   StringRef NameRef = Name.toStringRef(NameData);
2545ffd83dbSDimitry Andric   return NamedMDSymTab.lookup(NameRef);
2550b57cec5SDimitry Andric }
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric /// getOrInsertNamedMetadata - Return the first named MDNode in the module
2580b57cec5SDimitry Andric /// with the specified name. This method returns a new NamedMDNode if a
2590b57cec5SDimitry Andric /// NamedMDNode with the specified name is not found.
2600b57cec5SDimitry Andric NamedMDNode *Module::getOrInsertNamedMetadata(StringRef Name) {
2615ffd83dbSDimitry Andric   NamedMDNode *&NMD = NamedMDSymTab[Name];
2620b57cec5SDimitry Andric   if (!NMD) {
2630b57cec5SDimitry Andric     NMD = new NamedMDNode(Name);
2640b57cec5SDimitry Andric     NMD->setParent(this);
2650b57cec5SDimitry Andric     NamedMDList.push_back(NMD);
2660b57cec5SDimitry Andric   }
2670b57cec5SDimitry Andric   return NMD;
2680b57cec5SDimitry Andric }
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric /// eraseNamedMetadata - Remove the given NamedMDNode from this module and
2710b57cec5SDimitry Andric /// delete it.
2720b57cec5SDimitry Andric void Module::eraseNamedMetadata(NamedMDNode *NMD) {
2735ffd83dbSDimitry Andric   NamedMDSymTab.erase(NMD->getName());
2740b57cec5SDimitry Andric   NamedMDList.erase(NMD->getIterator());
2750b57cec5SDimitry Andric }
2760b57cec5SDimitry Andric 
2770b57cec5SDimitry Andric bool Module::isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB) {
2780b57cec5SDimitry Andric   if (ConstantInt *Behavior = mdconst::dyn_extract_or_null<ConstantInt>(MD)) {
2790b57cec5SDimitry Andric     uint64_t Val = Behavior->getLimitedValue();
2800b57cec5SDimitry Andric     if (Val >= ModFlagBehaviorFirstVal && Val <= ModFlagBehaviorLastVal) {
2810b57cec5SDimitry Andric       MFB = static_cast<ModFlagBehavior>(Val);
2820b57cec5SDimitry Andric       return true;
2830b57cec5SDimitry Andric     }
2840b57cec5SDimitry Andric   }
2850b57cec5SDimitry Andric   return false;
2860b57cec5SDimitry Andric }
2870b57cec5SDimitry Andric 
2885ffd83dbSDimitry Andric bool Module::isValidModuleFlag(const MDNode &ModFlag, ModFlagBehavior &MFB,
2895ffd83dbSDimitry Andric                                MDString *&Key, Metadata *&Val) {
2905ffd83dbSDimitry Andric   if (ModFlag.getNumOperands() < 3)
2915ffd83dbSDimitry Andric     return false;
2925ffd83dbSDimitry Andric   if (!isValidModFlagBehavior(ModFlag.getOperand(0), MFB))
2935ffd83dbSDimitry Andric     return false;
2945ffd83dbSDimitry Andric   MDString *K = dyn_cast_or_null<MDString>(ModFlag.getOperand(1));
2955ffd83dbSDimitry Andric   if (!K)
2965ffd83dbSDimitry Andric     return false;
2975ffd83dbSDimitry Andric   Key = K;
2985ffd83dbSDimitry Andric   Val = ModFlag.getOperand(2);
2995ffd83dbSDimitry Andric   return true;
3005ffd83dbSDimitry Andric }
3015ffd83dbSDimitry Andric 
3020b57cec5SDimitry Andric /// getModuleFlagsMetadata - Returns the module flags in the provided vector.
3030b57cec5SDimitry Andric void Module::
3040b57cec5SDimitry Andric getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const {
3050b57cec5SDimitry Andric   const NamedMDNode *ModFlags = getModuleFlagsMetadata();
3060b57cec5SDimitry Andric   if (!ModFlags) return;
3070b57cec5SDimitry Andric 
3080b57cec5SDimitry Andric   for (const MDNode *Flag : ModFlags->operands()) {
3090b57cec5SDimitry Andric     ModFlagBehavior MFB;
3105ffd83dbSDimitry Andric     MDString *Key = nullptr;
3115ffd83dbSDimitry Andric     Metadata *Val = nullptr;
3125ffd83dbSDimitry Andric     if (isValidModuleFlag(*Flag, MFB, Key, Val)) {
3130b57cec5SDimitry Andric       // Check the operands of the MDNode before accessing the operands.
3140b57cec5SDimitry Andric       // The verifier will actually catch these failures.
3150b57cec5SDimitry Andric       Flags.push_back(ModuleFlagEntry(MFB, Key, Val));
3160b57cec5SDimitry Andric     }
3170b57cec5SDimitry Andric   }
3180b57cec5SDimitry Andric }
3190b57cec5SDimitry Andric 
3200b57cec5SDimitry Andric /// Return the corresponding value if Key appears in module flags, otherwise
3210b57cec5SDimitry Andric /// return null.
3220b57cec5SDimitry Andric Metadata *Module::getModuleFlag(StringRef Key) const {
3230b57cec5SDimitry Andric   SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags;
3240b57cec5SDimitry Andric   getModuleFlagsMetadata(ModuleFlags);
3250b57cec5SDimitry Andric   for (const ModuleFlagEntry &MFE : ModuleFlags) {
3260b57cec5SDimitry Andric     if (Key == MFE.Key->getString())
3270b57cec5SDimitry Andric       return MFE.Val;
3280b57cec5SDimitry Andric   }
3290b57cec5SDimitry Andric   return nullptr;
3300b57cec5SDimitry Andric }
3310b57cec5SDimitry Andric 
3320b57cec5SDimitry Andric /// getModuleFlagsMetadata - Returns the NamedMDNode in the module that
3330b57cec5SDimitry Andric /// represents module-level flags. This method returns null if there are no
3340b57cec5SDimitry Andric /// module-level flags.
3350b57cec5SDimitry Andric NamedMDNode *Module::getModuleFlagsMetadata() const {
3360b57cec5SDimitry Andric   return getNamedMetadata("llvm.module.flags");
3370b57cec5SDimitry Andric }
3380b57cec5SDimitry Andric 
3390b57cec5SDimitry Andric /// getOrInsertModuleFlagsMetadata - Returns the NamedMDNode in the module that
3400b57cec5SDimitry Andric /// represents module-level flags. If module-level flags aren't found, it
3410b57cec5SDimitry Andric /// creates the named metadata that contains them.
3420b57cec5SDimitry Andric NamedMDNode *Module::getOrInsertModuleFlagsMetadata() {
3430b57cec5SDimitry Andric   return getOrInsertNamedMetadata("llvm.module.flags");
3440b57cec5SDimitry Andric }
3450b57cec5SDimitry Andric 
3460b57cec5SDimitry Andric /// addModuleFlag - Add a module-level flag to the module-level flags
3470b57cec5SDimitry Andric /// metadata. It will create the module-level flags named metadata if it doesn't
3480b57cec5SDimitry Andric /// already exist.
3490b57cec5SDimitry Andric void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
3500b57cec5SDimitry Andric                            Metadata *Val) {
3510b57cec5SDimitry Andric   Type *Int32Ty = Type::getInt32Ty(Context);
3520b57cec5SDimitry Andric   Metadata *Ops[3] = {
3530b57cec5SDimitry Andric       ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Behavior)),
3540b57cec5SDimitry Andric       MDString::get(Context, Key), Val};
3550b57cec5SDimitry Andric   getOrInsertModuleFlagsMetadata()->addOperand(MDNode::get(Context, Ops));
3560b57cec5SDimitry Andric }
3570b57cec5SDimitry Andric void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
3580b57cec5SDimitry Andric                            Constant *Val) {
3590b57cec5SDimitry Andric   addModuleFlag(Behavior, Key, ConstantAsMetadata::get(Val));
3600b57cec5SDimitry Andric }
3610b57cec5SDimitry Andric void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
3620b57cec5SDimitry Andric                            uint32_t Val) {
3630b57cec5SDimitry Andric   Type *Int32Ty = Type::getInt32Ty(Context);
3640b57cec5SDimitry Andric   addModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val));
3650b57cec5SDimitry Andric }
3660b57cec5SDimitry Andric void Module::addModuleFlag(MDNode *Node) {
3670b57cec5SDimitry Andric   assert(Node->getNumOperands() == 3 &&
3680b57cec5SDimitry Andric          "Invalid number of operands for module flag!");
3690b57cec5SDimitry Andric   assert(mdconst::hasa<ConstantInt>(Node->getOperand(0)) &&
3700b57cec5SDimitry Andric          isa<MDString>(Node->getOperand(1)) &&
3710b57cec5SDimitry Andric          "Invalid operand types for module flag!");
3720b57cec5SDimitry Andric   getOrInsertModuleFlagsMetadata()->addOperand(Node);
3730b57cec5SDimitry Andric }
3740b57cec5SDimitry Andric 
3755ffd83dbSDimitry Andric void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
3765ffd83dbSDimitry Andric                            Metadata *Val) {
3775ffd83dbSDimitry Andric   NamedMDNode *ModFlags = getOrInsertModuleFlagsMetadata();
3785ffd83dbSDimitry Andric   // Replace the flag if it already exists.
3795ffd83dbSDimitry Andric   for (unsigned I = 0, E = ModFlags->getNumOperands(); I != E; ++I) {
3805ffd83dbSDimitry Andric     MDNode *Flag = ModFlags->getOperand(I);
3815ffd83dbSDimitry Andric     ModFlagBehavior MFB;
3825ffd83dbSDimitry Andric     MDString *K = nullptr;
3835ffd83dbSDimitry Andric     Metadata *V = nullptr;
3845ffd83dbSDimitry Andric     if (isValidModuleFlag(*Flag, MFB, K, V) && K->getString() == Key) {
3855ffd83dbSDimitry Andric       Flag->replaceOperandWith(2, Val);
3865ffd83dbSDimitry Andric       return;
3875ffd83dbSDimitry Andric     }
3885ffd83dbSDimitry Andric   }
3895ffd83dbSDimitry Andric   addModuleFlag(Behavior, Key, Val);
3905ffd83dbSDimitry Andric }
3915ffd83dbSDimitry Andric 
3920b57cec5SDimitry Andric void Module::setDataLayout(StringRef Desc) {
3930b57cec5SDimitry Andric   DL.reset(Desc);
3940b57cec5SDimitry Andric }
3950b57cec5SDimitry Andric 
3960b57cec5SDimitry Andric void Module::setDataLayout(const DataLayout &Other) { DL = Other; }
3970b57cec5SDimitry Andric 
3980b57cec5SDimitry Andric const DataLayout &Module::getDataLayout() const { return DL; }
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric DICompileUnit *Module::debug_compile_units_iterator::operator*() const {
4010b57cec5SDimitry Andric   return cast<DICompileUnit>(CUs->getOperand(Idx));
4020b57cec5SDimitry Andric }
4030b57cec5SDimitry Andric DICompileUnit *Module::debug_compile_units_iterator::operator->() const {
4040b57cec5SDimitry Andric   return cast<DICompileUnit>(CUs->getOperand(Idx));
4050b57cec5SDimitry Andric }
4060b57cec5SDimitry Andric 
4070b57cec5SDimitry Andric void Module::debug_compile_units_iterator::SkipNoDebugCUs() {
4080b57cec5SDimitry Andric   while (CUs && (Idx < CUs->getNumOperands()) &&
4090b57cec5SDimitry Andric          ((*this)->getEmissionKind() == DICompileUnit::NoDebug))
4100b57cec5SDimitry Andric     ++Idx;
4110b57cec5SDimitry Andric }
4120b57cec5SDimitry Andric 
413480093f4SDimitry Andric iterator_range<Module::global_object_iterator> Module::global_objects() {
414480093f4SDimitry Andric   return concat<GlobalObject>(functions(), globals());
415480093f4SDimitry Andric }
416480093f4SDimitry Andric iterator_range<Module::const_global_object_iterator>
417480093f4SDimitry Andric Module::global_objects() const {
418480093f4SDimitry Andric   return concat<const GlobalObject>(functions(), globals());
419480093f4SDimitry Andric }
420480093f4SDimitry Andric 
421480093f4SDimitry Andric iterator_range<Module::global_value_iterator> Module::global_values() {
422480093f4SDimitry Andric   return concat<GlobalValue>(functions(), globals(), aliases(), ifuncs());
423480093f4SDimitry Andric }
424480093f4SDimitry Andric iterator_range<Module::const_global_value_iterator>
425480093f4SDimitry Andric Module::global_values() const {
426480093f4SDimitry Andric   return concat<const GlobalValue>(functions(), globals(), aliases(), ifuncs());
427480093f4SDimitry Andric }
428480093f4SDimitry Andric 
4290b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4300b57cec5SDimitry Andric // Methods to control the materialization of GlobalValues in the Module.
4310b57cec5SDimitry Andric //
4320b57cec5SDimitry Andric void Module::setMaterializer(GVMaterializer *GVM) {
4330b57cec5SDimitry Andric   assert(!Materializer &&
4340b57cec5SDimitry Andric          "Module already has a GVMaterializer.  Call materializeAll"
4350b57cec5SDimitry Andric          " to clear it out before setting another one.");
4360b57cec5SDimitry Andric   Materializer.reset(GVM);
4370b57cec5SDimitry Andric }
4380b57cec5SDimitry Andric 
4390b57cec5SDimitry Andric Error Module::materialize(GlobalValue *GV) {
4400b57cec5SDimitry Andric   if (!Materializer)
4410b57cec5SDimitry Andric     return Error::success();
4420b57cec5SDimitry Andric 
4430b57cec5SDimitry Andric   return Materializer->materialize(GV);
4440b57cec5SDimitry Andric }
4450b57cec5SDimitry Andric 
4460b57cec5SDimitry Andric Error Module::materializeAll() {
4470b57cec5SDimitry Andric   if (!Materializer)
4480b57cec5SDimitry Andric     return Error::success();
4490b57cec5SDimitry Andric   std::unique_ptr<GVMaterializer> M = std::move(Materializer);
4500b57cec5SDimitry Andric   return M->materializeModule();
4510b57cec5SDimitry Andric }
4520b57cec5SDimitry Andric 
4530b57cec5SDimitry Andric Error Module::materializeMetadata() {
4540b57cec5SDimitry Andric   if (!Materializer)
4550b57cec5SDimitry Andric     return Error::success();
4560b57cec5SDimitry Andric   return Materializer->materializeMetadata();
4570b57cec5SDimitry Andric }
4580b57cec5SDimitry Andric 
4590b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
4600b57cec5SDimitry Andric // Other module related stuff.
4610b57cec5SDimitry Andric //
4620b57cec5SDimitry Andric 
4630b57cec5SDimitry Andric std::vector<StructType *> Module::getIdentifiedStructTypes() const {
4640b57cec5SDimitry Andric   // If we have a materializer, it is possible that some unread function
4650b57cec5SDimitry Andric   // uses a type that is currently not visible to a TypeFinder, so ask
4660b57cec5SDimitry Andric   // the materializer which types it created.
4670b57cec5SDimitry Andric   if (Materializer)
4680b57cec5SDimitry Andric     return Materializer->getIdentifiedStructTypes();
4690b57cec5SDimitry Andric 
4700b57cec5SDimitry Andric   std::vector<StructType *> Ret;
4710b57cec5SDimitry Andric   TypeFinder SrcStructTypes;
4720b57cec5SDimitry Andric   SrcStructTypes.run(*this, true);
4730b57cec5SDimitry Andric   Ret.assign(SrcStructTypes.begin(), SrcStructTypes.end());
4740b57cec5SDimitry Andric   return Ret;
4750b57cec5SDimitry Andric }
4760b57cec5SDimitry Andric 
477fe6060f1SDimitry Andric std::string Module::getUniqueIntrinsicName(StringRef BaseName, Intrinsic::ID Id,
478fe6060f1SDimitry Andric                                            const FunctionType *Proto) {
479fe6060f1SDimitry Andric   auto Encode = [&BaseName](unsigned Suffix) {
480fe6060f1SDimitry Andric     return (Twine(BaseName) + "." + Twine(Suffix)).str();
481fe6060f1SDimitry Andric   };
482fe6060f1SDimitry Andric 
483fe6060f1SDimitry Andric   {
484fe6060f1SDimitry Andric     // fast path - the prototype is already known
485fe6060f1SDimitry Andric     auto UinItInserted = UniquedIntrinsicNames.insert({{Id, Proto}, 0});
486fe6060f1SDimitry Andric     if (!UinItInserted.second)
487fe6060f1SDimitry Andric       return Encode(UinItInserted.first->second);
488fe6060f1SDimitry Andric   }
489fe6060f1SDimitry Andric 
490fe6060f1SDimitry Andric   // Not known yet. A new entry was created with index 0. Check if there already
491fe6060f1SDimitry Andric   // exists a matching declaration, or select a new entry.
492fe6060f1SDimitry Andric 
493fe6060f1SDimitry Andric   // Start looking for names with the current known maximum count (or 0).
494fe6060f1SDimitry Andric   auto NiidItInserted = CurrentIntrinsicIds.insert({BaseName, 0});
495fe6060f1SDimitry Andric   unsigned Count = NiidItInserted.first->second;
496fe6060f1SDimitry Andric 
497fe6060f1SDimitry Andric   // This might be slow if a whole population of intrinsics already existed, but
498fe6060f1SDimitry Andric   // we cache the values for later usage.
499fe6060f1SDimitry Andric   std::string NewName;
500fe6060f1SDimitry Andric   while (true) {
501fe6060f1SDimitry Andric     NewName = Encode(Count);
502fe6060f1SDimitry Andric     GlobalValue *F = getNamedValue(NewName);
503fe6060f1SDimitry Andric     if (!F) {
504fe6060f1SDimitry Andric       // Reserve this entry for the new proto
505fe6060f1SDimitry Andric       UniquedIntrinsicNames[{Id, Proto}] = Count;
506fe6060f1SDimitry Andric       break;
507fe6060f1SDimitry Andric     }
508fe6060f1SDimitry Andric 
509fe6060f1SDimitry Andric     // A declaration with this name already exists. Remember it.
510fe6060f1SDimitry Andric     FunctionType *FT = dyn_cast<FunctionType>(F->getValueType());
511fe6060f1SDimitry Andric     auto UinItInserted = UniquedIntrinsicNames.insert({{Id, FT}, Count});
512fe6060f1SDimitry Andric     if (FT == Proto) {
513fe6060f1SDimitry Andric       // It was a declaration for our prototype. This entry was allocated in the
514fe6060f1SDimitry Andric       // beginning. Update the count to match the existing declaration.
515fe6060f1SDimitry Andric       UinItInserted.first->second = Count;
516fe6060f1SDimitry Andric       break;
517fe6060f1SDimitry Andric     }
518fe6060f1SDimitry Andric 
519fe6060f1SDimitry Andric     ++Count;
520fe6060f1SDimitry Andric   }
521fe6060f1SDimitry Andric 
522fe6060f1SDimitry Andric   NiidItInserted.first->second = Count + 1;
523fe6060f1SDimitry Andric 
524fe6060f1SDimitry Andric   return NewName;
525fe6060f1SDimitry Andric }
526fe6060f1SDimitry Andric 
5270b57cec5SDimitry Andric // dropAllReferences() - This function causes all the subelements to "let go"
5280b57cec5SDimitry Andric // of all references that they are maintaining.  This allows one to 'delete' a
5290b57cec5SDimitry Andric // whole module at a time, even though there may be circular references... first
5300b57cec5SDimitry Andric // all references are dropped, and all use counts go to zero.  Then everything
5310b57cec5SDimitry Andric // is deleted for real.  Note that no operations are valid on an object that
5320b57cec5SDimitry Andric // has "dropped all references", except operator delete.
5330b57cec5SDimitry Andric //
5340b57cec5SDimitry Andric void Module::dropAllReferences() {
5350b57cec5SDimitry Andric   for (Function &F : *this)
5360b57cec5SDimitry Andric     F.dropAllReferences();
5370b57cec5SDimitry Andric 
5380b57cec5SDimitry Andric   for (GlobalVariable &GV : globals())
5390b57cec5SDimitry Andric     GV.dropAllReferences();
5400b57cec5SDimitry Andric 
5410b57cec5SDimitry Andric   for (GlobalAlias &GA : aliases())
5420b57cec5SDimitry Andric     GA.dropAllReferences();
5430b57cec5SDimitry Andric 
5440b57cec5SDimitry Andric   for (GlobalIFunc &GIF : ifuncs())
5450b57cec5SDimitry Andric     GIF.dropAllReferences();
5460b57cec5SDimitry Andric }
5470b57cec5SDimitry Andric 
5480b57cec5SDimitry Andric unsigned Module::getNumberRegisterParameters() const {
5490b57cec5SDimitry Andric   auto *Val =
5500b57cec5SDimitry Andric       cast_or_null<ConstantAsMetadata>(getModuleFlag("NumRegisterParameters"));
5510b57cec5SDimitry Andric   if (!Val)
5520b57cec5SDimitry Andric     return 0;
5530b57cec5SDimitry Andric   return cast<ConstantInt>(Val->getValue())->getZExtValue();
5540b57cec5SDimitry Andric }
5550b57cec5SDimitry Andric 
5560b57cec5SDimitry Andric unsigned Module::getDwarfVersion() const {
5570b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Dwarf Version"));
5580b57cec5SDimitry Andric   if (!Val)
5590b57cec5SDimitry Andric     return 0;
5600b57cec5SDimitry Andric   return cast<ConstantInt>(Val->getValue())->getZExtValue();
5610b57cec5SDimitry Andric }
5620b57cec5SDimitry Andric 
563fe6060f1SDimitry Andric bool Module::isDwarf64() const {
564fe6060f1SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("DWARF64"));
565fe6060f1SDimitry Andric   return Val && cast<ConstantInt>(Val->getValue())->isOne();
566fe6060f1SDimitry Andric }
567fe6060f1SDimitry Andric 
5680b57cec5SDimitry Andric unsigned Module::getCodeViewFlag() const {
5690b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("CodeView"));
5700b57cec5SDimitry Andric   if (!Val)
5710b57cec5SDimitry Andric     return 0;
5720b57cec5SDimitry Andric   return cast<ConstantInt>(Val->getValue())->getZExtValue();
5730b57cec5SDimitry Andric }
5740b57cec5SDimitry Andric 
575fe6060f1SDimitry Andric unsigned Module::getInstructionCount() const {
5760b57cec5SDimitry Andric   unsigned NumInstrs = 0;
577fe6060f1SDimitry Andric   for (const Function &F : FunctionList)
5780b57cec5SDimitry Andric     NumInstrs += F.getInstructionCount();
5790b57cec5SDimitry Andric   return NumInstrs;
5800b57cec5SDimitry Andric }
5810b57cec5SDimitry Andric 
5820b57cec5SDimitry Andric Comdat *Module::getOrInsertComdat(StringRef Name) {
5830b57cec5SDimitry Andric   auto &Entry = *ComdatSymTab.insert(std::make_pair(Name, Comdat())).first;
5840b57cec5SDimitry Andric   Entry.second.Name = &Entry;
5850b57cec5SDimitry Andric   return &Entry.second;
5860b57cec5SDimitry Andric }
5870b57cec5SDimitry Andric 
5880b57cec5SDimitry Andric PICLevel::Level Module::getPICLevel() const {
5890b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIC Level"));
5900b57cec5SDimitry Andric 
5910b57cec5SDimitry Andric   if (!Val)
5920b57cec5SDimitry Andric     return PICLevel::NotPIC;
5930b57cec5SDimitry Andric 
5940b57cec5SDimitry Andric   return static_cast<PICLevel::Level>(
5950b57cec5SDimitry Andric       cast<ConstantInt>(Val->getValue())->getZExtValue());
5960b57cec5SDimitry Andric }
5970b57cec5SDimitry Andric 
5980b57cec5SDimitry Andric void Module::setPICLevel(PICLevel::Level PL) {
599*bdd1243dSDimitry Andric   // The merge result of a non-PIC object and a PIC object can only be reliably
600*bdd1243dSDimitry Andric   // used as a non-PIC object, so use the Min merge behavior.
601*bdd1243dSDimitry Andric   addModuleFlag(ModFlagBehavior::Min, "PIC Level", PL);
6020b57cec5SDimitry Andric }
6030b57cec5SDimitry Andric 
6040b57cec5SDimitry Andric PIELevel::Level Module::getPIELevel() const {
6050b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level"));
6060b57cec5SDimitry Andric 
6070b57cec5SDimitry Andric   if (!Val)
6080b57cec5SDimitry Andric     return PIELevel::Default;
6090b57cec5SDimitry Andric 
6100b57cec5SDimitry Andric   return static_cast<PIELevel::Level>(
6110b57cec5SDimitry Andric       cast<ConstantInt>(Val->getValue())->getZExtValue());
6120b57cec5SDimitry Andric }
6130b57cec5SDimitry Andric 
6140b57cec5SDimitry Andric void Module::setPIELevel(PIELevel::Level PL) {
6150b57cec5SDimitry Andric   addModuleFlag(ModFlagBehavior::Max, "PIE Level", PL);
6160b57cec5SDimitry Andric }
6170b57cec5SDimitry Andric 
618*bdd1243dSDimitry Andric std::optional<CodeModel::Model> Module::getCodeModel() const {
6190b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Code Model"));
6200b57cec5SDimitry Andric 
6210b57cec5SDimitry Andric   if (!Val)
622*bdd1243dSDimitry Andric     return std::nullopt;
6230b57cec5SDimitry Andric 
6240b57cec5SDimitry Andric   return static_cast<CodeModel::Model>(
6250b57cec5SDimitry Andric       cast<ConstantInt>(Val->getValue())->getZExtValue());
6260b57cec5SDimitry Andric }
6270b57cec5SDimitry Andric 
6280b57cec5SDimitry Andric void Module::setCodeModel(CodeModel::Model CL) {
6290b57cec5SDimitry Andric   // Linking object files with different code models is undefined behavior
6300b57cec5SDimitry Andric   // because the compiler would have to generate additional code (to span
6310b57cec5SDimitry Andric   // longer jumps) if a larger code model is used with a smaller one.
6320b57cec5SDimitry Andric   // Therefore we will treat attempts to mix code models as an error.
6330b57cec5SDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "Code Model", CL);
6340b57cec5SDimitry Andric }
6350b57cec5SDimitry Andric 
6360b57cec5SDimitry Andric void Module::setProfileSummary(Metadata *M, ProfileSummary::Kind Kind) {
6370b57cec5SDimitry Andric   if (Kind == ProfileSummary::PSK_CSInstr)
6385ffd83dbSDimitry Andric     setModuleFlag(ModFlagBehavior::Error, "CSProfileSummary", M);
6390b57cec5SDimitry Andric   else
6405ffd83dbSDimitry Andric     setModuleFlag(ModFlagBehavior::Error, "ProfileSummary", M);
6410b57cec5SDimitry Andric }
6420b57cec5SDimitry Andric 
643e8d8bef9SDimitry Andric Metadata *Module::getProfileSummary(bool IsCS) const {
6440b57cec5SDimitry Andric   return (IsCS ? getModuleFlag("CSProfileSummary")
6450b57cec5SDimitry Andric                : getModuleFlag("ProfileSummary"));
6460b57cec5SDimitry Andric }
6470b57cec5SDimitry Andric 
6485ffd83dbSDimitry Andric bool Module::getSemanticInterposition() const {
6495ffd83dbSDimitry Andric   Metadata *MF = getModuleFlag("SemanticInterposition");
6505ffd83dbSDimitry Andric 
6515ffd83dbSDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(MF);
6525ffd83dbSDimitry Andric   if (!Val)
6535ffd83dbSDimitry Andric     return false;
6545ffd83dbSDimitry Andric 
6555ffd83dbSDimitry Andric   return cast<ConstantInt>(Val->getValue())->getZExtValue();
6565ffd83dbSDimitry Andric }
6575ffd83dbSDimitry Andric 
6585ffd83dbSDimitry Andric void Module::setSemanticInterposition(bool SI) {
6595ffd83dbSDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "SemanticInterposition", SI);
6605ffd83dbSDimitry Andric }
6615ffd83dbSDimitry Andric 
6620b57cec5SDimitry Andric void Module::setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB) {
6630b57cec5SDimitry Andric   OwnedMemoryBuffer = std::move(MB);
6640b57cec5SDimitry Andric }
6650b57cec5SDimitry Andric 
6660b57cec5SDimitry Andric bool Module::getRtLibUseGOT() const {
6670b57cec5SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("RtLibUseGOT"));
6680b57cec5SDimitry Andric   return Val && (cast<ConstantInt>(Val->getValue())->getZExtValue() > 0);
6690b57cec5SDimitry Andric }
6700b57cec5SDimitry Andric 
6710b57cec5SDimitry Andric void Module::setRtLibUseGOT() {
6720b57cec5SDimitry Andric   addModuleFlag(ModFlagBehavior::Max, "RtLibUseGOT", 1);
6730b57cec5SDimitry Andric }
6740b57cec5SDimitry Andric 
67581ad6265SDimitry Andric UWTableKind Module::getUwtable() const {
67681ad6265SDimitry Andric   if (auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("uwtable")))
67781ad6265SDimitry Andric     return UWTableKind(cast<ConstantInt>(Val->getValue())->getZExtValue());
67881ad6265SDimitry Andric   return UWTableKind::None;
679fe6060f1SDimitry Andric }
680fe6060f1SDimitry Andric 
68181ad6265SDimitry Andric void Module::setUwtable(UWTableKind Kind) {
68281ad6265SDimitry Andric   addModuleFlag(ModFlagBehavior::Max, "uwtable", uint32_t(Kind));
68381ad6265SDimitry Andric }
684fe6060f1SDimitry Andric 
685fe6060f1SDimitry Andric FramePointerKind Module::getFramePointer() const {
686fe6060f1SDimitry Andric   auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("frame-pointer"));
687fe6060f1SDimitry Andric   return static_cast<FramePointerKind>(
688fe6060f1SDimitry Andric       Val ? cast<ConstantInt>(Val->getValue())->getZExtValue() : 0);
689fe6060f1SDimitry Andric }
690fe6060f1SDimitry Andric 
691fe6060f1SDimitry Andric void Module::setFramePointer(FramePointerKind Kind) {
692fe6060f1SDimitry Andric   addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast<int>(Kind));
693fe6060f1SDimitry Andric }
694fe6060f1SDimitry Andric 
695fe6060f1SDimitry Andric StringRef Module::getStackProtectorGuard() const {
696fe6060f1SDimitry Andric   Metadata *MD = getModuleFlag("stack-protector-guard");
697fe6060f1SDimitry Andric   if (auto *MDS = dyn_cast_or_null<MDString>(MD))
698fe6060f1SDimitry Andric     return MDS->getString();
699fe6060f1SDimitry Andric   return {};
700fe6060f1SDimitry Andric }
701fe6060f1SDimitry Andric 
702fe6060f1SDimitry Andric void Module::setStackProtectorGuard(StringRef Kind) {
703fe6060f1SDimitry Andric   MDString *ID = MDString::get(getContext(), Kind);
704fe6060f1SDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard", ID);
705fe6060f1SDimitry Andric }
706fe6060f1SDimitry Andric 
707fe6060f1SDimitry Andric StringRef Module::getStackProtectorGuardReg() const {
708fe6060f1SDimitry Andric   Metadata *MD = getModuleFlag("stack-protector-guard-reg");
709fe6060f1SDimitry Andric   if (auto *MDS = dyn_cast_or_null<MDString>(MD))
710fe6060f1SDimitry Andric     return MDS->getString();
711fe6060f1SDimitry Andric   return {};
712fe6060f1SDimitry Andric }
713fe6060f1SDimitry Andric 
714fe6060f1SDimitry Andric void Module::setStackProtectorGuardReg(StringRef Reg) {
715fe6060f1SDimitry Andric   MDString *ID = MDString::get(getContext(), Reg);
716fe6060f1SDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-reg", ID);
717fe6060f1SDimitry Andric }
718fe6060f1SDimitry Andric 
719753f127fSDimitry Andric StringRef Module::getStackProtectorGuardSymbol() const {
720753f127fSDimitry Andric   Metadata *MD = getModuleFlag("stack-protector-guard-symbol");
721753f127fSDimitry Andric   if (auto *MDS = dyn_cast_or_null<MDString>(MD))
722753f127fSDimitry Andric     return MDS->getString();
723753f127fSDimitry Andric   return {};
724753f127fSDimitry Andric }
725753f127fSDimitry Andric 
726753f127fSDimitry Andric void Module::setStackProtectorGuardSymbol(StringRef Symbol) {
727753f127fSDimitry Andric   MDString *ID = MDString::get(getContext(), Symbol);
728753f127fSDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-symbol", ID);
729753f127fSDimitry Andric }
730753f127fSDimitry Andric 
731fe6060f1SDimitry Andric int Module::getStackProtectorGuardOffset() const {
732fe6060f1SDimitry Andric   Metadata *MD = getModuleFlag("stack-protector-guard-offset");
733fe6060f1SDimitry Andric   if (auto *CI = mdconst::dyn_extract_or_null<ConstantInt>(MD))
734fe6060f1SDimitry Andric     return CI->getSExtValue();
735fe6060f1SDimitry Andric   return INT_MAX;
736fe6060f1SDimitry Andric }
737fe6060f1SDimitry Andric 
738fe6060f1SDimitry Andric void Module::setStackProtectorGuardOffset(int Offset) {
739fe6060f1SDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-offset", Offset);
740fe6060f1SDimitry Andric }
741fe6060f1SDimitry Andric 
742fe6060f1SDimitry Andric unsigned Module::getOverrideStackAlignment() const {
743fe6060f1SDimitry Andric   Metadata *MD = getModuleFlag("override-stack-alignment");
744fe6060f1SDimitry Andric   if (auto *CI = mdconst::dyn_extract_or_null<ConstantInt>(MD))
745fe6060f1SDimitry Andric     return CI->getZExtValue();
746fe6060f1SDimitry Andric   return 0;
747fe6060f1SDimitry Andric }
748fe6060f1SDimitry Andric 
749fe6060f1SDimitry Andric void Module::setOverrideStackAlignment(unsigned Align) {
750fe6060f1SDimitry Andric   addModuleFlag(ModFlagBehavior::Error, "override-stack-alignment", Align);
751fe6060f1SDimitry Andric }
752fe6060f1SDimitry Andric 
75381ad6265SDimitry Andric static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name) {
7540b57cec5SDimitry Andric   SmallVector<unsigned, 3> Entries;
7550b57cec5SDimitry Andric   Entries.push_back(V.getMajor());
7560b57cec5SDimitry Andric   if (auto Minor = V.getMinor()) {
7570b57cec5SDimitry Andric     Entries.push_back(*Minor);
7580b57cec5SDimitry Andric     if (auto Subminor = V.getSubminor())
7590b57cec5SDimitry Andric       Entries.push_back(*Subminor);
7600b57cec5SDimitry Andric     // Ignore the 'build' component as it can't be represented in the object
7610b57cec5SDimitry Andric     // file.
7620b57cec5SDimitry Andric   }
76381ad6265SDimitry Andric   M.addModuleFlag(Module::ModFlagBehavior::Warning, Name,
76481ad6265SDimitry Andric                   ConstantDataArray::get(M.getContext(), Entries));
76581ad6265SDimitry Andric }
76681ad6265SDimitry Andric 
76781ad6265SDimitry Andric void Module::setSDKVersion(const VersionTuple &V) {
76881ad6265SDimitry Andric   addSDKVersionMD(V, *this, "SDK Version");
7690b57cec5SDimitry Andric }
7700b57cec5SDimitry Andric 
7710eae32dcSDimitry Andric static VersionTuple getSDKVersionMD(Metadata *MD) {
7720eae32dcSDimitry Andric   auto *CM = dyn_cast_or_null<ConstantAsMetadata>(MD);
7730b57cec5SDimitry Andric   if (!CM)
7740b57cec5SDimitry Andric     return {};
7750b57cec5SDimitry Andric   auto *Arr = dyn_cast_or_null<ConstantDataArray>(CM->getValue());
7760b57cec5SDimitry Andric   if (!Arr)
7770b57cec5SDimitry Andric     return {};
778*bdd1243dSDimitry Andric   auto getVersionComponent = [&](unsigned Index) -> std::optional<unsigned> {
7790b57cec5SDimitry Andric     if (Index >= Arr->getNumElements())
780*bdd1243dSDimitry Andric       return std::nullopt;
7810b57cec5SDimitry Andric     return (unsigned)Arr->getElementAsInteger(Index);
7820b57cec5SDimitry Andric   };
7830b57cec5SDimitry Andric   auto Major = getVersionComponent(0);
7840b57cec5SDimitry Andric   if (!Major)
7850b57cec5SDimitry Andric     return {};
7860b57cec5SDimitry Andric   VersionTuple Result = VersionTuple(*Major);
7870b57cec5SDimitry Andric   if (auto Minor = getVersionComponent(1)) {
7880b57cec5SDimitry Andric     Result = VersionTuple(*Major, *Minor);
7890b57cec5SDimitry Andric     if (auto Subminor = getVersionComponent(2)) {
7900b57cec5SDimitry Andric       Result = VersionTuple(*Major, *Minor, *Subminor);
7910b57cec5SDimitry Andric     }
7920b57cec5SDimitry Andric   }
7930b57cec5SDimitry Andric   return Result;
7940b57cec5SDimitry Andric }
7950b57cec5SDimitry Andric 
7960eae32dcSDimitry Andric VersionTuple Module::getSDKVersion() const {
7970eae32dcSDimitry Andric   return getSDKVersionMD(getModuleFlag("SDK Version"));
7980eae32dcSDimitry Andric }
7990eae32dcSDimitry Andric 
8000b57cec5SDimitry Andric GlobalVariable *llvm::collectUsedGlobalVariables(
801fe6060f1SDimitry Andric     const Module &M, SmallVectorImpl<GlobalValue *> &Vec, bool CompilerUsed) {
8020b57cec5SDimitry Andric   const char *Name = CompilerUsed ? "llvm.compiler.used" : "llvm.used";
8030b57cec5SDimitry Andric   GlobalVariable *GV = M.getGlobalVariable(Name);
8040b57cec5SDimitry Andric   if (!GV || !GV->hasInitializer())
8050b57cec5SDimitry Andric     return GV;
8060b57cec5SDimitry Andric 
8070b57cec5SDimitry Andric   const ConstantArray *Init = cast<ConstantArray>(GV->getInitializer());
8080b57cec5SDimitry Andric   for (Value *Op : Init->operands()) {
8098bcb0991SDimitry Andric     GlobalValue *G = cast<GlobalValue>(Op->stripPointerCasts());
810fe6060f1SDimitry Andric     Vec.push_back(G);
8110b57cec5SDimitry Andric   }
8120b57cec5SDimitry Andric   return GV;
8130b57cec5SDimitry Andric }
8145ffd83dbSDimitry Andric 
8155ffd83dbSDimitry Andric void Module::setPartialSampleProfileRatio(const ModuleSummaryIndex &Index) {
8165ffd83dbSDimitry Andric   if (auto *SummaryMD = getProfileSummary(/*IsCS*/ false)) {
8175ffd83dbSDimitry Andric     std::unique_ptr<ProfileSummary> ProfileSummary(
8185ffd83dbSDimitry Andric         ProfileSummary::getFromMD(SummaryMD));
8195ffd83dbSDimitry Andric     if (ProfileSummary) {
8205ffd83dbSDimitry Andric       if (ProfileSummary->getKind() != ProfileSummary::PSK_Sample ||
8215ffd83dbSDimitry Andric           !ProfileSummary->isPartialProfile())
8225ffd83dbSDimitry Andric         return;
8235ffd83dbSDimitry Andric       uint64_t BlockCount = Index.getBlockCount();
8245ffd83dbSDimitry Andric       uint32_t NumCounts = ProfileSummary->getNumCounts();
8255ffd83dbSDimitry Andric       if (!NumCounts)
8265ffd83dbSDimitry Andric         return;
8275ffd83dbSDimitry Andric       double Ratio = (double)BlockCount / NumCounts;
8285ffd83dbSDimitry Andric       ProfileSummary->setPartialProfileRatio(Ratio);
8295ffd83dbSDimitry Andric       setProfileSummary(ProfileSummary->getMD(getContext()),
8305ffd83dbSDimitry Andric                         ProfileSummary::PSK_Sample);
8315ffd83dbSDimitry Andric     }
8325ffd83dbSDimitry Andric   }
8335ffd83dbSDimitry Andric }
8340eae32dcSDimitry Andric 
8350eae32dcSDimitry Andric StringRef Module::getDarwinTargetVariantTriple() const {
8360eae32dcSDimitry Andric   if (const auto *MD = getModuleFlag("darwin.target_variant.triple"))
8370eae32dcSDimitry Andric     return cast<MDString>(MD)->getString();
8380eae32dcSDimitry Andric   return "";
8390eae32dcSDimitry Andric }
8400eae32dcSDimitry Andric 
84181ad6265SDimitry Andric void Module::setDarwinTargetVariantTriple(StringRef T) {
84281ad6265SDimitry Andric   addModuleFlag(ModFlagBehavior::Override, "darwin.target_variant.triple",
84381ad6265SDimitry Andric                 MDString::get(getContext(), T));
84481ad6265SDimitry Andric }
84581ad6265SDimitry Andric 
8460eae32dcSDimitry Andric VersionTuple Module::getDarwinTargetVariantSDKVersion() const {
8470eae32dcSDimitry Andric   return getSDKVersionMD(getModuleFlag("darwin.target_variant.SDK Version"));
8480eae32dcSDimitry Andric }
84981ad6265SDimitry Andric 
85081ad6265SDimitry Andric void Module::setDarwinTargetVariantSDKVersion(VersionTuple Version) {
85181ad6265SDimitry Andric   addSDKVersionMD(Version, *this, "darwin.target_variant.SDK Version");
85281ad6265SDimitry Andric }
853