1cf3056db0fee1db7921214b1f25cea04e959e105Chris Lattner//===-- Module.cpp - Implement the Module class ---------------------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 10c2c50cdcdc19a1bca993c06d13d8cdca87083ce4Chandler Carruth// This file implements the Module class for the IR library. 11009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "SymbolTableListTraitsImpl.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/DenseSet.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/STLExtras.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallString.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/GVMaterializer.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InstrTypes.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LeakDetector.h" 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/Dwarf.h" 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/Path.h" 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/RandomNumberGenerator.h" 297e70829632f82de15db187845666aaca6e04b792Chris Lattner#include <algorithm> 300ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner#include <cstdarg> 311d8b8535ec6ccbf07b0e83c5be6aec51feed1d45Owen Anderson#include <cstdlib> 3231f8499e83dc4dccbb57ea7e76d1fd49b7010d0cChris Lattnerusing namespace llvm; 33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3460837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 35af76cfb0fb70f0bec8581c2be1a60dc56bd3f285Misha Brukman// Methods to implement the globals and functions lists. 3660837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// 3760837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 387e70829632f82de15db187845666aaca6e04b792Chris Lattner// Explicit instantiations of SymbolTableListTraits since some of the methods 39cc041ba03aed685400197fb938b7a583713d25afChris Lattner// are not in the public header file. 40c63ca0a71b299ee0b8fc7dc8405d7f3c856ecfa3John McCalltemplate class llvm::SymbolTableListTraits<Function, Module>; 4153b2b7364385b2f2d98c0052df73a637a81c2288Nick Lewyckytemplate class llvm::SymbolTableListTraits<GlobalVariable, Module>; 42c63ca0a71b299ee0b8fc7dc8405d7f3c856ecfa3John McCalltemplate class llvm::SymbolTableListTraits<GlobalAlias, Module>; 43009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 4460837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 4560837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// Primitive Module methods. 4660837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// 47dd6dfbc8cc008faca03b6ac9b904f263205a418aChris Lattner 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModule::Module(StringRef MID, LLVMContext &C) 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : Context(C), Materializer(), ModuleID(MID), RNG(nullptr), DL("") { 50ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer ValSymTab = new ValueSymbolTable(); 5117aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NamedMDSymTab = new StringMap<NamedMDNode *>(); 5230268be89df6444f5ffb585439b3fbfec9055197Owen Anderson Context.addModule(this); 53009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 54009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 55009505452b713ed2e3a8e99c5545a6e721c65495Chris LattnerModule::~Module() { 5630268be89df6444f5ffb585439b3fbfec9055197Owen Anderson Context.removeModule(this); 57009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner dropAllReferences(); 587e70829632f82de15db187845666aaca6e04b792Chris Lattner GlobalList.clear(); 597e70829632f82de15db187845666aaca6e04b792Chris Lattner FunctionList.clear(); 608b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov AliasList.clear(); 6128bc9d88260a3e153ead4311c9129e3d3ad07736Devang Patel NamedMDList.clear(); 6278d033e086e19e016273de014f9214aa6f3f844bReid Spencer delete ValSymTab; 6317aa92c92a925b4a674440c7ef088c223990e854Dan Gohman delete static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab); 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines delete RNG; 65009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 66009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 67f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar/// getNamedValue - Return the first global value in the module with 68f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar/// the specified name, of arbitrary type. This method returns null 69f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar/// if a global with the specified name is not found. 702928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarGlobalValue *Module::getNamedValue(StringRef Name) const { 71f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar return cast_or_null<GlobalValue>(getValueSymbolTable().lookup(Name)); 72f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar} 73f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar 74081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// getMDKindID - Return a unique non-zero ID for the specified metadata kind. 75081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// This ID is uniqued across modules in the current LLVMContext. 76081134741b40b342fb2f85722c9cea5d412489a8Chris Lattnerunsigned Module::getMDKindID(StringRef Name) const { 77081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner return Context.getMDKindID(Name); 78081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner} 79081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 80081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// getMDKindNames - Populate client supplied SmallVector with the name for 81081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// custom metadata IDs registered in this LLVMContext. ID #0 is not used, 82081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner/// so it is filled in as an empty string. 83081134741b40b342fb2f85722c9cea5d412489a8Chris Lattnervoid Module::getMDKindNames(SmallVectorImpl<StringRef> &Result) const { 84081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner return Context.getMDKindNames(Result); 85081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner} 86081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 87081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner 8860837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 8960837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// Methods for easy access to the functions in the module. 9060837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// 9160837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 92ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer// getOrInsertFunction - Look up the specified function in the module symbol 93ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer// table. If it does not exist, add a prototype for the function and return 94ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer// it. This is nice because it allows most passes to get away with not handling 95ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer// the symbol table directly for this common task. 96ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer// 972928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarConstant *Module::getOrInsertFunction(StringRef Name, 98db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *Ty, 9999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet AttributeList) { 100ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer // See if we have a definition for the specified function already. 101f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar GlobalValue *F = getNamedValue(Name); 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!F) { 103ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer // Nope, add it 104051a950000e21935165db56695e35bade668193bGabor Greif Function *New = Function::Create(Ty, GlobalVariable::ExternalLinkage, Name); 1051186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky if (!New->isIntrinsic()) // Intrinsics get attrs set on construction 1061186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky New->setAttributes(AttributeList); 1076056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner FunctionList.push_back(New); 10870d130516a38013ef6262dd2da5accbea7932e30Chris Lattner return New; // Return the new prototype. 10970d130516a38013ef6262dd2da5accbea7932e30Chris Lattner } 11070d130516a38013ef6262dd2da5accbea7932e30Chris Lattner 11170d130516a38013ef6262dd2da5accbea7932e30Chris Lattner // If the function exists but has the wrong type, return a bitcast to the 11270d130516a38013ef6262dd2da5accbea7932e30Chris Lattner // right type. 113debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson if (F->getType() != PointerType::getUnqual(Ty)) 114debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson return ConstantExpr::getBitCast(F, PointerType::getUnqual(Ty)); 11585d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling 11670d130516a38013ef6262dd2da5accbea7932e30Chris Lattner // Otherwise, we just found the existing function or a prototype. 11785d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling return F; 1186056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner} 1196056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner 1202928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarConstant *Module::getOrInsertFunction(StringRef Name, 121db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *Ty) { 12299faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling return getOrInsertFunction(Name, Ty, AttributeSet()); 1231186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky} 1241186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky 1250ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner// getOrInsertFunction - Look up the specified function in the module symbol 1260ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner// table. If it does not exist, add a prototype for the function and return it. 1270ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner// This version of the method takes a null terminated list of function 1280ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner// arguments, which makes it easier for clients to use. 1290ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner// 1302928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarConstant *Module::getOrInsertFunction(StringRef Name, 13199faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet AttributeList, 132db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy, ...) { 1330ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner va_list Args; 1340ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner va_start(Args, RetTy); 1350ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner 1360ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner // Build the list of argument types... 1375fdd6c8793462549e3593890ec61573da06e3346Jay Foad std::vector<Type*> ArgTys; 1385fdd6c8793462549e3593890ec61573da06e3346Jay Foad while (Type *ArgTy = va_arg(Args, Type*)) 1390ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner ArgTys.push_back(ArgTy); 1400ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner 1410ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner va_end(Args); 1420ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner 1430ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner // Build the function type and chain to the other getOrInsertFunction... 144c341f1c62d1b46b64fb70890fffed87a3136cc2dOwen Anderson return getOrInsertFunction(Name, 145debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson FunctionType::get(RetTy, ArgTys, false), 1461186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky AttributeList); 1470ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner} 1480ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner 1492928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarConstant *Module::getOrInsertFunction(StringRef Name, 150db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy, ...) { 1511186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky va_list Args; 1521186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky va_start(Args, RetTy); 1531186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky 1541186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky // Build the list of argument types... 1555fdd6c8793462549e3593890ec61573da06e3346Jay Foad std::vector<Type*> ArgTys; 1565fdd6c8793462549e3593890ec61573da06e3346Jay Foad while (Type *ArgTy = va_arg(Args, Type*)) 1571186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky ArgTys.push_back(ArgTy); 1581186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky 1591186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky va_end(Args); 1601186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky 1611186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky // Build the function type and chain to the other getOrInsertFunction... 16285d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling return getOrInsertFunction(Name, 163debcb01b0f0a15f568ca69e8f288fade4bfc7297Owen Anderson FunctionType::get(RetTy, ArgTys, false), 16499faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet()); 1651186bf1350145474bb7f0ab4d38ec33dae5c79d2Nick Lewycky} 1660ae8e87e53d6f500f8d01785b67c68e2046fb8e8Chris Lattner 1676056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner// getFunction - Look up the specified function in the module symbol table. 1686056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner// If it does not exist, return null. 1696056c49ca0e86e222b4bd7184a4b23c9277ab065Chris Lattner// 1702928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarFunction *Module::getFunction(StringRef Name) const { 171f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar return dyn_cast_or_null<Function>(getNamedValue(Name)); 172bb0e2487185e401c7fca63d55e59343e060912a2Chris Lattner} 173bb0e2487185e401c7fca63d55e59343e060912a2Chris Lattner 17460837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 17560837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// Methods for easy access to the global variables in the module. 17660837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// 17760837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 17860837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner/// getGlobalVariable - Look up the specified global variable in the module 17930614675f45809c43d44c7243d8b747b39403155Chris Lattner/// symbol table. If it does not exist, return null. The type argument 18030614675f45809c43d44c7243d8b747b39403155Chris Lattner/// should be the underlying type of the global, i.e., it should not have 18130614675f45809c43d44c7243d8b747b39403155Chris Lattner/// the top-level PointerType, which represents the address of the global. 182bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola/// If AllowLocal is set to true, this function will return types that 183bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola/// have an local. By default, these types are not returned. 18460837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner/// 1852d680824e3a5272e386aa6c1d2a66676de7899fdRafael EspindolaGlobalVariable *Module::getGlobalVariable(StringRef Name, bool AllowLocal) { 18685d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling if (GlobalVariable *Result = 187f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar dyn_cast_or_null<GlobalVariable>(getNamedValue(Name))) 188f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar if (AllowLocal || !Result->hasLocalLinkage()) 18960837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner return Result; 190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 19160837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner} 19260837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 193b4b130f0b10184efd34f76c0287943b02da5688bBill Wendling/// getOrInsertGlobal - Look up the specified global in the module symbol table. 194b4b130f0b10184efd34f76c0287943b02da5688bBill Wendling/// 1. If it does not exist, add a declaration of the global and return it. 195b4b130f0b10184efd34f76c0287943b02da5688bBill Wendling/// 2. Else, the global exists but has the wrong type: return the function 196b4b130f0b10184efd34f76c0287943b02da5688bBill Wendling/// with a constantexpr cast to the right type. 197f625c14487e59aaa7d6c7e548be654de949ecec8Matt Arsenault/// 3. Finally, if the existing global is the correct declaration, return the 198b4b130f0b10184efd34f76c0287943b02da5688bBill Wendling/// existing global. 199db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerConstant *Module::getOrInsertGlobal(StringRef Name, Type *Ty) { 200b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling // See if we have a definition for the specified global already. 201f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar GlobalVariable *GV = dyn_cast_or_null<GlobalVariable>(getNamedValue(Name)); 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!GV) { 203b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling // Nope, add it 204b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling GlobalVariable *New = 205e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson new GlobalVariable(*this, Ty, false, GlobalVariable::ExternalLinkage, 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines nullptr, Name); 207e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson return New; // Return the new declaration. 208b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling } 209b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling 210b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling // If the variable exists but has the wrong type, return a bitcast to the 211b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling // right type. 2122ebcd57e6adf2dc951eb7ad5f42952961f1a60c9Matt Arsenault Type *GVTy = GV->getType(); 2132ebcd57e6adf2dc951eb7ad5f42952961f1a60c9Matt Arsenault PointerType *PTy = PointerType::get(Ty, GVTy->getPointerAddressSpace()); 214b1d70af7b93c1e9161a4e7ca51659a1123c96177Matt Arsenault if (GVTy != PTy) 2152ebcd57e6adf2dc951eb7ad5f42952961f1a60c9Matt Arsenault return ConstantExpr::getBitCast(GV, PTy); 21685d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling 217b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling // Otherwise, we just found the existing function or a prototype. 218b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling return GV; 219b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling} 220b7c2c1246f10972d5a8f55499226872608eb10f9Bill Wendling 22160837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 2228b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// Methods for easy access to the global variables in the module. 2238b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// 2248b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2258b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// getNamedAlias - Look up the specified global in the module symbol table. 2268b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// If it does not exist, return null. 2278b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov// 2282928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarGlobalAlias *Module::getNamedAlias(StringRef Name) const { 229f56ec6423cc8116136cfef314b9f3a519e37d3f9Daniel Dunbar return dyn_cast_or_null<GlobalAlias>(getNamedValue(Name)); 2308b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov} 2318b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 23249fe6c914c5f356a97619046384d7ceb2cb5187eDevang Patel/// getNamedMetadata - Return the first NamedMDNode in the module with the 23385d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling/// specified name. This method returns null if a NamedMDNode with the 23454eee524f192a0e7395d057481e8d4240729d7b4Bob Wilson/// specified name is not found. 235a762b093107ac3aa438815627006425d0b13a236Devang PatelNamedMDNode *Module::getNamedMetadata(const Twine &Name) const { 2362f7d5291de87bfa195884e84dc0efe9705c2215cDevang Patel SmallString<256> NameData; 2372f7d5291de87bfa195884e84dc0efe9705c2215cDevang Patel StringRef NameRef = Name.toStringRef(NameData); 23817aa92c92a925b4a674440c7ef088c223990e854Dan Gohman return static_cast<StringMap<NamedMDNode*> *>(NamedMDSymTab)->lookup(NameRef); 2392f7d5291de87bfa195884e84dc0efe9705c2215cDevang Patel} 2402f7d5291de87bfa195884e84dc0efe9705c2215cDevang Patel 24185d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling/// getOrInsertNamedMetadata - Return the first named MDNode in the module 24285d043d6f6b59518bdaa20ae1957cbf645fd0cd6Bill Wendling/// with the specified name. This method returns a new NamedMDNode if a 24349fe6c914c5f356a97619046384d7ceb2cb5187eDevang Patel/// NamedMDNode with the specified name is not found. 2442928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarNamedMDNode *Module::getOrInsertNamedMetadata(StringRef Name) { 24517aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NamedMDNode *&NMD = 24617aa92c92a925b4a674440c7ef088c223990e854Dan Gohman (*static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab))[Name]; 24717aa92c92a925b4a674440c7ef088c223990e854Dan Gohman if (!NMD) { 24817aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NMD = new NamedMDNode(Name); 24917aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NMD->setParent(this); 25017aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NamedMDList.push_back(NMD); 25117aa92c92a925b4a674440c7ef088c223990e854Dan Gohman } 25249fe6c914c5f356a97619046384d7ceb2cb5187eDevang Patel return NMD; 25349fe6c914c5f356a97619046384d7ceb2cb5187eDevang Patel} 25449fe6c914c5f356a97619046384d7ceb2cb5187eDevang Patel 255d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// eraseNamedMetadata - Remove the given NamedMDNode from this module and 256d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// delete it. 25717aa92c92a925b4a674440c7ef088c223990e854Dan Gohmanvoid Module::eraseNamedMetadata(NamedMDNode *NMD) { 25817aa92c92a925b4a674440c7ef088c223990e854Dan Gohman static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab)->erase(NMD->getName()); 25917aa92c92a925b4a674440c7ef088c223990e854Dan Gohman NamedMDList.erase(NMD); 26017aa92c92a925b4a674440c7ef088c223990e854Dan Gohman} 26117aa92c92a925b4a674440c7ef088c223990e854Dan Gohman 262f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling/// getModuleFlagsMetadata - Returns the module flags in the provided vector. 263f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendlingvoid Module:: 264f20f281368f75239c852fe99c3b3a19278ba38fdBill WendlinggetModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const { 265f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling const NamedMDNode *ModFlags = getModuleFlagsMetadata(); 266f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling if (!ModFlags) return; 267f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (const MDNode *Flag : ModFlags->operands()) { 26927457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren if (Flag->getNumOperands() >= 3 && isa<ConstantInt>(Flag->getOperand(0)) && 27027457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren isa<MDString>(Flag->getOperand(1))) { 27127457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren // Check the operands of the MDNode before accessing the operands. 27227457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren // The verifier will actually catch these failures. 27327457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren ConstantInt *Behavior = cast<ConstantInt>(Flag->getOperand(0)); 27427457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren MDString *Key = cast<MDString>(Flag->getOperand(1)); 27527457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren Value *Val = Flag->getOperand(2); 27627457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren Flags.push_back(ModuleFlagEntry(ModFlagBehavior(Behavior->getZExtValue()), 27727457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren Key, Val)); 27827457ac42f7a9267ab7e0190424a95fecf0ea201Manman Ren } 279f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling } 280f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling} 281f20f281368f75239c852fe99c3b3a19278ba38fdBill Wendling 282c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren/// Return the corresponding value if Key appears in module flags, otherwise 283c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren/// return null. 284c8cfaa1625a72aa3660a268dae753748cfed67d0Manman RenValue *Module::getModuleFlag(StringRef Key) const { 285c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags; 286c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren getModuleFlagsMetadata(ModuleFlags); 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (const ModuleFlagEntry &MFE : ModuleFlags) { 288c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren if (Key == MFE.Key->getString()) 289c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren return MFE.Val; 290c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren } 291dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 292c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren} 293c8cfaa1625a72aa3660a268dae753748cfed67d0Manman Ren 294d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// getModuleFlagsMetadata - Returns the NamedMDNode in the module that 295d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// represents module-level flags. This method returns null if there are no 296d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// module-level flags. 297d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill WendlingNamedMDNode *Module::getModuleFlagsMetadata() const { 298d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return getNamedMetadata("llvm.module.flags"); 299d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 300d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 301d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// getOrInsertModuleFlagsMetadata - Returns the NamedMDNode in the module that 302d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// represents module-level flags. If module-level flags aren't found, it 303d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// creates the named metadata that contains them. 304d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill WendlingNamedMDNode *Module::getOrInsertModuleFlagsMetadata() { 305d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling return getOrInsertNamedMetadata("llvm.module.flags"); 306d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 307d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling 308d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// addModuleFlag - Add a module-level flag to the module-level flags 309d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// metadata. It will create the module-level flags named metadata if it doesn't 310d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling/// already exist. 311e6bd7a805808a05e9869fbf067581855a8b2a2c2Bill Wendlingvoid Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key, 312d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling Value *Val) { 313d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling Type *Int32Ty = Type::getInt32Ty(Context); 314d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling Value *Ops[3] = { 315d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling ConstantInt::get(Int32Ty, Behavior), MDString::get(Context, Key), Val 316d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling }; 317d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling getOrInsertModuleFlagsMetadata()->addOperand(MDNode::get(Context, Ops)); 318d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 319e6bd7a805808a05e9869fbf067581855a8b2a2c2Bill Wendlingvoid Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key, 320d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling uint32_t Val) { 321d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling Type *Int32Ty = Type::getInt32Ty(Context); 322d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling addModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val)); 323d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 324d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendlingvoid Module::addModuleFlag(MDNode *Node) { 325d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling assert(Node->getNumOperands() == 3 && 326d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling "Invalid number of operands for module flag!"); 327d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling assert(isa<ConstantInt>(Node->getOperand(0)) && 328d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling isa<MDString>(Node->getOperand(1)) && 329d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling "Invalid operand types for module flag!"); 330d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling getOrInsertModuleFlagsMetadata()->addOperand(Node); 331d34cb1e09f5e4b3feb7305346655b83ad2f67773Bill Wendling} 332f33fa6fb57b9c41e99739eff79b7f185e0df9500Chris Lattner 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Module::setDataLayout(StringRef Desc) { 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DL.reset(Desc); 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Desc.empty()) { 33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DataLayoutStr = ""; 33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 33936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DataLayoutStr = DL.getStringRepresentation(); 34036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // DataLayoutStr is now equivalent to Desc, but since the representation 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // is not unique, they may not be identical. 34236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid Module::setDataLayout(const DataLayout *Other) { 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Other) { 34736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DataLayoutStr = ""; 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DL.reset(""); 34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 35036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DL = *Other; 35136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DataLayoutStr = DL.getStringRepresentation(); 35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 35336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 35436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 35536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst DataLayout *Module::getDataLayout() const { 35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (DataLayoutStr.empty()) 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return &DL; 35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 361cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// We want reproducible builds, but ModuleID may be a full path so we just use 362cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// the filename to salt the RNG (although it is not guaranteed to be unique). 363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesRandomNumberGenerator &Module::getRNG() const { 364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (RNG == nullptr) { 365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef Salt = sys::path::filename(ModuleID); 366cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines RNG = new RandomNumberGenerator(Salt); 367cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 368cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return *RNG; 369cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 370cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 37160837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner//===----------------------------------------------------------------------===// 372f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin// Methods to control the materialization of GlobalValues in the Module. 373f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin// 374f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid Module::setMaterializer(GVMaterializer *GVM) { 375f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin assert(!Materializer && 376f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin "Module already has a GVMaterializer. Call MaterializeAllPermanently" 377f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin " to clear it out before setting another one."); 378f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin Materializer.reset(GVM); 379f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 380f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 381f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool Module::isMaterializable(const GlobalValue *GV) const { 382f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin if (Materializer) 383f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return Materializer->isMaterializable(GV); 384f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return false; 385f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 386f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 387f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool Module::isDematerializable(const GlobalValue *GV) const { 388f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin if (Materializer) 389f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return Materializer->isDematerializable(GV); 390f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return false; 391f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 392f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 393f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinbool Module::Materialize(GlobalValue *GV, std::string *ErrInfo) { 394af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola if (!Materializer) 395af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola return false; 396af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola 397cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::error_code EC = Materializer->Materialize(GV); 398af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola if (!EC) 399af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola return false; 400af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola if (ErrInfo) 401af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola *ErrInfo = EC.message(); 402af9e8e60ae5118066e49730ae5a96aadf3a8f624Rafael Espindola return true; 403f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 404f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 405f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskinvoid Module::Dematerialize(GlobalValue *GV) { 406f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin if (Materializer) 407f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin return Materializer->Dematerialize(GV); 408f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 409f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 410cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstd::error_code Module::materializeAll() { 411f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin if (!Materializer) 412cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return std::error_code(); 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Materializer->MaterializeModule(this); 414f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 415f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 416cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstd::error_code Module::materializeAllPermanently(bool ReleaseBuffer) { 417cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (std::error_code EC = materializeAll()) 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return EC; 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 420cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ReleaseBuffer) 421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Materializer->releaseBuffer(); 422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 423f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin Materializer.reset(); 424cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return std::error_code(); 425f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin} 426f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin 427f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin//===----------------------------------------------------------------------===// 42860837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// Other module related stuff. 42960837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner// 43060837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 43160837821e2bb179c6dd239ecb4d72df37560d3bbChris Lattner 432cf84d867619b68be17bb1c12bd9831fdd73a88e4Eric Christopher// dropAllReferences() - This function causes all the subelements to "let go" 4339da0715aa4ec1cc9181b786c100fa3dfabe9a404Chris Lattner// of all references that they are maintaining. This allows one to 'delete' a 4349da0715aa4ec1cc9181b786c100fa3dfabe9a404Chris Lattner// whole module at a time, even though there may be circular references... first 4359da0715aa4ec1cc9181b786c100fa3dfabe9a404Chris Lattner// all references are dropped, and all use counts go to zero. Then everything 4366b63452c3ad26678b32f93dbca55902a313ee4e9Misha Brukman// is deleted for real. Note that no operations are valid on an object that 4379da0715aa4ec1cc9181b786c100fa3dfabe9a404Chris Lattner// has "dropped all references", except operator delete. 438009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 439009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid Module::dropAllReferences() { 440cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (Function &F : *this) 441cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines F.dropAllReferences(); 442dd6dfbc8cc008faca03b6ac9b904f263205a418aChris Lattner 443cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (GlobalVariable &GV : globals()) 444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GV.dropAllReferences(); 445a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov 446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (GlobalAlias &GA : aliases()) 447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines GA.dropAllReferences(); 448009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 449dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 450dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesunsigned Module::getDwarfVersion() const { 451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Value *Val = getModuleFlag("Dwarf Version"); 452dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!Val) 453dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return dwarf::DWARF_VERSION; 454dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return cast<ConstantInt>(Val)->getZExtValue(); 455dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesComdat *Module::getOrInsertComdat(StringRef Name) { 458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Comdat C; 459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringMapEntry<Comdat> &Entry = 460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ComdatSymTab.GetOrCreateValue(Name, std::move(C)); 461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Entry.second.Name = &Entry; 462cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return &Entry.second; 463cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 464