diff options
author | Devang Patel <dpatel@apple.com> | 2007-10-26 19:42:18 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-10-26 19:42:18 +0000 |
commit | abad06cfd01edbd6ffe80856304b5ad991b67d08 (patch) | |
tree | 7e5d788c1c3611ebeae6b53eeb7452f3b684b7ef /CodeGen/CodeGenTypes.cpp | |
parent | 0a96118bb8cec6224aef53f001a0a4f87a7be8fb (diff) |
Codegen union member references.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43390 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | CodeGen/CodeGenTypes.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index 0b225291d2..8b87328668 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/CodeGen/CodeGenTypes.cpp @@ -258,13 +258,15 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { const RecordDecl *RD = cast<const RecordDecl>(TD); // Just use the largest element of the union, breaking ties with the // highest aligned member. - std::vector<const llvm::Type*> Fields; + if (RD->getNumMembers() != 0) { std::pair<uint64_t, unsigned> MaxElt = Context.getTypeInfo(RD->getMember(0)->getType(), SourceLocation()); unsigned MaxEltNo = 0; - + addFieldInfo(RD->getMember(0), 0); // Each field gets first slot. + // FIXME : Move union field handling in RecordOrganize for (unsigned i = 1, e = RD->getNumMembers(); i != e; ++i) { + addFieldInfo(RD->getMember(i), 0); // Each field gets first slot. std::pair<uint64_t, unsigned> EltInfo = Context.getTypeInfo(RD->getMember(i)->getType(), SourceLocation()); if (EltInfo.first > MaxElt.first || @@ -274,10 +276,19 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { MaxEltNo = i; } } - - Fields.push_back(ConvertType(RD->getMember(MaxEltNo)->getType())); - } - ResultType = llvm::StructType::get(Fields); + + RecordOrganizer RO; + RO.addField(RD->getMember(MaxEltNo)); + RO.layoutFields(*this); + + // Get llvm::StructType. + RecordLayoutInfo *RLI = new RecordLayoutInfo(RO.getLLVMType()); + ResultType = RLI->getLLVMType(); + RecordLayouts[ResultType] = RLI; + } else { + std::vector<const llvm::Type*> Fields; + ResultType = llvm::StructType::get(Fields); + } } else { assert(0 && "FIXME: Implement tag decl kind!"); } |