From: Chris Lattner Date: Sun, 26 Aug 2007 04:50:19 +0000 (+0000) Subject: implement rudimentary union layout support. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2bbb4a1424048fa64b0b09d057b1c55dacd9c9c3;p=clang implement rudimentary union layout support. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41421 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(TD); + std::vector 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(TD); + // Just use the largest element of the union, breaking ties with the + // highest aligned member. + std::vector Fields; + if (RD->getNumMembers() != 0) { + std::pair MaxElt = + Context.getTypeInfo(RD->getMember(0)->getType(), SourceLocation()); + unsigned MaxEltNo = 0; + + for (unsigned i = 1, e = RD->getNumMembers(); i != e; ++i) { + std::pair 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(TD); - std::vector 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());