CodeGenTypes.cpp revision ce5605ecf76d8cde6372138f830bb144d174ced9
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenTypes.cpp - Type translation for LLVM CodeGen -------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This is the code that handles AST -> LLVM type lowering. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "CodeGenTypes.h" 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/AST.h" 175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/DerivedTypes.h" 184e533287e6a9adac78c9ac370612581aad9b8c5eAnders Carlsson#include "llvm/Module.h" 19d9e9ede6b1703849da739629904dad197306e527Devang Patel#include "llvm/Target/TargetData.h" 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace CodeGen; 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24057afddf0fab91d979d6a750667d56a345225c96Devang Patelnamespace { 2588a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel /// RecordOrganizer - This helper class, used by CGRecordLayout, layouts 26057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// structs and unions. It manages transient information used during layout. 274c4635c6cd8114bfa3ee20628fa1f03e67ac1e55Devang Patel /// FIXME : Handle field aligments. Handle packed structs. 28057afddf0fab91d979d6a750667d56a345225c96Devang Patel class RecordOrganizer { 29057afddf0fab91d979d6a750667d56a345225c96Devang Patel public: 30f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel explicit RecordOrganizer(CodeGenTypes &Types) : 312c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio CGT(Types), STy(NULL), llvmFieldNo(0), Cursor(0), 322c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio llvmSize(0) {} 33057afddf0fab91d979d6a750667d56a345225c96Devang Patel 34057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// addField - Add new field. 35057afddf0fab91d979d6a750667d56a345225c96Devang Patel void addField(const FieldDecl *FD); 36057afddf0fab91d979d6a750667d56a345225c96Devang Patel 37159e3300f938ae05c0bf249508714e621cc89de5Devang Patel /// addLLVMField - Add llvm struct field that corresponds to llvm type Ty. 382c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio /// Increment field count. 395bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel void addLLVMField(const llvm::Type *Ty, bool isPaddingField = false); 400bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel 41b70a88e67491d41877aab3a56947866e70435d64Devang Patel /// addPaddingFields - Current cursor is not suitable place to add next 42b70a88e67491d41877aab3a56947866e70435d64Devang Patel /// field. Add required padding fields. 43dd6ecdb68b511cf672413f0f1bec027742de90f9Devang Patel void addPaddingFields(unsigned WaterMark); 440bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel 4586522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel /// layoutStructFields - Do the actual work and lay out all fields. Create 46057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// corresponding llvm struct type. This should be invoked only after 47057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// all fields are added. 4888a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel void layoutStructFields(const ASTRecordLayout &RL); 4986522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 5086522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel /// layoutUnionFields - Do the actual work and lay out all fields. Create 5186522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel /// corresponding llvm struct type. This should be invoked only after 5286522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel /// all fields are added. 53f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel void layoutUnionFields(); 54057afddf0fab91d979d6a750667d56a345225c96Devang Patel 55057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// getLLVMType - Return associated llvm struct type. This may be NULL 56057afddf0fab91d979d6a750667d56a345225c96Devang Patel /// if fields are not laid out. 57057afddf0fab91d979d6a750667d56a345225c96Devang Patel llvm::Type *getLLVMType() const { 58057afddf0fab91d979d6a750667d56a345225c96Devang Patel return STy; 59057afddf0fab91d979d6a750667d56a345225c96Devang Patel } 60057afddf0fab91d979d6a750667d56a345225c96Devang Patel 61382c64365247fa01e2711da27ef4bef0653afca4Devang Patel /// placeBitField - Find a place for FD, which is a bit-field. 62382c64365247fa01e2711da27ef4bef0653afca4Devang Patel void placeBitField(const FieldDecl *FD); 63382c64365247fa01e2711da27ef4bef0653afca4Devang Patel 64eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel llvm::SmallSet<unsigned, 8> &getPaddingFields() { 655bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel return PaddingFields; 665bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel } 675bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel 68057afddf0fab91d979d6a750667d56a345225c96Devang Patel private: 69f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel CodeGenTypes &CGT; 70057afddf0fab91d979d6a750667d56a345225c96Devang Patel llvm::Type *STy; 712c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned llvmFieldNo; 722c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio uint64_t Cursor; 73dd6ecdb68b511cf672413f0f1bec027742de90f9Devang Patel uint64_t llvmSize; 74057afddf0fab91d979d6a750667d56a345225c96Devang Patel llvm::SmallVector<const FieldDecl *, 8> FieldDecls; 750bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel std::vector<const llvm::Type*> LLVMFields; 76eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel llvm::SmallSet<unsigned, 8> PaddingFields; 77057afddf0fab91d979d6a750667d56a345225c96Devang Patel }; 78057afddf0fab91d979d6a750667d56a345225c96Devang Patel} 79057afddf0fab91d979d6a750667d56a345225c96Devang Patel 807a4718e813e5e99d478567a482217c7eef8572c5Devang PatelCodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M, 817a4718e813e5e99d478567a482217c7eef8572c5Devang Patel const llvm::TargetData &TD) 827a4718e813e5e99d478567a482217c7eef8572c5Devang Patel : Context(Ctx), Target(Ctx.Target), TheModule(M), TheTargetData(TD) { 83d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner} 845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 85b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang PatelCodeGenTypes::~CodeGenTypes() { 86af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner for(llvm::DenseMap<const TagDecl *, CGRecordLayout *>::iterator 8788a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel I = CGRecordLayouts.begin(), E = CGRecordLayouts.end(); 88b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel I != E; ++I) 89b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel delete I->second; 9088a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel CGRecordLayouts.clear(); 91b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 92b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// ConvertType - Convert the specified type to its LLVM form. 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst llvm::Type *CodeGenTypes::ConvertType(QualType T) { 9530ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel // See if type is already cached. 960ffe89ab1e4890899e0e11a6f68223567a69b38aDevang Patel llvm::DenseMap<Type *, llvm::PATypeHolder>::iterator 975de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner I = TypeCache.find(T.getCanonicalType().getTypePtr()); 983c40085b373d8e6e4523812e06f73a0cb9d5142cDevang Patel // If type is found in map and this is not a definition for a opaque 99fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner // place holder type then use it. Otherwise, convert type T. 1004581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner if (I != TypeCache.end()) 10147c87b4b160d45285b24b1b7f4e3cbaaed3dc464Devang Patel return I->second.get(); 10230ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel 10330ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel const llvm::Type *ResultType = ConvertNewType(T); 1045de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner TypeCache.insert(std::make_pair(T.getCanonicalType().getTypePtr(), 1054581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner llvm::PATypeHolder(ResultType))); 10630ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel return ResultType; 10730ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel} 10830ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patel 1094581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner/// ConvertTypeForMem - Convert type T into a llvm::Type. This differs from 1104581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner/// ConvertType in that it is used to convert to the memory representation for 1114581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner/// a type. For example, the scalar representation for _Bool is i1, but the 1124581fff8af09a156a9dcc4de62587385c5da9574Chris Lattner/// memory representation is usually i8 or i32, depending on the target. 11319009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattnerconst llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T) { 11419009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner const llvm::Type *R = ConvertType(T); 11519009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner 11619009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner // If this is a non-bool type, don't map it. 11719009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner if (R != llvm::Type::Int1Ty) 11819009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner return R; 11919009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner 12019009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner // Otherwise, return an integer of the target-specified size. 12198be4943e8dc4f3905629a7102668960873cf863Chris Lattner return llvm::IntegerType::get((unsigned)Context.getTypeSize(T)); 12219009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner 12319009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner} 12419009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner 125c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner/// UpdateCompletedType - When we find the full definition for a TagDecl, 126c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattner/// replace the 'opaque' type we previously made for it if applicable. 127c5b8806cda286cf41866176ef98011fdaa68da01Chris Lattnervoid CodeGenTypes::UpdateCompletedType(const TagDecl *TD) { 128d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner llvm::DenseMap<const TagDecl*, llvm::PATypeHolder>::iterator TDTI = 1296ef58e36bbbfa232fe8b50309361e841985abfc6Chris Lattner TagDeclTypes.find(TD); 1306ef58e36bbbfa232fe8b50309361e841985abfc6Chris Lattner if (TDTI == TagDeclTypes.end()) return; 1316ef58e36bbbfa232fe8b50309361e841985abfc6Chris Lattner 1326ef58e36bbbfa232fe8b50309361e841985abfc6Chris Lattner // Remember the opaque LLVM type for this tagdecl. 133d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner llvm::PATypeHolder OpaqueHolder = TDTI->second; 134d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner assert(isa<llvm::OpaqueType>(OpaqueHolder.get()) && 1356ef58e36bbbfa232fe8b50309361e841985abfc6Chris Lattner "Updating compilation of an already non-opaque type?"); 136d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 137d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner // Remove it from TagDeclTypes so that it will be regenerated. 138d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner TagDeclTypes.erase(TDTI); 139d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 1408fb1dd005f4cb530bca11d622362d39727294420Chris Lattner // Generate the new type. 1418fb1dd005f4cb530bca11d622362d39727294420Chris Lattner const llvm::Type *NT = ConvertTagDeclType(TD); 142d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 1438fb1dd005f4cb530bca11d622362d39727294420Chris Lattner // Refine the old opaque type to its new definition. 1448fb1dd005f4cb530bca11d622362d39727294420Chris Lattner cast<llvm::OpaqueType>(OpaqueHolder.get())->refineAbstractTypeTo(NT); 145d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner} 146d86e6bc7ab4388a578daf46e7c76be9122a25072Chris Lattner 147391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// Produces a vector containing the all of the instance variables in an 148391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// Objective-C object, in the order that they appear. Used to create LLVM 149391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner/// structures corresponding to Objective-C objects. 150391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnervoid CodeGenTypes::CollectObjCIvarTypes(ObjCInterfaceDecl *ObjCClass, 151ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner std::vector<const llvm::Type*> &IvarTypes) { 152391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner ObjCInterfaceDecl *SuperClass = ObjCClass->getSuperClass(); 153ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner if (SuperClass) 154391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner CollectObjCIvarTypes(SuperClass, IvarTypes); 155ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner for (ObjCInterfaceDecl::ivar_iterator I = ObjCClass->ivar_begin(), 156ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner E = ObjCClass->ivar_end(); I != E; ++I) { 157ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner IvarTypes.push_back(ConvertType((*I)->getType())); 158ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner ObjCIvarInfo[*I] = IvarTypes.size() - 1; 159391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 160391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 16119009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner 16230ec9972be5a5af1f7a2277360dfa3aa1540b4faDevang Patelconst llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const clang::Type &Ty = *T.getCanonicalType(); 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (Ty.getTypeClass()) { 166d14faaa7ecbdf1dae6fa4b005b2993ba3ce30770Chris Lattner case Type::TypeName: // typedef isn't canonical. 167d14faaa7ecbdf1dae6fa4b005b2993ba3ce30770Chris Lattner case Type::TypeOfExp: // typeof isn't canonical. 168d14faaa7ecbdf1dae6fa4b005b2993ba3ce30770Chris Lattner case Type::TypeOfTyp: // typeof isn't canonical. 169d14faaa7ecbdf1dae6fa4b005b2993ba3ce30770Chris Lattner assert(0 && "Non-canonical type, shouldn't happen"); 1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::Builtin: { 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (cast<BuiltinType>(Ty).getKind()) { 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Void: 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // LLVM void type can only be used as the result of a function call. Just 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // map to the same as char. 175d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner return llvm::IntegerType::get(8); 1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Bool: 17819009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner // Note that we always return bool as i1 for use as a scalar type. 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return llvm::Type::Int1Ty; 1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 181d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Char_S: 182d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::Char_U: 183d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::SChar: 184d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner case BuiltinType::UChar: 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Short: 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UShort: 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Int: 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UInt: 1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Long: 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULong: 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongLong: 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULongLong: 19347f7dbf7c0b25505ad093a317983a9b39efe0610Chris Lattner return llvm::IntegerType::get( 19498be4943e8dc4f3905629a7102668960873cf863Chris Lattner static_cast<unsigned>(Context.getTypeSize(T))); 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Float: return llvm::Type::FloatTy; 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Double: return llvm::Type::DoubleTy; 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongDouble: 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: mapping long double onto double. 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return llvm::Type::DoubleTy; 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::Complex: { 205572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner const llvm::Type *EltTy = 206572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner ConvertType(cast<ComplexType>(Ty).getElementType()); 207572cf09ae8a78af1c56d40b016ec4cf1837163acChris Lattner return llvm::StructType::get(EltTy, EltTy, NULL); 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::Pointer: { 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const PointerType &P = cast<PointerType>(Ty); 211ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb QualType ETy = P.getPointeeType(); 212ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb return llvm::PointerType::get(ConvertType(ETy), ETy.getAddressSpace()); 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::Reference: { 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const ReferenceType &R = cast<ReferenceType>(Ty); 216ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb return llvm::PointerType::getUnqual(ConvertType(R.getReferenceeType())); 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 219fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::VariableArray: { 220fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff const VariableArrayType &A = cast<VariableArrayType>(Ty); 221c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman assert(A.getIndexTypeQualifier() == 0 && 2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer "FIXME: We only handle trivial array types so far!"); 223c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // VLAs resolve to the innermost element type; this matches 224c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // the return of alloca, and there isn't any obviously better choice. 225c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return ConvertType(A.getElementType()); 226c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman } 227c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman case Type::IncompleteArray: { 228c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman const IncompleteArrayType &A = cast<IncompleteArrayType>(Ty); 229c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman assert(A.getIndexTypeQualifier() == 0 && 230c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman "FIXME: We only handle trivial array types so far!"); 231c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman // int X[] -> [0 x int] 232c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return llvm::ArrayType::get(ConvertType(A.getElementType()), 0); 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 234fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case Type::ConstantArray: { 235fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff const ConstantArrayType &A = cast<ConstantArrayType>(Ty); 236fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff const llvm::Type *EltTy = ConvertType(A.getElementType()); 237fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff return llvm::ArrayType::get(EltTy, A.getSize().getZExtValue()); 238fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff } 239a87b63b492553f1d47c418ad8849383aa3fd1ed1Chris Lattner case Type::OCUVector: 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::Vector: { 2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const VectorType &VT = cast<VectorType>(Ty); 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return llvm::VectorType::get(ConvertType(VT.getElementType()), 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer VT.getNumElements()); 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::FunctionNoProto: 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Type::FunctionProto: { 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const FunctionType &FP = cast<FunctionType>(Ty); 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const llvm::Type *ResultType; 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (FP.getResultType()->isVoidType()) 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ResultType = llvm::Type::VoidTy; // Result of function uses llvm void. 2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ResultType = ConvertType(FP.getResultType()); 2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: Convert argument types. 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isVarArg; 2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::vector<const llvm::Type*> ArgTys; 2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Struct return passes the struct byref. 2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (!ResultType->isFirstClassType() && ResultType != llvm::Type::VoidTy) { 261fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner ArgTys.push_back(llvm::PointerType::get(ResultType, 262fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner FP.getResultType().getAddressSpace())); 2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ResultType = llvm::Type::VoidTy; 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const FunctionTypeProto *FTP = dyn_cast<FunctionTypeProto>(&FP)) { 2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer DecodeArgumentTypes(*FTP, ArgTys); 2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isVarArg = FTP->isVariadic(); 2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer isVarArg = true; 2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2734ef9be79ca5cb133f95d3446aa20d8261806dbefChris Lattner return llvm::FunctionType::get(ResultType, ArgTys, isVarArg); 2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 275ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb 276ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb case Type::ASQual: 277f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner return ConvertType(QualType(cast<ASQualType>(Ty).getBaseType(), 0)); 278b1776cb8d35dfa80bfd8606e58b8ade30dcd2438Chris Lattner 279391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner case Type::ObjCInterface: { 280391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Warning: Use of this is strongly discouraged. Late binding of instance 281391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // variables is supported on some runtimes and so using static binding can 282391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // break code when libraries are updated. Only use this if you have 283391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // previously checked that the ObjCRuntime subclass in use does not support 284391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // late-bound ivars. 285391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner ObjCInterfaceType OIT = cast<ObjCInterfaceType>(Ty); 286391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner std::vector<const llvm::Type*> IvarTypes; 287391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // Pointer to the class. This is just a placeholder. Operations that 288391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // actually use the isa pointer should cast it to the Class type provided 289391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner // by the runtime. 290391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner IvarTypes.push_back(llvm::PointerType::getUnqual(llvm::Type::Int8Ty)); 291391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner CollectObjCIvarTypes(OIT.getDecl(), IvarTypes); 292391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner return llvm::StructType::get(IvarTypes); 293391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner } 294e37882ad335896dedf345102bb425383e6221c37Fariborz Jahanian 295a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek case Type::ObjCQualifiedInterface: 296e37882ad335896dedf345102bb425383e6221c37Fariborz Jahanian assert(0 && "FIXME: add missing functionality here"); 297e37882ad335896dedf345102bb425383e6221c37Fariborz Jahanian break; 298b1776cb8d35dfa80bfd8606e58b8ade30dcd2438Chris Lattner 299a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek case Type::ObjCQualifiedId: 300c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian assert(0 && "FIXME: add missing functionality here"); 301c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian break; 302c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian 303de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner case Type::Tagged: { 304de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner const TagDecl *TD = cast<TagType>(Ty).getDecl(); 3058fb1dd005f4cb530bca11d622362d39727294420Chris Lattner const llvm::Type *Res = ConvertTagDeclType(TD); 306de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner 307de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner std::string TypeName(TD->getKindName()); 308de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner TypeName += '.'; 309de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner 310de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner // Name the codegen type after the typedef name 311de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner // if there is no tag type name available 312de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner if (TD->getIdentifier()) 313de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner TypeName += TD->getName(); 314de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner else if (const TypedefType *TdT = dyn_cast<TypedefType>(T)) 315de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner TypeName += TdT->getDecl()->getName(); 316de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner else 317de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner TypeName += "anon"; 318de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner 319de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner TheModule.addTypeName(TypeName, Res); 320de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner return Res; 321de0efb3b6eac36bdeae0e60f753a974cc4118a31Chris Lattner } 3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: implement. 3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return llvm::OpaqueType::get(); 3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid CodeGenTypes::DecodeArgumentTypes(const FunctionTypeProto &FTP, 3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::vector<const llvm::Type*> &ArgTys) { 3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = FTP.getNumArgs(); i != e; ++i) { 3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const llvm::Type *Ty = ConvertType(FTP.getArgType(i)); 3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Ty->isFirstClassType()) 3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ArgTys.push_back(Ty); 334fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner else 335fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner // byval arguments are always on the stack, which is addr space #0. 336fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner ArgTys.push_back(llvm::PointerType::getUnqual(Ty)); 3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 340fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner/// ConvertTagDeclType - Lay out a tagged decl type like struct or union or 341fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner/// enum. 3428fb1dd005f4cb530bca11d622362d39727294420Chris Lattnerconst llvm::Type *CodeGenTypes::ConvertTagDeclType(const TagDecl *TD) { 343fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner llvm::DenseMap<const TagDecl*, llvm::PATypeHolder>::iterator TDTI = 344fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner TagDeclTypes.find(TD); 345fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 3465de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // If we've already compiled this tag type, use the previous definition. 3475de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner if (TDTI != TagDeclTypes.end()) 348fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner return TDTI->second; 349fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 3505de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // If this is still a forward definition, just define an opaque type to use 3515de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // for this tagged decl. 352fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner if (!TD->isDefinition()) { 3535de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner llvm::Type *ResultType = llvm::OpaqueType::get(); 354fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner TagDeclTypes.insert(std::make_pair(TD, ResultType)); 3555de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner return ResultType; 3565de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner } 3575de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3585de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // Okay, this is a definition of a type. Compile the implementation now. 3595de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3605de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner if (TD->getKind() == Decl::Enum) { 361fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner // Don't bother storing enums in TagDeclTypes. 362fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner return ConvertType(cast<EnumDecl>(TD)->getIntegerType()); 3635de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner } 3645de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3655de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // This decl could well be recursive. In this case, insert an opaque 3665de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // definition of this type, which the recursive uses will get. We will then 3675de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // refine this opaque version later. 3685de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3695de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // Create new OpaqueType now for later use in case this is a recursive 3705de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // type. This will later be refined to the actual type. 3715de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner llvm::PATypeHolder ResultHolder = llvm::OpaqueType::get(); 3725de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner TagDeclTypes.insert(std::make_pair(TD, ResultHolder)); 3735de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3745de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner const llvm::Type *ResultType; 3755de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner const RecordDecl *RD = cast<const RecordDecl>(TD); 3765de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner if (TD->getKind() == Decl::Struct || TD->getKind() == Decl::Class) { 377fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner // Layout fields. 378fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner RecordOrganizer RO(*this); 379fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i) 380fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner RO.addField(RD->getMember(i)); 381fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 38298be4943e8dc4f3905629a7102668960873cf863Chris Lattner RO.layoutStructFields(Context.getASTRecordLayout(RD)); 383fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 3845de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // Get llvm::StructType. 3855de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner CGRecordLayouts[TD] = new CGRecordLayout(RO.getLLVMType(), 3865de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner RO.getPaddingFields()); 3875de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner ResultType = RO.getLLVMType(); 388fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 389fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner } else if (TD->getKind() == Decl::Union) { 390fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner // Just use the largest element of the union, breaking ties with the 391fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner // highest aligned member. 392fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner if (RD->getNumMembers() != 0) { 393fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner RecordOrganizer RO(*this); 394fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i) 395fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner RO.addField(RD->getMember(i)); 3965de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3975de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner RO.layoutUnionFields(); 3985de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 3995de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // Get llvm::StructType. 4005de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner CGRecordLayouts[TD] = new CGRecordLayout(RO.getLLVMType(), 4015de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner RO.getPaddingFields()); 4025de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner ResultType = RO.getLLVMType(); 403fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner } else { 4045de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner ResultType = llvm::StructType::get(std::vector<const llvm::Type*>()); 405fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner } 406fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner } else { 407fae6e2994a51d8ec1e61b6eb68765247c83b1ccfChris Lattner assert(0 && "FIXME: Unknown tag decl kind!"); 408fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner } 409fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 4105de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // Refine our Opaque type to ResultType. This can invalidate ResultType, so 4115de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner // make sure to read the result out of the holder. 4125de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner cast<llvm::OpaqueType>(ResultHolder.get()) 4135de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner ->refineAbstractTypeTo(ResultType); 4145de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner 4155de00fcf7c923a14bb79bdbaabb2faeb5633d85aChris Lattner return ResultHolder.get(); 416fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner} 417fc3b8e9c1381d5e6ec361591d649c56a870ff971Chris Lattner 418b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// getLLVMFieldNo - Return llvm::StructType element number 419b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// that corresponds to the field FD. 420b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patelunsigned CodeGenTypes::getLLVMFieldNo(const FieldDecl *FD) { 421ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner llvm::DenseMap<const FieldDecl*, unsigned>::iterator I = FieldInfo.find(FD); 42221fdf416723e8c475812a0324a1f9fafc949c25fHartmut Kaiser assert (I != FieldInfo.end() && "Unable to find field info"); 423b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel return I->second; 424b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 425b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 426391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattnerunsigned CodeGenTypes::getLLVMFieldNo(const ObjCIvarDecl *OID) { 427391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner llvm::DenseMap<const ObjCIvarDecl*, unsigned>::iterator 428391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner I = ObjCIvarInfo.find(OID); 429ce5605ecf76d8cde6372138f830bb144d174ced9Chris Lattner assert(I != ObjCIvarInfo.end() && "Unable to find field info"); 430391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner return I->second; 431391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner} 432391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner 433c4c429a1a5947ba9be64d3070741d98362872265Devang Patel/// addFieldInfo - Assign field number to field FD. 4342c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venanciovoid CodeGenTypes::addFieldInfo(const FieldDecl *FD, unsigned No) { 4352c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio FieldInfo[FD] = No; 4362c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio} 4372c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 4382c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// getBitFieldInfo - Return the BitFieldInfo that corresponds to the field FD. 4392c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos VenancioCodeGenTypes::BitFieldInfo CodeGenTypes::getBitFieldInfo(const FieldDecl *FD) { 4402c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio llvm::DenseMap<const FieldDecl *, BitFieldInfo>::iterator 4412c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio I = BitFields.find(FD); 4422c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio assert (I != BitFields.end() && "Unable to find bitfield info"); 4432c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio return I->second; 4442c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio} 4452c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 4462c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// addBitFieldInfo - Assign a start bit and a size to field FD. 4472c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venanciovoid CodeGenTypes::addBitFieldInfo(const FieldDecl *FD, unsigned Begin, 4481abc7f654df795549d4f6f3a018ddb3a8fff013aNate Begeman unsigned Size) { 4492c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio BitFields.insert(std::make_pair(FD, BitFieldInfo(Begin, Size))); 450b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 451b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 45288a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel/// getCGRecordLayout - Return record layout info for the given llvm::Type. 45388a981b47c7face1b1fdaa9074256245107b9ca9Devang Patelconst CGRecordLayout * 454af31913e48c96fddb45a0fd33f25617546502cbbChris LattnerCodeGenTypes::getCGRecordLayout(const TagDecl *TD) const { 455af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner llvm::DenseMap<const TagDecl*, CGRecordLayout *>::iterator I 456af31913e48c96fddb45a0fd33f25617546502cbbChris Lattner = CGRecordLayouts.find(TD); 45788a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel assert (I != CGRecordLayouts.end() 458b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel && "Unable to find record layout information for type"); 459b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel return I->second; 460b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 461b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 462b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// addField - Add new field. 463b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patelvoid RecordOrganizer::addField(const FieldDecl *FD) { 464b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel assert (!STy && "Record fields are already laid out"); 465b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel FieldDecls.push_back(FD); 466b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 467b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 46886522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel/// layoutStructFields - Do the actual work and lay out all fields. Create 469b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// corresponding llvm struct type. This should be invoked only after 470b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// all fields are added. 471b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// FIXME : At the moment assume 472b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// - one to one mapping between AST FieldDecls and 473b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// llvm::StructType elements. 474b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// - Ignore bit fields 475b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// - Ignore field aligments 476b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel/// - Ignore packed structs 47788a981b47c7face1b1fdaa9074256245107b9ca9Devang Patelvoid RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) { 478b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel // FIXME : Use SmallVector 4792c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio llvmSize = 0; 4802c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio llvmFieldNo = 0; 481f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel Cursor = 0; 4820bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel LLVMFields.clear(); 4832c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 484b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel for (llvm::SmallVector<const FieldDecl *, 8>::iterator I = FieldDecls.begin(), 485655bf3df1fa7f5ab992dd813c9088375df746ed0Devang Patel E = FieldDecls.end(); I != E; ++I) { 486b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel const FieldDecl *FD = *I; 487b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel 488382c64365247fa01e2711da27ef4bef0653afca4Devang Patel if (FD->isBitField()) 489382c64365247fa01e2711da27ef4bef0653afca4Devang Patel placeBitField(FD); 490382c64365247fa01e2711da27ef4bef0653afca4Devang Patel else { 491159e3300f938ae05c0bf249508714e621cc89de5Devang Patel const llvm::Type *Ty = CGT.ConvertType(FD->getType()); 4922c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio addLLVMField(Ty); 4932c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio CGT.addFieldInfo(FD, llvmFieldNo - 1); 4942c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio Cursor = llvmSize; 495159e3300f938ae05c0bf249508714e621cc89de5Devang Patel } 496b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel } 4976e8df736939325bc2355eeb1e138ecf8b2605616Devang Patel 4982c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned StructAlign = RL.getAlignment(); 4992c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio if (llvmSize % StructAlign) { 5002c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned StructPadding = StructAlign - (llvmSize % StructAlign); 5012c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio addPaddingFields(llvmSize + StructPadding); 5022c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio } 5036e8df736939325bc2355eeb1e138ecf8b2605616Devang Patel 5040bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel STy = llvm::StructType::get(LLVMFields); 5050bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel} 5060bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel 507f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel/// addPaddingFields - Current cursor is not suitable place to add next field. 508f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel/// Add required padding fields. 509dd6ecdb68b511cf672413f0f1bec027742de90f9Devang Patelvoid RecordOrganizer::addPaddingFields(unsigned WaterMark) { 5108432f4b4cdd1707f7f5dc06f35b4597dca252f2cLauro Ramos Venancio assert(WaterMark >= llvmSize && "Invalid padding Field"); 5112c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned RequiredBits = WaterMark - llvmSize; 5122c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned RequiredBytes = (RequiredBits + 7) / 8; 513f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel for (unsigned i = 0; i != RequiredBytes; ++i) 5145bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel addLLVMField(llvm::Type::Int8Ty, true); 515f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel} 516f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patel 517b70a88e67491d41877aab3a56947866e70435d64Devang Patel/// addLLVMField - Add llvm struct field that corresponds to llvm type Ty. 5182c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// Increment field count. 5195bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patelvoid RecordOrganizer::addLLVMField(const llvm::Type *Ty, bool isPaddingField) { 520159e3300f938ae05c0bf249508714e621cc89de5Devang Patel 521159e3300f938ae05c0bf249508714e621cc89de5Devang Patel unsigned AlignmentInBits = CGT.getTargetData().getABITypeAlignment(Ty) * 8; 5222c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio if (llvmSize % AlignmentInBits) { 523159e3300f938ae05c0bf249508714e621cc89de5Devang Patel // At the moment, insert padding fields even if target specific llvm 524159e3300f938ae05c0bf249508714e621cc89de5Devang Patel // type alignment enforces implict padding fields for FD. Later on, 525159e3300f938ae05c0bf249508714e621cc89de5Devang Patel // optimize llvm fields by removing implicit padding fields and 526159e3300f938ae05c0bf249508714e621cc89de5Devang Patel // combining consequetive padding fields. 5272c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned Padding = AlignmentInBits - (llvmSize % AlignmentInBits); 5282c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio addPaddingFields(llvmSize + Padding); 5292c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio } 530159e3300f938ae05c0bf249508714e621cc89de5Devang Patel 5312c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio unsigned TySize = CGT.getTargetData().getABITypeSizeInBits(Ty); 5322c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio llvmSize += TySize; 5335bfc1a7ecb853cf87d10e720a07b9fbcd2a223eeDevang Patel if (isPaddingField) 534eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel PaddingFields.insert(llvmFieldNo); 5350bd41f2cea0639395e8ab7ef8fd6df2c1999b6aeDevang Patel LLVMFields.push_back(Ty); 5362c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio ++llvmFieldNo; 537b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel} 538c4c429a1a5947ba9be64d3070741d98362872265Devang Patel 53986522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel/// layoutUnionFields - Do the actual work and lay out all fields. Create 54086522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel/// corresponding llvm struct type. This should be invoked only after 54186522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel/// all fields are added. 542f9fef925644a6c40b344a43ab9ebdb08a707de53Devang Patelvoid RecordOrganizer::layoutUnionFields() { 54386522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 54486522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel unsigned PrimaryEltNo = 0; 54586522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel std::pair<uint64_t, unsigned> PrimaryElt = 54698be4943e8dc4f3905629a7102668960873cf863Chris Lattner CGT.getContext().getTypeInfo(FieldDecls[0]->getType()); 5472c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio CGT.addFieldInfo(FieldDecls[0], 0); 54886522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 54986522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel unsigned Size = FieldDecls.size(); 55086522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel for(unsigned i = 1; i != Size; ++i) { 55186522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel const FieldDecl *FD = FieldDecls[i]; 552159e3300f938ae05c0bf249508714e621cc89de5Devang Patel assert (!FD->isBitField() && "Bit fields are not yet supported"); 55386522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel std::pair<uint64_t, unsigned> EltInfo = 55498be4943e8dc4f3905629a7102668960873cf863Chris Lattner CGT.getContext().getTypeInfo(FD->getType()); 55586522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 55686522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel // Use largest element, breaking ties with the hightest aligned member. 55786522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel if (EltInfo.first > PrimaryElt.first || 55886522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel (EltInfo.first == PrimaryElt.first && 55986522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel EltInfo.second > PrimaryElt.second)) { 56086522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel PrimaryElt = EltInfo; 56186522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel PrimaryEltNo = i; 56286522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel } 56386522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 56486522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel // In union, each field gets first slot. 5652c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio CGT.addFieldInfo(FD, 0); 56686522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel } 56786522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 56886522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel std::vector<const llvm::Type*> Fields; 56986522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel const llvm::Type *Ty = CGT.ConvertType(FieldDecls[PrimaryEltNo]->getType()); 57086522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel Fields.push_back(Ty); 57186522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel STy = llvm::StructType::get(Fields); 57286522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel} 57386522b9e84d0c39f09b54e888538ad64e89788c4Devang Patel 5742c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// placeBitField - Find a place for FD, which is a bit-field. 5752c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// This function searches for the last aligned field. If the bit-field fits in 5762c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio/// it, it is reused. Otherwise, the bit-field is placed in a new field. 577382c64365247fa01e2711da27ef4bef0653afca4Devang Patelvoid RecordOrganizer::placeBitField(const FieldDecl *FD) { 578382c64365247fa01e2711da27ef4bef0653afca4Devang Patel 579382c64365247fa01e2711da27ef4bef0653afca4Devang Patel assert (FD->isBitField() && "FD is not a bit-field"); 580382c64365247fa01e2711da27ef4bef0653afca4Devang Patel Expr *BitWidth = FD->getBitWidth(); 581382c64365247fa01e2711da27ef4bef0653afca4Devang Patel llvm::APSInt FieldSize(32); 582382c64365247fa01e2711da27ef4bef0653afca4Devang Patel bool isBitField = 583382c64365247fa01e2711da27ef4bef0653afca4Devang Patel BitWidth->isIntegerConstantExpr(FieldSize, CGT.getContext()); 584382c64365247fa01e2711da27ef4bef0653afca4Devang Patel assert (isBitField && "Invalid BitField size expression"); 585382c64365247fa01e2711da27ef4bef0653afca4Devang Patel uint64_t BitFieldSize = FieldSize.getZExtValue(); 5862c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 5872c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio const llvm::Type *Ty = CGT.ConvertType(FD->getType()); 5882c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio uint64_t TySize = CGT.getTargetData().getABITypeSizeInBits(Ty); 5892c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 590d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio unsigned Idx = Cursor / TySize; 591d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio unsigned BitsLeft = TySize - (Cursor % TySize); 5922c46ce8de96787aa8e040690a80896f1148c29b0Lauro Ramos Venancio 593d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio if (BitsLeft >= BitFieldSize) { 594d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // The bitfield fits in the last aligned field. 595d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // This is : struct { char a; int CurrentField:10;}; 596d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // where 'CurrentField' shares first field with 'a'. 597d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio CGT.addFieldInfo(FD, Idx); 598d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio CGT.addBitFieldInfo(FD, TySize - BitsLeft, BitFieldSize); 599d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio Cursor += BitFieldSize; 600d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio } else { 601d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // Place the bitfield in a new LLVM field. 602d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // This is : struct { char a; short CurrentField:10;}; 603d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio // where 'CurrentField' needs a new llvm field. 604d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio CGT.addFieldInfo(FD, Idx + 1); 605d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio CGT.addBitFieldInfo(FD, 0, BitFieldSize); 606d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio Cursor = (Idx + 1) * TySize + BitFieldSize; 607d957aa09333ff428f9675fb9f66dde632c2bcf5dLauro Ramos Venancio } 608c0959fc20d40fbe0c44a88eb1d7fc9395a163840Lauro Ramos Venancio if (Cursor > llvmSize) 609c0959fc20d40fbe0c44a88eb1d7fc9395a163840Lauro Ramos Venancio addPaddingFields(Cursor); 610382c64365247fa01e2711da27ef4bef0653afca4Devang Patel} 611