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/Optional.h" 160b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h" 170b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 180b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h" 190b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 200b57cec5SDimitry Andric #include "llvm/ADT/Twine.h" 210b57cec5SDimitry Andric #include "llvm/IR/Attributes.h" 220b57cec5SDimitry Andric #include "llvm/IR/Comdat.h" 230b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 240b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h" 250b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 260b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 270b57cec5SDimitry Andric #include "llvm/IR/Function.h" 280b57cec5SDimitry Andric #include "llvm/IR/GVMaterializer.h" 290b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h" 300b57cec5SDimitry Andric #include "llvm/IR/GlobalIFunc.h" 310b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 320b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 330b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 340b57cec5SDimitry Andric #include "llvm/IR/Metadata.h" 355ffd83dbSDimitry Andric #include "llvm/IR/ModuleSummaryIndex.h" 360b57cec5SDimitry Andric #include "llvm/IR/SymbolTableListTraits.h" 370b57cec5SDimitry Andric #include "llvm/IR/Type.h" 380b57cec5SDimitry Andric #include "llvm/IR/TypeFinder.h" 390b57cec5SDimitry Andric #include "llvm/IR/Value.h" 400b57cec5SDimitry Andric #include "llvm/IR/ValueSymbolTable.h" 410b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 420b57cec5SDimitry Andric #include "llvm/Support/CodeGen.h" 430b57cec5SDimitry Andric #include "llvm/Support/Error.h" 440b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 450b57cec5SDimitry Andric #include "llvm/Support/Path.h" 460b57cec5SDimitry Andric #include "llvm/Support/RandomNumberGenerator.h" 470b57cec5SDimitry Andric #include "llvm/Support/VersionTuple.h" 480b57cec5SDimitry Andric #include <algorithm> 490b57cec5SDimitry Andric #include <cassert> 500b57cec5SDimitry Andric #include <cstdint> 510b57cec5SDimitry Andric #include <memory> 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)), 74*81ad6265SDimitry 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) { 5990b57cec5SDimitry Andric addModuleFlag(ModFlagBehavior::Max, "PIC Level", PL); 6000b57cec5SDimitry Andric } 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andric PIELevel::Level Module::getPIELevel() const { 6030b57cec5SDimitry Andric auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level")); 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andric if (!Val) 6060b57cec5SDimitry Andric return PIELevel::Default; 6070b57cec5SDimitry Andric 6080b57cec5SDimitry Andric return static_cast<PIELevel::Level>( 6090b57cec5SDimitry Andric cast<ConstantInt>(Val->getValue())->getZExtValue()); 6100b57cec5SDimitry Andric } 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andric void Module::setPIELevel(PIELevel::Level PL) { 6130b57cec5SDimitry Andric addModuleFlag(ModFlagBehavior::Max, "PIE Level", PL); 6140b57cec5SDimitry Andric } 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andric Optional<CodeModel::Model> Module::getCodeModel() const { 6170b57cec5SDimitry Andric auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Code Model")); 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric if (!Val) 6200b57cec5SDimitry Andric return None; 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andric return static_cast<CodeModel::Model>( 6230b57cec5SDimitry Andric cast<ConstantInt>(Val->getValue())->getZExtValue()); 6240b57cec5SDimitry Andric } 6250b57cec5SDimitry Andric 6260b57cec5SDimitry Andric void Module::setCodeModel(CodeModel::Model CL) { 6270b57cec5SDimitry Andric // Linking object files with different code models is undefined behavior 6280b57cec5SDimitry Andric // because the compiler would have to generate additional code (to span 6290b57cec5SDimitry Andric // longer jumps) if a larger code model is used with a smaller one. 6300b57cec5SDimitry Andric // Therefore we will treat attempts to mix code models as an error. 6310b57cec5SDimitry Andric addModuleFlag(ModFlagBehavior::Error, "Code Model", CL); 6320b57cec5SDimitry Andric } 6330b57cec5SDimitry Andric 6340b57cec5SDimitry Andric void Module::setProfileSummary(Metadata *M, ProfileSummary::Kind Kind) { 6350b57cec5SDimitry Andric if (Kind == ProfileSummary::PSK_CSInstr) 6365ffd83dbSDimitry Andric setModuleFlag(ModFlagBehavior::Error, "CSProfileSummary", M); 6370b57cec5SDimitry Andric else 6385ffd83dbSDimitry Andric setModuleFlag(ModFlagBehavior::Error, "ProfileSummary", M); 6390b57cec5SDimitry Andric } 6400b57cec5SDimitry Andric 641e8d8bef9SDimitry Andric Metadata *Module::getProfileSummary(bool IsCS) const { 6420b57cec5SDimitry Andric return (IsCS ? getModuleFlag("CSProfileSummary") 6430b57cec5SDimitry Andric : getModuleFlag("ProfileSummary")); 6440b57cec5SDimitry Andric } 6450b57cec5SDimitry Andric 6465ffd83dbSDimitry Andric bool Module::getSemanticInterposition() const { 6475ffd83dbSDimitry Andric Metadata *MF = getModuleFlag("SemanticInterposition"); 6485ffd83dbSDimitry Andric 6495ffd83dbSDimitry Andric auto *Val = cast_or_null<ConstantAsMetadata>(MF); 6505ffd83dbSDimitry Andric if (!Val) 6515ffd83dbSDimitry Andric return false; 6525ffd83dbSDimitry Andric 6535ffd83dbSDimitry Andric return cast<ConstantInt>(Val->getValue())->getZExtValue(); 6545ffd83dbSDimitry Andric } 6555ffd83dbSDimitry Andric 6565ffd83dbSDimitry Andric void Module::setSemanticInterposition(bool SI) { 6575ffd83dbSDimitry Andric addModuleFlag(ModFlagBehavior::Error, "SemanticInterposition", SI); 6585ffd83dbSDimitry Andric } 6595ffd83dbSDimitry Andric 6600b57cec5SDimitry Andric void Module::setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB) { 6610b57cec5SDimitry Andric OwnedMemoryBuffer = std::move(MB); 6620b57cec5SDimitry Andric } 6630b57cec5SDimitry Andric 6640b57cec5SDimitry Andric bool Module::getRtLibUseGOT() const { 6650b57cec5SDimitry Andric auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("RtLibUseGOT")); 6660b57cec5SDimitry Andric return Val && (cast<ConstantInt>(Val->getValue())->getZExtValue() > 0); 6670b57cec5SDimitry Andric } 6680b57cec5SDimitry Andric 6690b57cec5SDimitry Andric void Module::setRtLibUseGOT() { 6700b57cec5SDimitry Andric addModuleFlag(ModFlagBehavior::Max, "RtLibUseGOT", 1); 6710b57cec5SDimitry Andric } 6720b57cec5SDimitry Andric 673*81ad6265SDimitry Andric UWTableKind Module::getUwtable() const { 674*81ad6265SDimitry Andric if (auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("uwtable"))) 675*81ad6265SDimitry Andric return UWTableKind(cast<ConstantInt>(Val->getValue())->getZExtValue()); 676*81ad6265SDimitry Andric return UWTableKind::None; 677fe6060f1SDimitry Andric } 678fe6060f1SDimitry Andric 679*81ad6265SDimitry Andric void Module::setUwtable(UWTableKind Kind) { 680*81ad6265SDimitry Andric addModuleFlag(ModFlagBehavior::Max, "uwtable", uint32_t(Kind)); 681*81ad6265SDimitry Andric } 682fe6060f1SDimitry Andric 683fe6060f1SDimitry Andric FramePointerKind Module::getFramePointer() const { 684fe6060f1SDimitry Andric auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("frame-pointer")); 685fe6060f1SDimitry Andric return static_cast<FramePointerKind>( 686fe6060f1SDimitry Andric Val ? cast<ConstantInt>(Val->getValue())->getZExtValue() : 0); 687fe6060f1SDimitry Andric } 688fe6060f1SDimitry Andric 689fe6060f1SDimitry Andric void Module::setFramePointer(FramePointerKind Kind) { 690fe6060f1SDimitry Andric addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast<int>(Kind)); 691fe6060f1SDimitry Andric } 692fe6060f1SDimitry Andric 693fe6060f1SDimitry Andric StringRef Module::getStackProtectorGuard() const { 694fe6060f1SDimitry Andric Metadata *MD = getModuleFlag("stack-protector-guard"); 695fe6060f1SDimitry Andric if (auto *MDS = dyn_cast_or_null<MDString>(MD)) 696fe6060f1SDimitry Andric return MDS->getString(); 697fe6060f1SDimitry Andric return {}; 698fe6060f1SDimitry Andric } 699fe6060f1SDimitry Andric 700fe6060f1SDimitry Andric void Module::setStackProtectorGuard(StringRef Kind) { 701fe6060f1SDimitry Andric MDString *ID = MDString::get(getContext(), Kind); 702fe6060f1SDimitry Andric addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard", ID); 703fe6060f1SDimitry Andric } 704fe6060f1SDimitry Andric 705fe6060f1SDimitry Andric StringRef Module::getStackProtectorGuardReg() const { 706fe6060f1SDimitry Andric Metadata *MD = getModuleFlag("stack-protector-guard-reg"); 707fe6060f1SDimitry Andric if (auto *MDS = dyn_cast_or_null<MDString>(MD)) 708fe6060f1SDimitry Andric return MDS->getString(); 709fe6060f1SDimitry Andric return {}; 710fe6060f1SDimitry Andric } 711fe6060f1SDimitry Andric 712fe6060f1SDimitry Andric void Module::setStackProtectorGuardReg(StringRef Reg) { 713fe6060f1SDimitry Andric MDString *ID = MDString::get(getContext(), Reg); 714fe6060f1SDimitry Andric addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-reg", ID); 715fe6060f1SDimitry Andric } 716fe6060f1SDimitry Andric 717fe6060f1SDimitry Andric int Module::getStackProtectorGuardOffset() const { 718fe6060f1SDimitry Andric Metadata *MD = getModuleFlag("stack-protector-guard-offset"); 719fe6060f1SDimitry Andric if (auto *CI = mdconst::dyn_extract_or_null<ConstantInt>(MD)) 720fe6060f1SDimitry Andric return CI->getSExtValue(); 721fe6060f1SDimitry Andric return INT_MAX; 722fe6060f1SDimitry Andric } 723fe6060f1SDimitry Andric 724fe6060f1SDimitry Andric void Module::setStackProtectorGuardOffset(int Offset) { 725fe6060f1SDimitry Andric addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-offset", Offset); 726fe6060f1SDimitry Andric } 727fe6060f1SDimitry Andric 728fe6060f1SDimitry Andric unsigned Module::getOverrideStackAlignment() const { 729fe6060f1SDimitry Andric Metadata *MD = getModuleFlag("override-stack-alignment"); 730fe6060f1SDimitry Andric if (auto *CI = mdconst::dyn_extract_or_null<ConstantInt>(MD)) 731fe6060f1SDimitry Andric return CI->getZExtValue(); 732fe6060f1SDimitry Andric return 0; 733fe6060f1SDimitry Andric } 734fe6060f1SDimitry Andric 735fe6060f1SDimitry Andric void Module::setOverrideStackAlignment(unsigned Align) { 736fe6060f1SDimitry Andric addModuleFlag(ModFlagBehavior::Error, "override-stack-alignment", Align); 737fe6060f1SDimitry Andric } 738fe6060f1SDimitry Andric 739*81ad6265SDimitry Andric static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name) { 7400b57cec5SDimitry Andric SmallVector<unsigned, 3> Entries; 7410b57cec5SDimitry Andric Entries.push_back(V.getMajor()); 7420b57cec5SDimitry Andric if (auto Minor = V.getMinor()) { 7430b57cec5SDimitry Andric Entries.push_back(*Minor); 7440b57cec5SDimitry Andric if (auto Subminor = V.getSubminor()) 7450b57cec5SDimitry Andric Entries.push_back(*Subminor); 7460b57cec5SDimitry Andric // Ignore the 'build' component as it can't be represented in the object 7470b57cec5SDimitry Andric // file. 7480b57cec5SDimitry Andric } 749*81ad6265SDimitry Andric M.addModuleFlag(Module::ModFlagBehavior::Warning, Name, 750*81ad6265SDimitry Andric ConstantDataArray::get(M.getContext(), Entries)); 751*81ad6265SDimitry Andric } 752*81ad6265SDimitry Andric 753*81ad6265SDimitry Andric void Module::setSDKVersion(const VersionTuple &V) { 754*81ad6265SDimitry Andric addSDKVersionMD(V, *this, "SDK Version"); 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric 7570eae32dcSDimitry Andric static VersionTuple getSDKVersionMD(Metadata *MD) { 7580eae32dcSDimitry Andric auto *CM = dyn_cast_or_null<ConstantAsMetadata>(MD); 7590b57cec5SDimitry Andric if (!CM) 7600b57cec5SDimitry Andric return {}; 7610b57cec5SDimitry Andric auto *Arr = dyn_cast_or_null<ConstantDataArray>(CM->getValue()); 7620b57cec5SDimitry Andric if (!Arr) 7630b57cec5SDimitry Andric return {}; 7640b57cec5SDimitry Andric auto getVersionComponent = [&](unsigned Index) -> Optional<unsigned> { 7650b57cec5SDimitry Andric if (Index >= Arr->getNumElements()) 7660b57cec5SDimitry Andric return None; 7670b57cec5SDimitry Andric return (unsigned)Arr->getElementAsInteger(Index); 7680b57cec5SDimitry Andric }; 7690b57cec5SDimitry Andric auto Major = getVersionComponent(0); 7700b57cec5SDimitry Andric if (!Major) 7710b57cec5SDimitry Andric return {}; 7720b57cec5SDimitry Andric VersionTuple Result = VersionTuple(*Major); 7730b57cec5SDimitry Andric if (auto Minor = getVersionComponent(1)) { 7740b57cec5SDimitry Andric Result = VersionTuple(*Major, *Minor); 7750b57cec5SDimitry Andric if (auto Subminor = getVersionComponent(2)) { 7760b57cec5SDimitry Andric Result = VersionTuple(*Major, *Minor, *Subminor); 7770b57cec5SDimitry Andric } 7780b57cec5SDimitry Andric } 7790b57cec5SDimitry Andric return Result; 7800b57cec5SDimitry Andric } 7810b57cec5SDimitry Andric 7820eae32dcSDimitry Andric VersionTuple Module::getSDKVersion() const { 7830eae32dcSDimitry Andric return getSDKVersionMD(getModuleFlag("SDK Version")); 7840eae32dcSDimitry Andric } 7850eae32dcSDimitry Andric 7860b57cec5SDimitry Andric GlobalVariable *llvm::collectUsedGlobalVariables( 787fe6060f1SDimitry Andric const Module &M, SmallVectorImpl<GlobalValue *> &Vec, bool CompilerUsed) { 7880b57cec5SDimitry Andric const char *Name = CompilerUsed ? "llvm.compiler.used" : "llvm.used"; 7890b57cec5SDimitry Andric GlobalVariable *GV = M.getGlobalVariable(Name); 7900b57cec5SDimitry Andric if (!GV || !GV->hasInitializer()) 7910b57cec5SDimitry Andric return GV; 7920b57cec5SDimitry Andric 7930b57cec5SDimitry Andric const ConstantArray *Init = cast<ConstantArray>(GV->getInitializer()); 7940b57cec5SDimitry Andric for (Value *Op : Init->operands()) { 7958bcb0991SDimitry Andric GlobalValue *G = cast<GlobalValue>(Op->stripPointerCasts()); 796fe6060f1SDimitry Andric Vec.push_back(G); 7970b57cec5SDimitry Andric } 7980b57cec5SDimitry Andric return GV; 7990b57cec5SDimitry Andric } 8005ffd83dbSDimitry Andric 8015ffd83dbSDimitry Andric void Module::setPartialSampleProfileRatio(const ModuleSummaryIndex &Index) { 8025ffd83dbSDimitry Andric if (auto *SummaryMD = getProfileSummary(/*IsCS*/ false)) { 8035ffd83dbSDimitry Andric std::unique_ptr<ProfileSummary> ProfileSummary( 8045ffd83dbSDimitry Andric ProfileSummary::getFromMD(SummaryMD)); 8055ffd83dbSDimitry Andric if (ProfileSummary) { 8065ffd83dbSDimitry Andric if (ProfileSummary->getKind() != ProfileSummary::PSK_Sample || 8075ffd83dbSDimitry Andric !ProfileSummary->isPartialProfile()) 8085ffd83dbSDimitry Andric return; 8095ffd83dbSDimitry Andric uint64_t BlockCount = Index.getBlockCount(); 8105ffd83dbSDimitry Andric uint32_t NumCounts = ProfileSummary->getNumCounts(); 8115ffd83dbSDimitry Andric if (!NumCounts) 8125ffd83dbSDimitry Andric return; 8135ffd83dbSDimitry Andric double Ratio = (double)BlockCount / NumCounts; 8145ffd83dbSDimitry Andric ProfileSummary->setPartialProfileRatio(Ratio); 8155ffd83dbSDimitry Andric setProfileSummary(ProfileSummary->getMD(getContext()), 8165ffd83dbSDimitry Andric ProfileSummary::PSK_Sample); 8175ffd83dbSDimitry Andric } 8185ffd83dbSDimitry Andric } 8195ffd83dbSDimitry Andric } 8200eae32dcSDimitry Andric 8210eae32dcSDimitry Andric StringRef Module::getDarwinTargetVariantTriple() const { 8220eae32dcSDimitry Andric if (const auto *MD = getModuleFlag("darwin.target_variant.triple")) 8230eae32dcSDimitry Andric return cast<MDString>(MD)->getString(); 8240eae32dcSDimitry Andric return ""; 8250eae32dcSDimitry Andric } 8260eae32dcSDimitry Andric 827*81ad6265SDimitry Andric void Module::setDarwinTargetVariantTriple(StringRef T) { 828*81ad6265SDimitry Andric addModuleFlag(ModFlagBehavior::Override, "darwin.target_variant.triple", 829*81ad6265SDimitry Andric MDString::get(getContext(), T)); 830*81ad6265SDimitry Andric } 831*81ad6265SDimitry Andric 8320eae32dcSDimitry Andric VersionTuple Module::getDarwinTargetVariantSDKVersion() const { 8330eae32dcSDimitry Andric return getSDKVersionMD(getModuleFlag("darwin.target_variant.SDK Version")); 8340eae32dcSDimitry Andric } 835*81ad6265SDimitry Andric 836*81ad6265SDimitry Andric void Module::setDarwinTargetVariantSDKVersion(VersionTuple Version) { 837*81ad6265SDimitry Andric addSDKVersionMD(Version, *this, "darwin.target_variant.SDK Version"); 838*81ad6265SDimitry Andric } 839