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