aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CodeGenTypes.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-10-26 19:42:18 +0000
committerDevang Patel <dpatel@apple.com>2007-10-26 19:42:18 +0000
commitabad06cfd01edbd6ffe80856304b5ad991b67d08 (patch)
tree7e5d788c1c3611ebeae6b53eeb7452f3b684b7ef /CodeGen/CodeGenTypes.cpp
parent0a96118bb8cec6224aef53f001a0a4f87a7be8fb (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.cpp23
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!");
}