138f488e46292e38c776dd6ec3e3a0b8c57952fcbChandler Carruth//===- llvm/unittest/TypeBuilderTest.cpp - TypeBuilder tests --------------===//
2096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner//
3096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner//                     The LLVM Compiler Infrastructure
4096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner//
5096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner// This file is distributed under the University of Illinois Open Source
6096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner// License. See LICENSE.TXT for details.
7096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner//
8096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner//===----------------------------------------------------------------------===//
9096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
1038f488e46292e38c776dd6ec3e3a0b8c57952fcbChandler Carruth#include "llvm/TypeBuilder.h"
11a439ee027bc908cd18e75703370174e053699b8aOwen Anderson#include "llvm/LLVMContext.h"
12e817127e0a413bd934546b7d9b79a2b589c180b3Chris Lattner#include "llvm/ADT/ArrayRef.h"
13096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
14096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner#include "gtest/gtest.h"
15096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
16096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnerusing namespace llvm;
17096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
18096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnernamespace {
19096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
20096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, Void) {
211d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, true>::get(getGlobalContext())));
221d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getVoidTy(getGlobalContext()), (TypeBuilder<void, false>::get(getGlobalContext())));
235e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin  // Special cases for C compatibility:
24ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands  EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
25a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<void*, false>::get(getGlobalContext())));
265e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin  EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
275e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin            (TypeBuilder<const void*, false>::get(getGlobalContext())));
285e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin  EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
295e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin            (TypeBuilder<volatile void*, false>::get(getGlobalContext())));
305e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin  EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
315e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin            (TypeBuilder<const volatile void*, false>::get(
325e24737d16e1c2aab65d24ff2a10ffc5255864f9Jeffrey Yasskin              getGlobalContext())));
33096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
34096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
35096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, HostIntegers) {
361d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()), (TypeBuilder<int8_t, false>::get(getGlobalContext())));
371d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()), (TypeBuilder<uint8_t, false>::get(getGlobalContext())));
381d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt16Ty(getGlobalContext()), (TypeBuilder<int16_t, false>::get(getGlobalContext())));
391d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt16Ty(getGlobalContext()), (TypeBuilder<uint16_t, false>::get(getGlobalContext())));
401d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt32Ty(getGlobalContext()), (TypeBuilder<int32_t, false>::get(getGlobalContext())));
411d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt32Ty(getGlobalContext()), (TypeBuilder<uint32_t, false>::get(getGlobalContext())));
421d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt64Ty(getGlobalContext()), (TypeBuilder<int64_t, false>::get(getGlobalContext())));
431d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt64Ty(getGlobalContext()), (TypeBuilder<uint64_t, false>::get(getGlobalContext())));
441d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson
451d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), sizeof(size_t) * CHAR_BIT),
46a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<size_t, false>::get(getGlobalContext())));
471d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), sizeof(ptrdiff_t) * CHAR_BIT),
48a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<ptrdiff_t, false>::get(getGlobalContext())));
49096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
50096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
51096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, CrossCompilableIntegers) {
521d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), 1), (TypeBuilder<types::i<1>, true>::get(getGlobalContext())));
531d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), 1), (TypeBuilder<types::i<1>, false>::get(getGlobalContext())));
541d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), 72), (TypeBuilder<types::i<72>, true>::get(getGlobalContext())));
551d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(IntegerType::get(getGlobalContext(), 72), (TypeBuilder<types::i<72>, false>::get(getGlobalContext())));
56096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
57096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
58096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, Float) {
591d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getFloatTy(getGlobalContext()), (TypeBuilder<float, false>::get(getGlobalContext())));
601d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getDoubleTy(getGlobalContext()), (TypeBuilder<double, false>::get(getGlobalContext())));
61096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // long double isn't supported yet.
621d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getFloatTy(getGlobalContext()), (TypeBuilder<types::ieee_float, true>::get(getGlobalContext())));
631d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getFloatTy(getGlobalContext()), (TypeBuilder<types::ieee_float, false>::get(getGlobalContext())));
641d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getDoubleTy(getGlobalContext()), (TypeBuilder<types::ieee_double, true>::get(getGlobalContext())));
651d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getDoubleTy(getGlobalContext()), (TypeBuilder<types::ieee_double, false>::get(getGlobalContext())));
661d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getX86_FP80Ty(getGlobalContext()), (TypeBuilder<types::x86_fp80, true>::get(getGlobalContext())));
671d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getX86_FP80Ty(getGlobalContext()), (TypeBuilder<types::x86_fp80, false>::get(getGlobalContext())));
681d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getFP128Ty(getGlobalContext()), (TypeBuilder<types::fp128, true>::get(getGlobalContext())));
691d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getFP128Ty(getGlobalContext()), (TypeBuilder<types::fp128, false>::get(getGlobalContext())));
701d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getPPC_FP128Ty(getGlobalContext()), (TypeBuilder<types::ppc_fp128, true>::get(getGlobalContext())));
711d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getPPC_FP128Ty(getGlobalContext()), (TypeBuilder<types::ppc_fp128, false>::get(getGlobalContext())));
72096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
73096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
74096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, Derived) {
75ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands  EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
76a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t**, false>::get(getGlobalContext())));
771d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
78a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t[7], false>::get(getGlobalContext())));
791d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0),
80a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t[], false>::get(getGlobalContext())));
81096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
82ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands  EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
83a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>**, false>::get(getGlobalContext())));
841d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
85a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>[7], false>::get(getGlobalContext())));
861d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0),
87a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>[], false>::get(getGlobalContext())));
88096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
89ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands  EXPECT_EQ(PointerType::getUnqual(Type::getInt8PtrTy(getGlobalContext())),
90a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>**, true>::get(getGlobalContext())));
911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 7),
92a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>[7], true>::get(getGlobalContext())));
931d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(ArrayType::get(Type::getInt8Ty(getGlobalContext()), 0),
94a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<types::i<8>[], true>::get(getGlobalContext())));
95096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
96096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
98a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const int8_t, false>::get(getGlobalContext())));
991d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
100a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<volatile int8_t, false>::get(getGlobalContext())));
1011d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
102a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const volatile int8_t, false>::get(getGlobalContext())));
103096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
1041d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
105a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const types::i<8>, false>::get(getGlobalContext())));
1061d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
107a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<volatile types::i<8>, false>::get(getGlobalContext())));
1081d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
109a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const volatile types::i<8>, false>::get(getGlobalContext())));
110096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
1111d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
112a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const types::i<8>, true>::get(getGlobalContext())));
1131d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
114a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<volatile types::i<8>, true>::get(getGlobalContext())));
1151d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(Type::getInt8Ty(getGlobalContext()),
116a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const volatile types::i<8>, true>::get(getGlobalContext())));
117096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
118ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands  EXPECT_EQ(Type::getInt8PtrTy(getGlobalContext()),
119a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<const volatile int8_t*const volatile, false>::get(getGlobalContext())));
120096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
121096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
122096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, Functions) {
1235fdd6c8793462549e3593890ec61573da06e3346Jay Foad  std::vector<Type*> params;
1241d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getVoidTy(getGlobalContext()), params, false),
125a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<void(), true>::get(getGlobalContext())));
1261d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
127a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(...), false>::get(getGlobalContext())));
128a439ee027bc908cd18e75703370174e053699b8aOwen Anderson  params.push_back(TypeBuilder<int32_t*, false>::get(getGlobalContext()));
1291d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, false),
130a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(const int32_t*), false>::get(getGlobalContext())));
1311d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
132a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(const int32_t*, ...), false>::get(getGlobalContext())));
133a439ee027bc908cd18e75703370174e053699b8aOwen Anderson  params.push_back(TypeBuilder<char*, false>::get(getGlobalContext()));
1341d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, false),
135a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(int32_t*, void*), false>::get(getGlobalContext())));
1361d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
137a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(int32_t*, char*, ...), false>::get(getGlobalContext())));
138a439ee027bc908cd18e75703370174e053699b8aOwen Anderson  params.push_back(TypeBuilder<char, false>::get(getGlobalContext()));
1391d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, false),
140a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(int32_t*, void*, char), false>::get(getGlobalContext())));
1411d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
142a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(int32_t*, char*, char, ...), false>::get(getGlobalContext())));
143a439ee027bc908cd18e75703370174e053699b8aOwen Anderson  params.push_back(TypeBuilder<char, false>::get(getGlobalContext()));
1441d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, false),
145a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<int8_t(int32_t*, void*, char, char), false>::get(getGlobalContext())));
1461d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
147096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner            (TypeBuilder<int8_t(int32_t*, char*, char, char, ...),
148a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                         false>::get(getGlobalContext())));
149a439ee027bc908cd18e75703370174e053699b8aOwen Anderson  params.push_back(TypeBuilder<char, false>::get(getGlobalContext()));
1501d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, false),
151096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner            (TypeBuilder<int8_t(int32_t*, void*, char, char, char),
152a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                         false>::get(getGlobalContext())));
1531d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  EXPECT_EQ(FunctionType::get(Type::getInt8Ty(getGlobalContext()), params, true),
154096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner            (TypeBuilder<int8_t(int32_t*, char*, char, char, char, ...),
155a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                         false>::get(getGlobalContext())));
156096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
157096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
1584a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey YasskinTEST(TypeBuilderTest, Context) {
1594a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  // We used to cache TypeBuilder results in static local variables.  This
1604a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  // produced the same type for different contexts, which of course broke
1614a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  // things.
1624a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  LLVMContext context1;
1634a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  EXPECT_EQ(&context1,
1644a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin            &(TypeBuilder<types::i<1>, true>::get(context1))->getContext());
1654a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  LLVMContext context2;
1664a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin  EXPECT_EQ(&context2,
1674a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin            &(TypeBuilder<types::i<1>, true>::get(context2))->getContext());
1684a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin}
1694a38930a4595d94b1f379d6955c531c48e5c2aa0Jeffrey Yasskin
17095a9d937728ca9cf2bf44f86ff1184df318b3bd7Benjamin Kramerstruct MyType {
171096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  int a;
172096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  int *b;
173096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  void *array[1];
174096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner};
175096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
17695a9d937728ca9cf2bf44f86ff1184df318b3bd7Benjamin Kramerstruct MyPortableType {
177096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  int32_t a;
178096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  int32_t *b;
179096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  void *array[1];
180096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner};
181096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
182096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}  // anonymous namespace
183096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
184096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnernamespace llvm {
185096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnertemplate<bool cross> class TypeBuilder<MyType, cross> {
186096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnerpublic:
187db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  static StructType *get(LLVMContext &Context) {
188096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    // Using the static result variable ensures that the type is
189096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    // only looked up once.
1905fdd6c8793462549e3593890ec61573da06e3346Jay Foad    std::vector<Type*> st;
191a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<int, cross>::get(Context));
192a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<int*, cross>::get(Context));
193a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<void*[], cross>::get(Context));
194db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    static StructType *const result = StructType::get(Context, st);
195096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    return result;
196096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  }
197096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
198096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // You may find this a convenient place to put some constants
199096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // to help with getelementptr.  They don't have any effect on
200096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // the operation of TypeBuilder.
201096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  enum Fields {
202096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_A,
203096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_B,
204096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_ARRAY
205096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  };
206096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner};
207096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
208096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnertemplate<bool cross> class TypeBuilder<MyPortableType, cross> {
209096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnerpublic:
210db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  static StructType *get(LLVMContext &Context) {
211096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    // Using the static result variable ensures that the type is
212096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    // only looked up once.
2135fdd6c8793462549e3593890ec61573da06e3346Jay Foad    std::vector<Type*> st;
214a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<types::i<32>, cross>::get(Context));
215a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<types::i<32>*, cross>::get(Context));
216a439ee027bc908cd18e75703370174e053699b8aOwen Anderson    st.push_back(TypeBuilder<types::i<8>*[], cross>::get(Context));
217db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    static StructType *const result = StructType::get(Context, st);
218096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    return result;
219096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  }
220096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
221096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // You may find this a convenient place to put some constants
222096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // to help with getelementptr.  They don't have any effect on
223096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  // the operation of TypeBuilder.
224096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  enum Fields {
225096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_A,
226096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_B,
227096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner    FIELD_ARRAY
228096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner  };
229096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner};
230096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}  // namespace llvm
231096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattnernamespace {
232096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
233096fd7b5a7b19912bfedeaef870a0c655f16e325Chris LattnerTEST(TypeBuilderTest, Extensions) {
234b2318662b6d2e6d9ea9917fd280dde0ba9a938adChris Lattner  EXPECT_EQ(PointerType::getUnqual(StructType::get(
235a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<int, false>::get(getGlobalContext()),
236a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<int*, false>::get(getGlobalContext()),
237a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<void*[], false>::get(getGlobalContext()),
238f56dc281ceea53f191ee3fb773a44aa4e5dc76ceEli Friedman                                     (void*)0)),
239a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<MyType*, false>::get(getGlobalContext())));
240b2318662b6d2e6d9ea9917fd280dde0ba9a938adChris Lattner  EXPECT_EQ(PointerType::getUnqual(StructType::get(
241a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<32>, false>::get(getGlobalContext()),
242a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<32>*, false>::get(getGlobalContext()),
243a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<8>*[], false>::get(getGlobalContext()),
244f56dc281ceea53f191ee3fb773a44aa4e5dc76ceEli Friedman                                     (void*)0)),
245a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<MyPortableType*, false>::get(getGlobalContext())));
246b2318662b6d2e6d9ea9917fd280dde0ba9a938adChris Lattner  EXPECT_EQ(PointerType::getUnqual(StructType::get(
247a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<32>, false>::get(getGlobalContext()),
248a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<32>*, false>::get(getGlobalContext()),
249a439ee027bc908cd18e75703370174e053699b8aOwen Anderson                                     TypeBuilder<types::i<8>*[], false>::get(getGlobalContext()),
250f56dc281ceea53f191ee3fb773a44aa4e5dc76ceEli Friedman                                     (void*)0)),
251a439ee027bc908cd18e75703370174e053699b8aOwen Anderson            (TypeBuilder<MyPortableType*, true>::get(getGlobalContext())));
252096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}
253096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner
254096fd7b5a7b19912bfedeaef870a0c655f16e325Chris Lattner}  // anonymous namespace
255