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