blob: 30343dcb24d9211e049f15e3b57595a654d663d2 [file] [log] [blame]
Owen Anderson8e66e0b2009-06-30 00:48:55 +00001//===-- LLVMContext.cpp - Implement LLVMContext -----------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Owen Anderson36f62e52009-06-30 17:06:46 +00009//
10// This file implements LLVMContext, as a wrapper around the opaque
11// class LLVMContextImpl.
12//
13//===----------------------------------------------------------------------===//
Owen Anderson8e66e0b2009-06-30 00:48:55 +000014
15#include "llvm/LLVMContext.h"
16#include "llvm/Constants.h"
Owen Andersona8560212009-06-30 17:50:28 +000017#include "llvm/DerivedTypes.h"
Owen Anderson53a52212009-07-13 04:09:18 +000018#include "llvm/Instruction.h"
Devang Patela4f43fb2009-07-28 21:49:47 +000019#include "llvm/Metadata.h"
Owen Anderson1938fb12009-06-30 23:39:59 +000020#include "llvm/Support/ManagedStatic.h"
Owen Anderson8e66e0b2009-06-30 00:48:55 +000021#include "LLVMContextImpl.h"
Nick Lewyckyc07adb72009-07-13 05:49:04 +000022#include <cstdarg>
Owen Anderson8e66e0b2009-06-30 00:48:55 +000023
24using namespace llvm;
25
Owen Anderson1938fb12009-06-30 23:39:59 +000026static ManagedStatic<LLVMContext> GlobalContext;
27
Owen Anderson2a154432009-07-01 23:13:44 +000028LLVMContext& llvm::getGlobalContext() {
Owen Anderson1cf085d2009-07-01 21:22:36 +000029 return *GlobalContext;
Owen Anderson1938fb12009-06-30 23:39:59 +000030}
31
Owen Anderson20b34ac2009-07-16 18:04:31 +000032LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) { }
Owen Anderson8e66e0b2009-06-30 00:48:55 +000033LLVMContext::~LLVMContext() { delete pImpl; }
34
Owen Anderson7d128072009-07-01 23:56:45 +000035// Constant accessors
Owen Anderson53a52212009-07-13 04:09:18 +000036
37// Constructor to create a '0' constant of arbitrary type...
38static const uint64_t zero[2] = {0, 0};
Owen Anderson7d128072009-07-01 23:56:45 +000039Constant* LLVMContext::getNullValue(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +000040 switch (Ty->getTypeID()) {
41 case Type::IntegerTyID:
Owen Andersonedb4a702009-07-24 23:12:02 +000042 return ConstantInt::get(Ty, 0);
Owen Anderson53a52212009-07-13 04:09:18 +000043 case Type::FloatTyID:
Owen Anderson69c464d2009-07-27 20:59:43 +000044 return ConstantFP::get(Ty->getContext(), APFloat(APInt(32, 0)));
Owen Anderson53a52212009-07-13 04:09:18 +000045 case Type::DoubleTyID:
Owen Anderson69c464d2009-07-27 20:59:43 +000046 return ConstantFP::get(Ty->getContext(), APFloat(APInt(64, 0)));
Owen Anderson53a52212009-07-13 04:09:18 +000047 case Type::X86_FP80TyID:
Owen Anderson69c464d2009-07-27 20:59:43 +000048 return ConstantFP::get(Ty->getContext(), APFloat(APInt(80, 2, zero)));
Owen Anderson53a52212009-07-13 04:09:18 +000049 case Type::FP128TyID:
Owen Anderson69c464d2009-07-27 20:59:43 +000050 return ConstantFP::get(Ty->getContext(),
51 APFloat(APInt(128, 2, zero), true));
Owen Anderson53a52212009-07-13 04:09:18 +000052 case Type::PPC_FP128TyID:
Owen Anderson69c464d2009-07-27 20:59:43 +000053 return ConstantFP::get(Ty->getContext(), APFloat(APInt(128, 2, zero)));
Owen Anderson53a52212009-07-13 04:09:18 +000054 case Type::PointerTyID:
55 return getConstantPointerNull(cast<PointerType>(Ty));
56 case Type::StructTyID:
57 case Type::ArrayTyID:
58 case Type::VectorTyID:
59 return getConstantAggregateZero(Ty);
60 default:
61 // Function, Label, or Opaque type?
62 assert(!"Cannot create a null constant of that type!");
63 return 0;
64 }
Owen Anderson7d128072009-07-01 23:56:45 +000065}
66
67Constant* LLVMContext::getAllOnesValue(const Type* Ty) {
Owen Anderson542619e2009-07-13 20:58:05 +000068 if (const IntegerType* ITy = dyn_cast<IntegerType>(Ty))
Owen Andersonedb4a702009-07-24 23:12:02 +000069 return ConstantInt::get(*this, APInt::getAllOnesValue(ITy->getBitWidth()));
Owen Anderson542619e2009-07-13 20:58:05 +000070
71 std::vector<Constant*> Elts;
72 const VectorType* VTy = cast<VectorType>(Ty);
73 Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType()));
74 assert(Elts[0] && "Not a vector integer type!");
Owen Anderson4aa32952009-07-28 21:19:26 +000075 return cast<ConstantVector>(ConstantVector::get(Elts));
Owen Anderson7d128072009-07-01 23:56:45 +000076}
77
Owen Andersonf85afb22009-07-02 16:51:51 +000078// UndefValue accessors.
79UndefValue* LLVMContext::getUndef(const Type* Ty) {
80 return UndefValue::get(Ty);
81}
82
Owen Anderson8e66e0b2009-06-30 00:48:55 +000083// ConstantInt accessors.
Owen Andersonc37bc692009-07-21 18:03:38 +000084ConstantInt* LLVMContext::getTrue() {
Owen Anderson2ad52172009-07-21 02:47:59 +000085 assert(this && "Context not initialized!");
86 assert(pImpl && "Context not initialized!");
Owen Andersonc37bc692009-07-21 18:03:38 +000087 return pImpl->getTrue();
Owen Anderson8e66e0b2009-06-30 00:48:55 +000088}
89
Owen Andersonc37bc692009-07-21 18:03:38 +000090ConstantInt* LLVMContext::getFalse() {
Owen Anderson2ad52172009-07-21 02:47:59 +000091 assert(this && "Context not initialized!");
92 assert(pImpl && "Context not initialized!");
Owen Andersonc37bc692009-07-21 18:03:38 +000093 return pImpl->getFalse();
Owen Anderson8e66e0b2009-06-30 00:48:55 +000094}
95
Owen Anderson8e66e0b2009-06-30 00:48:55 +000096// ConstantPointerNull accessors.
Bill Wendling4534d252009-07-01 22:33:26 +000097ConstantPointerNull* LLVMContext::getConstantPointerNull(const PointerType* T) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +000098 return ConstantPointerNull::get(T);
99}
100
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000101// ConstantAggregateZero accessors.
Bill Wendling4534d252009-07-01 22:33:26 +0000102ConstantAggregateZero* LLVMContext::getConstantAggregateZero(const Type* Ty) {
Owen Anderson39ede7b2009-07-21 20:13:12 +0000103 return pImpl->getConstantAggregateZero(Ty);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000104}
105
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000106// ConstantExpr accessors.
107Constant* LLVMContext::getConstantExpr(unsigned Opcode, Constant* C1,
Bill Wendling4534d252009-07-01 22:33:26 +0000108 Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000109 return ConstantExpr::get(Opcode, C1, C2);
110}
111
Bill Wendling4534d252009-07-01 22:33:26 +0000112Constant* LLVMContext::getConstantExprTrunc(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000113 return ConstantExpr::getTrunc(C, Ty);
114}
115
Bill Wendling4534d252009-07-01 22:33:26 +0000116Constant* LLVMContext::getConstantExprSExt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000117 return ConstantExpr::getSExt(C, Ty);
118}
119
Bill Wendling4534d252009-07-01 22:33:26 +0000120Constant* LLVMContext::getConstantExprZExt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000121 return ConstantExpr::getZExt(C, Ty);
122}
123
Bill Wendling4534d252009-07-01 22:33:26 +0000124Constant* LLVMContext::getConstantExprFPTrunc(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000125 return ConstantExpr::getFPTrunc(C, Ty);
126}
127
Bill Wendling4534d252009-07-01 22:33:26 +0000128Constant* LLVMContext::getConstantExprFPExtend(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000129 return ConstantExpr::getFPExtend(C, Ty);
130}
131
Bill Wendling4534d252009-07-01 22:33:26 +0000132Constant* LLVMContext::getConstantExprUIToFP(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000133 return ConstantExpr::getUIToFP(C, Ty);
134}
135
Bill Wendling4534d252009-07-01 22:33:26 +0000136Constant* LLVMContext::getConstantExprSIToFP(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000137 return ConstantExpr::getSIToFP(C, Ty);
138}
139
Bill Wendling4534d252009-07-01 22:33:26 +0000140Constant* LLVMContext::getConstantExprFPToUI(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000141 return ConstantExpr::getFPToUI(C, Ty);
142}
143
Bill Wendling4534d252009-07-01 22:33:26 +0000144Constant* LLVMContext::getConstantExprFPToSI(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000145 return ConstantExpr::getFPToSI(C, Ty);
146}
147
Bill Wendling4534d252009-07-01 22:33:26 +0000148Constant* LLVMContext::getConstantExprPtrToInt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000149 return ConstantExpr::getPtrToInt(C, Ty);
150}
151
Bill Wendling4534d252009-07-01 22:33:26 +0000152Constant* LLVMContext::getConstantExprIntToPtr(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000153 return ConstantExpr::getIntToPtr(C, Ty);
154}
155
Bill Wendling4534d252009-07-01 22:33:26 +0000156Constant* LLVMContext::getConstantExprBitCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000157 return ConstantExpr::getBitCast(C, Ty);
158}
159
160Constant* LLVMContext::getConstantExprCast(unsigned ops, Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000161 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000162 return ConstantExpr::getCast(ops, C, Ty);
163}
164
165Constant* LLVMContext::getConstantExprZExtOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000166 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000167 return ConstantExpr::getZExtOrBitCast(C, Ty);
168}
169
170Constant* LLVMContext::getConstantExprSExtOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000171 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000172 return ConstantExpr::getSExtOrBitCast(C, Ty);
173}
174
175Constant* LLVMContext::getConstantExprTruncOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000176 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000177 return ConstantExpr::getTruncOrBitCast(C, Ty);
178}
179
Bill Wendling4534d252009-07-01 22:33:26 +0000180Constant* LLVMContext::getConstantExprPointerCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000181 return ConstantExpr::getPointerCast(C, Ty);
182}
183
184Constant* LLVMContext::getConstantExprIntegerCast(Constant* C, const Type* Ty,
Bill Wendling4534d252009-07-01 22:33:26 +0000185 bool isSigned) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000186 return ConstantExpr::getIntegerCast(C, Ty, isSigned);
187}
188
Bill Wendling4534d252009-07-01 22:33:26 +0000189Constant* LLVMContext::getConstantExprFPCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000190 return ConstantExpr::getFPCast(C, Ty);
191}
192
193Constant* LLVMContext::getConstantExprSelect(Constant* C, Constant* V1,
Bill Wendling4534d252009-07-01 22:33:26 +0000194 Constant* V2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000195 return ConstantExpr::getSelect(C, V1, V2);
196}
197
Bill Wendling4534d252009-07-01 22:33:26 +0000198Constant* LLVMContext::getConstantExprAlignOf(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000199 // alignof is implemented as: (i64) gep ({i8,Ty}*)null, 0, 1
200 const Type *AligningTy = getStructType(Type::Int8Ty, Ty, NULL);
201 Constant *NullPtr = getNullValue(AligningTy->getPointerTo());
Owen Andersonedb4a702009-07-24 23:12:02 +0000202 Constant *Zero = ConstantInt::get(Type::Int32Ty, 0);
203 Constant *One = ConstantInt::get(Type::Int32Ty, 1);
Owen Anderson53a52212009-07-13 04:09:18 +0000204 Constant *Indices[2] = { Zero, One };
205 Constant *GEP = getConstantExprGetElementPtr(NullPtr, Indices, 2);
206 return getConstantExprCast(Instruction::PtrToInt, GEP, Type::Int32Ty);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000207}
208
209Constant* LLVMContext::getConstantExprCompare(unsigned short pred,
Bill Wendling4534d252009-07-01 22:33:26 +0000210 Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000211 return ConstantExpr::getCompare(pred, C1, C2);
212}
213
Bill Wendling4534d252009-07-01 22:33:26 +0000214Constant* LLVMContext::getConstantExprNeg(Constant* C) {
Owen Anderson53a52212009-07-13 04:09:18 +0000215 // API compatibility: Adjust integer opcodes to floating-point opcodes.
216 if (C->getType()->isFPOrFPVector())
217 return getConstantExprFNeg(C);
218 assert(C->getType()->isIntOrIntVector() &&
219 "Cannot NEG a nonintegral value!");
220 return getConstantExpr(Instruction::Sub,
Owen Anderson69c464d2009-07-27 20:59:43 +0000221 ConstantFP::getZeroValueForNegation(C->getType()),
Owen Anderson53a52212009-07-13 04:09:18 +0000222 C);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000223}
224
Bill Wendling4534d252009-07-01 22:33:26 +0000225Constant* LLVMContext::getConstantExprFNeg(Constant* C) {
Owen Anderson53a52212009-07-13 04:09:18 +0000226 assert(C->getType()->isFPOrFPVector() &&
227 "Cannot FNEG a non-floating-point value!");
228 return getConstantExpr(Instruction::FSub,
Owen Anderson69c464d2009-07-27 20:59:43 +0000229 ConstantFP::getZeroValueForNegation(C->getType()),
Owen Anderson53a52212009-07-13 04:09:18 +0000230 C);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000231}
232
Bill Wendling4534d252009-07-01 22:33:26 +0000233Constant* LLVMContext::getConstantExprNot(Constant* C) {
Owen Anderson542619e2009-07-13 20:58:05 +0000234 assert(C->getType()->isIntOrIntVector() &&
235 "Cannot NOT a nonintegral value!");
236 return getConstantExpr(Instruction::Xor, C, getAllOnesValue(C->getType()));
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000237}
238
Bill Wendling4534d252009-07-01 22:33:26 +0000239Constant* LLVMContext::getConstantExprAdd(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000240 return getConstantExpr(Instruction::Add, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000241}
242
Bill Wendling4534d252009-07-01 22:33:26 +0000243Constant* LLVMContext::getConstantExprFAdd(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000244 return getConstantExpr(Instruction::FAdd, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000245}
246
Bill Wendling4534d252009-07-01 22:33:26 +0000247Constant* LLVMContext::getConstantExprSub(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000248 return getConstantExpr(Instruction::Sub, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000249}
250
Bill Wendling4534d252009-07-01 22:33:26 +0000251Constant* LLVMContext::getConstantExprFSub(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000252 return getConstantExpr(Instruction::FSub, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000253}
254
Bill Wendling4534d252009-07-01 22:33:26 +0000255Constant* LLVMContext::getConstantExprMul(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000256 return getConstantExpr(Instruction::Mul, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000257}
258
Bill Wendling4534d252009-07-01 22:33:26 +0000259Constant* LLVMContext::getConstantExprFMul(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000260 return getConstantExpr(Instruction::FMul, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000261}
262
Bill Wendling4534d252009-07-01 22:33:26 +0000263Constant* LLVMContext::getConstantExprUDiv(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000264 return getConstantExpr(Instruction::UDiv, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000265}
266
Bill Wendling4534d252009-07-01 22:33:26 +0000267Constant* LLVMContext::getConstantExprSDiv(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000268 return getConstantExpr(Instruction::SDiv, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000269}
270
Bill Wendling4534d252009-07-01 22:33:26 +0000271Constant* LLVMContext::getConstantExprFDiv(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000272 return getConstantExpr(Instruction::FDiv, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000273}
274
Bill Wendling4534d252009-07-01 22:33:26 +0000275Constant* LLVMContext::getConstantExprURem(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000276 return getConstantExpr(Instruction::URem, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000277}
278
Bill Wendling4534d252009-07-01 22:33:26 +0000279Constant* LLVMContext::getConstantExprSRem(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000280 return getConstantExpr(Instruction::SRem, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000281}
282
Bill Wendling4534d252009-07-01 22:33:26 +0000283Constant* LLVMContext::getConstantExprFRem(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000284 return getConstantExpr(Instruction::FRem, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000285}
286
Bill Wendling4534d252009-07-01 22:33:26 +0000287Constant* LLVMContext::getConstantExprAnd(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000288 return getConstantExpr(Instruction::And, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000289}
290
Bill Wendling4534d252009-07-01 22:33:26 +0000291Constant* LLVMContext::getConstantExprOr(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000292 return getConstantExpr(Instruction::Or, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000293}
294
Bill Wendling4534d252009-07-01 22:33:26 +0000295Constant* LLVMContext::getConstantExprXor(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000296 return getConstantExpr(Instruction::Xor, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000297}
298
299Constant* LLVMContext::getConstantExprICmp(unsigned short pred, Constant* LHS,
Bill Wendling4534d252009-07-01 22:33:26 +0000300 Constant* RHS) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000301 return ConstantExpr::getICmp(pred, LHS, RHS);
302}
303
304Constant* LLVMContext::getConstantExprFCmp(unsigned short pred, Constant* LHS,
Bill Wendling4534d252009-07-01 22:33:26 +0000305 Constant* RHS) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000306 return ConstantExpr::getFCmp(pred, LHS, RHS);
307}
308
Bill Wendling4534d252009-07-01 22:33:26 +0000309Constant* LLVMContext::getConstantExprShl(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000310 return getConstantExpr(Instruction::Shl, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000311}
312
Bill Wendling4534d252009-07-01 22:33:26 +0000313Constant* LLVMContext::getConstantExprLShr(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000314 return getConstantExpr(Instruction::LShr, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000315}
316
Bill Wendling4534d252009-07-01 22:33:26 +0000317Constant* LLVMContext::getConstantExprAShr(Constant* C1, Constant* C2) {
Owen Anderson3e42e9f2009-07-13 23:50:59 +0000318 return getConstantExpr(Instruction::AShr, C1, C2);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000319}
320
321Constant* LLVMContext::getConstantExprGetElementPtr(Constant* C,
322 Constant* const* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000323 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000324 return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
325}
326
327Constant* LLVMContext::getConstantExprGetElementPtr(Constant* C,
328 Value* const* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000329 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000330 return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
331}
332
333Constant* LLVMContext::getConstantExprExtractElement(Constant* Vec,
Bill Wendling4534d252009-07-01 22:33:26 +0000334 Constant* Idx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000335 return ConstantExpr::getExtractElement(Vec, Idx);
336}
337
338Constant* LLVMContext::getConstantExprInsertElement(Constant* Vec,
339 Constant* Elt,
Bill Wendling4534d252009-07-01 22:33:26 +0000340 Constant* Idx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000341 return ConstantExpr::getInsertElement(Vec, Elt, Idx);
342}
343
344Constant* LLVMContext::getConstantExprShuffleVector(Constant* V1, Constant* V2,
Bill Wendling4534d252009-07-01 22:33:26 +0000345 Constant* Mask) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000346 return ConstantExpr::getShuffleVector(V1, V2, Mask);
347}
348
349Constant* LLVMContext::getConstantExprExtractValue(Constant* Agg,
350 const unsigned* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000351 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000352 return ConstantExpr::getExtractValue(Agg, IdxList, NumIdx);
353}
354
355Constant* LLVMContext::getConstantExprInsertValue(Constant* Agg, Constant* Val,
356 const unsigned* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000357 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000358 return ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx);
359}
360
Owen Andersone70b6372009-07-05 22:41:43 +0000361Constant* LLVMContext::getConstantExprSizeOf(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000362 // sizeof is implemented as: (i64) gep (Ty*)null, 1
Dan Gohman75b7f672009-07-27 21:59:50 +0000363 // Note that a non-inbounds gep is used, as null isn't within any object.
Owen Andersonedb4a702009-07-24 23:12:02 +0000364 Constant *GEPIdx = ConstantInt::get(Type::Int32Ty, 1);
Owen Anderson53a52212009-07-13 04:09:18 +0000365 Constant *GEP = getConstantExprGetElementPtr(
366 getNullValue(getPointerTypeUnqual(Ty)), &GEPIdx, 1);
367 return getConstantExprCast(Instruction::PtrToInt, GEP, Type::Int64Ty);
Owen Andersone70b6372009-07-05 22:41:43 +0000368}
369
Owen Andersone792c902009-07-02 17:12:48 +0000370// MDNode accessors
371MDNode* LLVMContext::getMDNode(Value* const* Vals, unsigned NumVals) {
Owen Anderson4118dde2009-07-16 23:44:30 +0000372 return pImpl->getMDNode(Vals, NumVals);
Owen Andersone792c902009-07-02 17:12:48 +0000373}
374
Owen Andersonfea7ae82009-07-02 17:19:47 +0000375// MDString accessors
Daniel Dunbard43b86d2009-07-25 06:02:13 +0000376MDString* LLVMContext::getMDString(const StringRef &Str) {
377 return pImpl->getMDString(Str.data(), Str.size());
Owen Andersonfea7ae82009-07-02 17:19:47 +0000378}
379
Owen Andersona8560212009-06-30 17:50:28 +0000380// FunctionType accessors
Owen Andersone70b6372009-07-05 22:41:43 +0000381FunctionType* LLVMContext::getFunctionType(const Type* Result, bool isVarArg) {
382 return FunctionType::get(Result, isVarArg);
383}
384
Owen Andersona8560212009-06-30 17:50:28 +0000385FunctionType* LLVMContext::getFunctionType(const Type* Result,
386 const std::vector<const Type*>& Params,
Bill Wendling4534d252009-07-01 22:33:26 +0000387 bool isVarArg) {
Owen Andersona8560212009-06-30 17:50:28 +0000388 return FunctionType::get(Result, Params, isVarArg);
389}
390
391// IntegerType accessors
Bill Wendling4534d252009-07-01 22:33:26 +0000392const IntegerType* LLVMContext::getIntegerType(unsigned NumBits) {
Owen Andersona8560212009-06-30 17:50:28 +0000393 return IntegerType::get(NumBits);
394}
395
396// OpaqueType accessors
Bill Wendling4534d252009-07-01 22:33:26 +0000397OpaqueType* LLVMContext::getOpaqueType() {
Owen Andersona8560212009-06-30 17:50:28 +0000398 return OpaqueType::get();
399}
400
401// StructType accessors
Owen Anderson7d128072009-07-01 23:56:45 +0000402StructType* LLVMContext::getStructType(bool isPacked) {
403 return StructType::get(isPacked);
404}
405
Owen Andersona8560212009-06-30 17:50:28 +0000406StructType* LLVMContext::getStructType(const std::vector<const Type*>& Params,
Bill Wendling4534d252009-07-01 22:33:26 +0000407 bool isPacked) {
Owen Andersona8560212009-06-30 17:50:28 +0000408 return StructType::get(Params, isPacked);
409}
410
Owen Anderson53a52212009-07-13 04:09:18 +0000411StructType *LLVMContext::getStructType(const Type *type, ...) {
412 va_list ap;
413 std::vector<const llvm::Type*> StructFields;
414 va_start(ap, type);
415 while (type) {
416 StructFields.push_back(type);
417 type = va_arg(ap, llvm::Type*);
418 }
419 return StructType::get(StructFields);
420}
421
Owen Andersona8560212009-06-30 17:50:28 +0000422// ArrayType accessors
423ArrayType* LLVMContext::getArrayType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000424 uint64_t NumElements) {
Owen Andersona8560212009-06-30 17:50:28 +0000425 return ArrayType::get(ElementType, NumElements);
426}
427
428// PointerType accessors
429PointerType* LLVMContext::getPointerType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000430 unsigned AddressSpace) {
Owen Andersona8560212009-06-30 17:50:28 +0000431 return PointerType::get(ElementType, AddressSpace);
432}
433
Owen Anderson7d128072009-07-01 23:56:45 +0000434PointerType* LLVMContext::getPointerTypeUnqual(const Type* ElementType) {
Owen Andersona8560212009-06-30 17:50:28 +0000435 return PointerType::getUnqual(ElementType);
436}
437
438// VectorType accessors
439VectorType* LLVMContext::getVectorType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000440 unsigned NumElements) {
Owen Andersona8560212009-06-30 17:50:28 +0000441 return VectorType::get(ElementType, NumElements);
442}
443
Bill Wendling4534d252009-07-01 22:33:26 +0000444VectorType* LLVMContext::getVectorTypeInteger(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000445 return VectorType::getInteger(VTy);
446}
447
Bill Wendling4534d252009-07-01 22:33:26 +0000448VectorType* LLVMContext::getVectorTypeExtendedElement(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000449 return VectorType::getExtendedElementVectorType(VTy);
450}
451
Bill Wendling4534d252009-07-01 22:33:26 +0000452VectorType* LLVMContext::getVectorTypeTruncatedElement(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000453 return VectorType::getTruncatedElementVectorType(VTy);
454}
Owen Anderson1e5f00e2009-07-09 23:48:35 +0000455
456const Type* LLVMContext::makeCmpResultType(const Type* opnd_type) {
457 if (const VectorType* vt = dyn_cast<const VectorType>(opnd_type)) {
458 return getVectorType(Type::Int1Ty, vt->getNumElements());
459 }
460 return Type::Int1Ty;
461}
Owen Anderson69ab4162009-07-16 22:11:26 +0000462
463void LLVMContext::erase(MDString *M) {
464 pImpl->erase(M);
Owen Anderson4118dde2009-07-16 23:44:30 +0000465}
466
467void LLVMContext::erase(MDNode *M) {
468 pImpl->erase(M);
Jeffrey Yasskin06285352009-07-16 23:58:14 +0000469}
Owen Anderson39ede7b2009-07-21 20:13:12 +0000470
471void LLVMContext::erase(ConstantAggregateZero *Z) {
472 pImpl->erase(Z);
Owen Anderson3d344922009-07-21 20:55:28 +0000473}