blob: e091f2899bdbbbf3c5752195cd94b5ac8b1eceb4 [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"
Owen Andersone792c902009-07-02 17:12:48 +000019#include "llvm/MDNode.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"
22
23using namespace llvm;
24
Owen Anderson1938fb12009-06-30 23:39:59 +000025static ManagedStatic<LLVMContext> GlobalContext;
26
Owen Anderson2a154432009-07-01 23:13:44 +000027LLVMContext& llvm::getGlobalContext() {
Owen Anderson1cf085d2009-07-01 21:22:36 +000028 return *GlobalContext;
Owen Anderson1938fb12009-06-30 23:39:59 +000029}
30
Owen Anderson8e66e0b2009-06-30 00:48:55 +000031LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl()) { }
32LLVMContext::~LLVMContext() { delete pImpl; }
33
Owen Anderson7d128072009-07-01 23:56:45 +000034// Constant accessors
Owen Anderson53a52212009-07-13 04:09:18 +000035
36// Constructor to create a '0' constant of arbitrary type...
37static const uint64_t zero[2] = {0, 0};
Owen Anderson7d128072009-07-01 23:56:45 +000038Constant* LLVMContext::getNullValue(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +000039 switch (Ty->getTypeID()) {
40 case Type::IntegerTyID:
41 return getConstantInt(Ty, 0);
42 case Type::FloatTyID:
43 return getConstantFP(APFloat(APInt(32, 0)));
44 case Type::DoubleTyID:
45 return getConstantFP(APFloat(APInt(64, 0)));
46 case Type::X86_FP80TyID:
47 return getConstantFP(APFloat(APInt(80, 2, zero)));
48 case Type::FP128TyID:
49 return getConstantFP(APFloat(APInt(128, 2, zero), true));
50 case Type::PPC_FP128TyID:
51 return getConstantFP(APFloat(APInt(128, 2, zero)));
52 case Type::PointerTyID:
53 return getConstantPointerNull(cast<PointerType>(Ty));
54 case Type::StructTyID:
55 case Type::ArrayTyID:
56 case Type::VectorTyID:
57 return getConstantAggregateZero(Ty);
58 default:
59 // Function, Label, or Opaque type?
60 assert(!"Cannot create a null constant of that type!");
61 return 0;
62 }
Owen Anderson7d128072009-07-01 23:56:45 +000063}
64
65Constant* LLVMContext::getAllOnesValue(const Type* Ty) {
66 return Constant::getAllOnesValue(Ty);
67}
68
Owen Andersonf85afb22009-07-02 16:51:51 +000069// UndefValue accessors.
70UndefValue* LLVMContext::getUndef(const Type* Ty) {
71 return UndefValue::get(Ty);
72}
73
Owen Anderson8e66e0b2009-06-30 00:48:55 +000074// ConstantInt accessors.
Bill Wendling4534d252009-07-01 22:33:26 +000075ConstantInt* LLVMContext::getConstantIntTrue() {
Owen Anderson8e66e0b2009-06-30 00:48:55 +000076 return ConstantInt::getTrue();
77}
78
Bill Wendling4534d252009-07-01 22:33:26 +000079ConstantInt* LLVMContext::getConstantIntFalse() {
Owen Anderson8e66e0b2009-06-30 00:48:55 +000080 return ConstantInt::getFalse();
81}
82
Owen Anderson39a7aed2009-07-02 23:58:19 +000083Constant* LLVMContext::getConstantInt(const Type* Ty, uint64_t V,
84 bool isSigned) {
85 return ConstantInt::get(Ty, V, isSigned);
86}
87
88
Owen Anderson8e66e0b2009-06-30 00:48:55 +000089ConstantInt* LLVMContext::getConstantInt(const IntegerType* Ty, uint64_t V,
Bill Wendling4534d252009-07-01 22:33:26 +000090 bool isSigned) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +000091 return ConstantInt::get(Ty, V, isSigned);
92}
93
94ConstantInt* LLVMContext::getConstantIntSigned(const IntegerType* Ty,
Bill Wendling4534d252009-07-01 22:33:26 +000095 int64_t V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +000096 return ConstantInt::getSigned(Ty, V);
97}
98
Bill Wendling4534d252009-07-01 22:33:26 +000099ConstantInt* LLVMContext::getConstantInt(const APInt& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000100 return ConstantInt::get(V);
101}
102
Bill Wendling4534d252009-07-01 22:33:26 +0000103Constant* LLVMContext::getConstantInt(const Type* Ty, const APInt& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000104 return ConstantInt::get(Ty, V);
105}
106
Owen Anderson39a7aed2009-07-02 23:58:19 +0000107ConstantInt* LLVMContext::getConstantIntAllOnesValue(const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000108 return ConstantInt::getAllOnesValue(Ty);
109}
110
111
112// ConstantPointerNull accessors.
Bill Wendling4534d252009-07-01 22:33:26 +0000113ConstantPointerNull* LLVMContext::getConstantPointerNull(const PointerType* T) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000114 return ConstantPointerNull::get(T);
115}
116
117
118// ConstantStruct accessors.
119Constant* LLVMContext::getConstantStruct(const StructType* T,
Bill Wendling4534d252009-07-01 22:33:26 +0000120 const std::vector<Constant*>& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000121 return ConstantStruct::get(T, V);
122}
123
124Constant* LLVMContext::getConstantStruct(const std::vector<Constant*>& V,
Bill Wendling4534d252009-07-01 22:33:26 +0000125 bool Packed) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000126 return ConstantStruct::get(V, Packed);
127}
128
129Constant* LLVMContext::getConstantStruct(Constant* const *Vals,
Bill Wendling4534d252009-07-01 22:33:26 +0000130 unsigned NumVals, bool Packed) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000131 return ConstantStruct::get(Vals, NumVals, Packed);
132}
133
134
135// ConstantAggregateZero accessors.
Bill Wendling4534d252009-07-01 22:33:26 +0000136ConstantAggregateZero* LLVMContext::getConstantAggregateZero(const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000137 return ConstantAggregateZero::get(Ty);
138}
139
140
141// ConstantArray accessors.
142Constant* LLVMContext::getConstantArray(const ArrayType* T,
Bill Wendling4534d252009-07-01 22:33:26 +0000143 const std::vector<Constant*>& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000144 return ConstantArray::get(T, V);
145}
146
147Constant* LLVMContext::getConstantArray(const ArrayType* T,
148 Constant* const* Vals,
Bill Wendling4534d252009-07-01 22:33:26 +0000149 unsigned NumVals) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000150 return ConstantArray::get(T, Vals, NumVals);
151}
152
153Constant* LLVMContext::getConstantArray(const std::string& Initializer,
Bill Wendling4534d252009-07-01 22:33:26 +0000154 bool AddNull) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000155 return ConstantArray::get(Initializer, AddNull);
156}
157
158
159// ConstantExpr accessors.
160Constant* LLVMContext::getConstantExpr(unsigned Opcode, Constant* C1,
Bill Wendling4534d252009-07-01 22:33:26 +0000161 Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000162 return ConstantExpr::get(Opcode, C1, C2);
163}
164
Bill Wendling4534d252009-07-01 22:33:26 +0000165Constant* LLVMContext::getConstantExprTrunc(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000166 return ConstantExpr::getTrunc(C, Ty);
167}
168
Bill Wendling4534d252009-07-01 22:33:26 +0000169Constant* LLVMContext::getConstantExprSExt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000170 return ConstantExpr::getSExt(C, Ty);
171}
172
Bill Wendling4534d252009-07-01 22:33:26 +0000173Constant* LLVMContext::getConstantExprZExt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000174 return ConstantExpr::getZExt(C, Ty);
175}
176
Bill Wendling4534d252009-07-01 22:33:26 +0000177Constant* LLVMContext::getConstantExprFPTrunc(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000178 return ConstantExpr::getFPTrunc(C, Ty);
179}
180
Bill Wendling4534d252009-07-01 22:33:26 +0000181Constant* LLVMContext::getConstantExprFPExtend(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000182 return ConstantExpr::getFPExtend(C, Ty);
183}
184
Bill Wendling4534d252009-07-01 22:33:26 +0000185Constant* LLVMContext::getConstantExprUIToFP(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000186 return ConstantExpr::getUIToFP(C, Ty);
187}
188
Bill Wendling4534d252009-07-01 22:33:26 +0000189Constant* LLVMContext::getConstantExprSIToFP(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000190 return ConstantExpr::getSIToFP(C, Ty);
191}
192
Bill Wendling4534d252009-07-01 22:33:26 +0000193Constant* LLVMContext::getConstantExprFPToUI(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000194 return ConstantExpr::getFPToUI(C, Ty);
195}
196
Bill Wendling4534d252009-07-01 22:33:26 +0000197Constant* LLVMContext::getConstantExprFPToSI(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000198 return ConstantExpr::getFPToSI(C, Ty);
199}
200
Bill Wendling4534d252009-07-01 22:33:26 +0000201Constant* LLVMContext::getConstantExprPtrToInt(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000202 return ConstantExpr::getPtrToInt(C, Ty);
203}
204
Bill Wendling4534d252009-07-01 22:33:26 +0000205Constant* LLVMContext::getConstantExprIntToPtr(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000206 return ConstantExpr::getIntToPtr(C, Ty);
207}
208
Bill Wendling4534d252009-07-01 22:33:26 +0000209Constant* LLVMContext::getConstantExprBitCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000210 return ConstantExpr::getBitCast(C, Ty);
211}
212
213Constant* LLVMContext::getConstantExprCast(unsigned ops, Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000214 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000215 return ConstantExpr::getCast(ops, C, Ty);
216}
217
218Constant* LLVMContext::getConstantExprZExtOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000219 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000220 return ConstantExpr::getZExtOrBitCast(C, Ty);
221}
222
223Constant* LLVMContext::getConstantExprSExtOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000224 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000225 return ConstantExpr::getSExtOrBitCast(C, Ty);
226}
227
228Constant* LLVMContext::getConstantExprTruncOrBitCast(Constant* C,
Bill Wendling4534d252009-07-01 22:33:26 +0000229 const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000230 return ConstantExpr::getTruncOrBitCast(C, Ty);
231}
232
Bill Wendling4534d252009-07-01 22:33:26 +0000233Constant* LLVMContext::getConstantExprPointerCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000234 return ConstantExpr::getPointerCast(C, Ty);
235}
236
237Constant* LLVMContext::getConstantExprIntegerCast(Constant* C, const Type* Ty,
Bill Wendling4534d252009-07-01 22:33:26 +0000238 bool isSigned) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000239 return ConstantExpr::getIntegerCast(C, Ty, isSigned);
240}
241
Bill Wendling4534d252009-07-01 22:33:26 +0000242Constant* LLVMContext::getConstantExprFPCast(Constant* C, const Type* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000243 return ConstantExpr::getFPCast(C, Ty);
244}
245
246Constant* LLVMContext::getConstantExprSelect(Constant* C, Constant* V1,
Bill Wendling4534d252009-07-01 22:33:26 +0000247 Constant* V2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000248 return ConstantExpr::getSelect(C, V1, V2);
249}
250
Bill Wendling4534d252009-07-01 22:33:26 +0000251Constant* LLVMContext::getConstantExprAlignOf(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000252 // alignof is implemented as: (i64) gep ({i8,Ty}*)null, 0, 1
253 const Type *AligningTy = getStructType(Type::Int8Ty, Ty, NULL);
254 Constant *NullPtr = getNullValue(AligningTy->getPointerTo());
255 Constant *Zero = getConstantInt(Type::Int32Ty, 0);
256 Constant *One = getConstantInt(Type::Int32Ty, 1);
257 Constant *Indices[2] = { Zero, One };
258 Constant *GEP = getConstantExprGetElementPtr(NullPtr, Indices, 2);
259 return getConstantExprCast(Instruction::PtrToInt, GEP, Type::Int32Ty);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000260}
261
262Constant* LLVMContext::getConstantExprCompare(unsigned short pred,
Bill Wendling4534d252009-07-01 22:33:26 +0000263 Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000264 return ConstantExpr::getCompare(pred, C1, C2);
265}
266
Bill Wendling4534d252009-07-01 22:33:26 +0000267Constant* LLVMContext::getConstantExprNeg(Constant* C) {
Owen Anderson53a52212009-07-13 04:09:18 +0000268 // API compatibility: Adjust integer opcodes to floating-point opcodes.
269 if (C->getType()->isFPOrFPVector())
270 return getConstantExprFNeg(C);
271 assert(C->getType()->isIntOrIntVector() &&
272 "Cannot NEG a nonintegral value!");
273 return getConstantExpr(Instruction::Sub,
274 getZeroValueForNegation(C->getType()),
275 C);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000276}
277
Bill Wendling4534d252009-07-01 22:33:26 +0000278Constant* LLVMContext::getConstantExprFNeg(Constant* C) {
Owen Anderson53a52212009-07-13 04:09:18 +0000279 assert(C->getType()->isFPOrFPVector() &&
280 "Cannot FNEG a non-floating-point value!");
281 return getConstantExpr(Instruction::FSub,
282 getZeroValueForNegation(C->getType()),
283 C);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000284}
285
Bill Wendling4534d252009-07-01 22:33:26 +0000286Constant* LLVMContext::getConstantExprNot(Constant* C) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000287 return ConstantExpr::getNot(C);
288}
289
Bill Wendling4534d252009-07-01 22:33:26 +0000290Constant* LLVMContext::getConstantExprAdd(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000291 return ConstantExpr::getAdd(C1, C2);
292}
293
Bill Wendling4534d252009-07-01 22:33:26 +0000294Constant* LLVMContext::getConstantExprFAdd(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000295 return ConstantExpr::getFAdd(C1, C2);
296}
297
Bill Wendling4534d252009-07-01 22:33:26 +0000298Constant* LLVMContext::getConstantExprSub(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000299 return ConstantExpr::getSub(C1, C2);
300}
301
Bill Wendling4534d252009-07-01 22:33:26 +0000302Constant* LLVMContext::getConstantExprFSub(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000303 return ConstantExpr::getFSub(C1, C2);
304}
305
Bill Wendling4534d252009-07-01 22:33:26 +0000306Constant* LLVMContext::getConstantExprMul(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000307 return ConstantExpr::getMul(C1, C2);
308}
309
Bill Wendling4534d252009-07-01 22:33:26 +0000310Constant* LLVMContext::getConstantExprFMul(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000311 return ConstantExpr::getFMul(C1, C2);
312}
313
Bill Wendling4534d252009-07-01 22:33:26 +0000314Constant* LLVMContext::getConstantExprUDiv(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000315 return ConstantExpr::getUDiv(C1, C2);
316}
317
Bill Wendling4534d252009-07-01 22:33:26 +0000318Constant* LLVMContext::getConstantExprSDiv(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000319 return ConstantExpr::getSDiv(C1, C2);
320}
321
Bill Wendling4534d252009-07-01 22:33:26 +0000322Constant* LLVMContext::getConstantExprFDiv(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000323 return ConstantExpr::getFDiv(C1, C2);
324}
325
Bill Wendling4534d252009-07-01 22:33:26 +0000326Constant* LLVMContext::getConstantExprURem(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000327 return ConstantExpr::getURem(C1, C2);
328}
329
Bill Wendling4534d252009-07-01 22:33:26 +0000330Constant* LLVMContext::getConstantExprSRem(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000331 return ConstantExpr::getSRem(C1, C2);
332}
333
Bill Wendling4534d252009-07-01 22:33:26 +0000334Constant* LLVMContext::getConstantExprFRem(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000335 return ConstantExpr::getFRem(C1, C2);
336}
337
Bill Wendling4534d252009-07-01 22:33:26 +0000338Constant* LLVMContext::getConstantExprAnd(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000339 return ConstantExpr::getAnd(C1, C2);
340}
341
Bill Wendling4534d252009-07-01 22:33:26 +0000342Constant* LLVMContext::getConstantExprOr(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000343 return ConstantExpr::getOr(C1, C2);
344}
345
Bill Wendling4534d252009-07-01 22:33:26 +0000346Constant* LLVMContext::getConstantExprXor(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000347 return ConstantExpr::getXor(C1, C2);
348}
349
350Constant* LLVMContext::getConstantExprICmp(unsigned short pred, Constant* LHS,
Bill Wendling4534d252009-07-01 22:33:26 +0000351 Constant* RHS) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000352 return ConstantExpr::getICmp(pred, LHS, RHS);
353}
354
355Constant* LLVMContext::getConstantExprFCmp(unsigned short pred, Constant* LHS,
Bill Wendling4534d252009-07-01 22:33:26 +0000356 Constant* RHS) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000357 return ConstantExpr::getFCmp(pred, LHS, RHS);
358}
359
Bill Wendling4534d252009-07-01 22:33:26 +0000360Constant* LLVMContext::getConstantExprShl(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000361 return ConstantExpr::getShl(C1, C2);
362}
363
Bill Wendling4534d252009-07-01 22:33:26 +0000364Constant* LLVMContext::getConstantExprLShr(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000365 return ConstantExpr::getLShr(C1, C2);
366}
367
Bill Wendling4534d252009-07-01 22:33:26 +0000368Constant* LLVMContext::getConstantExprAShr(Constant* C1, Constant* C2) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000369 return ConstantExpr::getAShr(C1, C2);
370}
371
372Constant* LLVMContext::getConstantExprGetElementPtr(Constant* C,
373 Constant* const* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000374 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000375 return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
376}
377
378Constant* LLVMContext::getConstantExprGetElementPtr(Constant* C,
379 Value* const* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000380 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000381 return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
382}
383
384Constant* LLVMContext::getConstantExprExtractElement(Constant* Vec,
Bill Wendling4534d252009-07-01 22:33:26 +0000385 Constant* Idx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000386 return ConstantExpr::getExtractElement(Vec, Idx);
387}
388
389Constant* LLVMContext::getConstantExprInsertElement(Constant* Vec,
390 Constant* Elt,
Bill Wendling4534d252009-07-01 22:33:26 +0000391 Constant* Idx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000392 return ConstantExpr::getInsertElement(Vec, Elt, Idx);
393}
394
395Constant* LLVMContext::getConstantExprShuffleVector(Constant* V1, Constant* V2,
Bill Wendling4534d252009-07-01 22:33:26 +0000396 Constant* Mask) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000397 return ConstantExpr::getShuffleVector(V1, V2, Mask);
398}
399
400Constant* LLVMContext::getConstantExprExtractValue(Constant* Agg,
401 const unsigned* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000402 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000403 return ConstantExpr::getExtractValue(Agg, IdxList, NumIdx);
404}
405
406Constant* LLVMContext::getConstantExprInsertValue(Constant* Agg, Constant* Val,
407 const unsigned* IdxList,
Bill Wendling4534d252009-07-01 22:33:26 +0000408 unsigned NumIdx) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000409 return ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx);
410}
411
Owen Andersone70b6372009-07-05 22:41:43 +0000412Constant* LLVMContext::getConstantExprSizeOf(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000413 // sizeof is implemented as: (i64) gep (Ty*)null, 1
414 Constant *GEPIdx = getConstantInt(Type::Int32Ty, 1);
415 Constant *GEP = getConstantExprGetElementPtr(
416 getNullValue(getPointerTypeUnqual(Ty)), &GEPIdx, 1);
417 return getConstantExprCast(Instruction::PtrToInt, GEP, Type::Int64Ty);
Owen Andersone70b6372009-07-05 22:41:43 +0000418}
419
Bill Wendling4534d252009-07-01 22:33:26 +0000420Constant* LLVMContext::getZeroValueForNegation(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000421 if (const VectorType *PTy = dyn_cast<VectorType>(Ty))
422 if (PTy->getElementType()->isFloatingPoint()) {
423 std::vector<Constant*> zeros(PTy->getNumElements(),
424 getConstantFPNegativeZero(PTy->getElementType()));
425 return getConstantVector(PTy, zeros);
426 }
427
428 if (Ty->isFloatingPoint())
429 return getConstantFPNegativeZero(Ty);
430
431 return getNullValue(Ty);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000432}
433
434
435// ConstantFP accessors.
Bill Wendling4534d252009-07-01 22:33:26 +0000436ConstantFP* LLVMContext::getConstantFP(const APFloat& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000437 return ConstantFP::get(V);
438}
439
Bill Wendling4534d252009-07-01 22:33:26 +0000440Constant* LLVMContext::getConstantFP(const Type* Ty, double V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000441 return ConstantFP::get(Ty, V);
442}
443
Bill Wendling4534d252009-07-01 22:33:26 +0000444ConstantFP* LLVMContext::getConstantFPNegativeZero(const Type* Ty) {
Owen Anderson53a52212009-07-13 04:09:18 +0000445 APFloat apf = cast <ConstantFP>(getNullValue(Ty))->getValueAPF();
446 apf.changeSign();
447 return getConstantFP(apf);
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000448}
449
450
451// ConstantVector accessors.
452Constant* LLVMContext::getConstantVector(const VectorType* T,
Bill Wendling4534d252009-07-01 22:33:26 +0000453 const std::vector<Constant*>& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000454 return ConstantVector::get(T, V);
455}
456
Bill Wendling4534d252009-07-01 22:33:26 +0000457Constant* LLVMContext::getConstantVector(const std::vector<Constant*>& V) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000458 return ConstantVector::get(V);
459}
460
461Constant* LLVMContext::getConstantVector(Constant* const* Vals,
Bill Wendling4534d252009-07-01 22:33:26 +0000462 unsigned NumVals) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000463 return ConstantVector::get(Vals, NumVals);
464}
465
Owen Anderson340288c2009-07-03 19:42:02 +0000466ConstantVector* LLVMContext::getConstantVectorAllOnesValue(
467 const VectorType* Ty) {
Owen Anderson8e66e0b2009-06-30 00:48:55 +0000468 return ConstantVector::getAllOnesValue(Ty);
469}
Owen Andersona8560212009-06-30 17:50:28 +0000470
Owen Andersone792c902009-07-02 17:12:48 +0000471// MDNode accessors
472MDNode* LLVMContext::getMDNode(Value* const* Vals, unsigned NumVals) {
473 return MDNode::get(Vals, NumVals);
474}
475
Owen Andersonfea7ae82009-07-02 17:19:47 +0000476// MDString accessors
477MDString* LLVMContext::getMDString(const char *StrBegin, const char *StrEnd) {
478 return MDString::get(StrBegin, StrEnd);
479}
480
481MDString* LLVMContext::getMDString(const std::string &Str) {
482 return MDString::get(Str);
483}
484
Owen Andersona8560212009-06-30 17:50:28 +0000485// FunctionType accessors
Owen Andersone70b6372009-07-05 22:41:43 +0000486FunctionType* LLVMContext::getFunctionType(const Type* Result, bool isVarArg) {
487 return FunctionType::get(Result, isVarArg);
488}
489
Owen Andersona8560212009-06-30 17:50:28 +0000490FunctionType* LLVMContext::getFunctionType(const Type* Result,
491 const std::vector<const Type*>& Params,
Bill Wendling4534d252009-07-01 22:33:26 +0000492 bool isVarArg) {
Owen Andersona8560212009-06-30 17:50:28 +0000493 return FunctionType::get(Result, Params, isVarArg);
494}
495
496// IntegerType accessors
Bill Wendling4534d252009-07-01 22:33:26 +0000497const IntegerType* LLVMContext::getIntegerType(unsigned NumBits) {
Owen Andersona8560212009-06-30 17:50:28 +0000498 return IntegerType::get(NumBits);
499}
500
501// OpaqueType accessors
Bill Wendling4534d252009-07-01 22:33:26 +0000502OpaqueType* LLVMContext::getOpaqueType() {
Owen Andersona8560212009-06-30 17:50:28 +0000503 return OpaqueType::get();
504}
505
506// StructType accessors
Owen Anderson7d128072009-07-01 23:56:45 +0000507StructType* LLVMContext::getStructType(bool isPacked) {
508 return StructType::get(isPacked);
509}
510
Owen Andersona8560212009-06-30 17:50:28 +0000511StructType* LLVMContext::getStructType(const std::vector<const Type*>& Params,
Bill Wendling4534d252009-07-01 22:33:26 +0000512 bool isPacked) {
Owen Andersona8560212009-06-30 17:50:28 +0000513 return StructType::get(Params, isPacked);
514}
515
Owen Anderson53a52212009-07-13 04:09:18 +0000516StructType *LLVMContext::getStructType(const Type *type, ...) {
517 va_list ap;
518 std::vector<const llvm::Type*> StructFields;
519 va_start(ap, type);
520 while (type) {
521 StructFields.push_back(type);
522 type = va_arg(ap, llvm::Type*);
523 }
524 return StructType::get(StructFields);
525}
526
Owen Andersona8560212009-06-30 17:50:28 +0000527// ArrayType accessors
528ArrayType* LLVMContext::getArrayType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000529 uint64_t NumElements) {
Owen Andersona8560212009-06-30 17:50:28 +0000530 return ArrayType::get(ElementType, NumElements);
531}
532
533// PointerType accessors
534PointerType* LLVMContext::getPointerType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000535 unsigned AddressSpace) {
Owen Andersona8560212009-06-30 17:50:28 +0000536 return PointerType::get(ElementType, AddressSpace);
537}
538
Owen Anderson7d128072009-07-01 23:56:45 +0000539PointerType* LLVMContext::getPointerTypeUnqual(const Type* ElementType) {
Owen Andersona8560212009-06-30 17:50:28 +0000540 return PointerType::getUnqual(ElementType);
541}
542
543// VectorType accessors
544VectorType* LLVMContext::getVectorType(const Type* ElementType,
Bill Wendling4534d252009-07-01 22:33:26 +0000545 unsigned NumElements) {
Owen Andersona8560212009-06-30 17:50:28 +0000546 return VectorType::get(ElementType, NumElements);
547}
548
Bill Wendling4534d252009-07-01 22:33:26 +0000549VectorType* LLVMContext::getVectorTypeInteger(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000550 return VectorType::getInteger(VTy);
551}
552
Bill Wendling4534d252009-07-01 22:33:26 +0000553VectorType* LLVMContext::getVectorTypeExtendedElement(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000554 return VectorType::getExtendedElementVectorType(VTy);
555}
556
Bill Wendling4534d252009-07-01 22:33:26 +0000557VectorType* LLVMContext::getVectorTypeTruncatedElement(const VectorType* VTy) {
Owen Andersona8560212009-06-30 17:50:28 +0000558 return VectorType::getTruncatedElementVectorType(VTy);
559}
Owen Anderson1e5f00e2009-07-09 23:48:35 +0000560
561const Type* LLVMContext::makeCmpResultType(const Type* opnd_type) {
562 if (const VectorType* vt = dyn_cast<const VectorType>(opnd_type)) {
563 return getVectorType(Type::Int1Ty, vt->getNumElements());
564 }
565 return Type::Int1Ty;
566}