diff options
author | Chris Lattner <sabre@nondot.org> | 2007-08-26 04:50:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-08-26 04:50:19 +0000 |
commit | 2bbb4a1424048fa64b0b09d057b1c55dacd9c9c3 (patch) | |
tree | db73c26af87d60264f01b4331ac76471ead51293 /CodeGen/CodeGenTypes.cpp | |
parent | d3f6ca6942169131ce55dac18366d80f0393ed4f (diff) |
implement rudimentary union layout support.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41421 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | CodeGen/CodeGenTypes.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index 3888538864..9fb1568a03 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/CodeGen/CodeGenTypes.cpp @@ -143,15 +143,38 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) { if (!TD->isDefinition()) { ResultType = llvm::OpaqueType::get(); + } else if (TD->getKind() == Decl::Struct) { + const RecordDecl *RD = cast<const RecordDecl>(TD); + std::vector<const llvm::Type*> Fields; + for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i) + Fields.push_back(ConvertType(RD->getMember(i)->getType())); + ResultType = llvm::StructType::get(Fields); + } else if (TD->getKind() == Decl::Union) { + 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; + + for (unsigned i = 1, e = RD->getNumMembers(); i != e; ++i) { + std::pair<uint64_t, unsigned> EltInfo = + Context.getTypeInfo(RD->getMember(i)->getType(), SourceLocation()); + if (EltInfo.first > MaxElt.first || + (EltInfo.first == MaxElt.first && + EltInfo.second > MaxElt.second)) { + MaxElt = EltInfo; + MaxEltNo = i; + } + } + + Fields.push_back(ConvertType(RD->getMember(MaxEltNo)->getType())); + } + ResultType = llvm::StructType::get(Fields); } else { - if (TD->getKind() == Decl::Struct) { - const RecordDecl *RD = cast<const RecordDecl>(TD); - std::vector<const llvm::Type*> Fields; - for (unsigned i = 0, e = RD->getNumMembers(); i != e; ++i) - Fields.push_back(ConvertType(RD->getMember(i)->getType())); - ResultType = llvm::StructType::get(Fields); - } else - assert(0 && "FIXME: Implement tag decl kind!"); + assert(0 && "FIXME: Implement tag decl kind!"); } std::string TypeName(TD->getKindName()); |