diff options
author | Anders Carlsson <andersca@mac.com> | 2007-08-17 22:00:32 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2007-08-17 22:00:32 +0000 |
commit | 4e533287e6a9adac78c9ac370612581aad9b8c5e (patch) | |
tree | e27e5366851f32119ce5acd9d991dee60340b3f2 /CodeGen/CodeGenTypes.cpp | |
parent | 06de276fff91264437fa75111ed76de43097e089 (diff) |
Add preliminary support for converting struct types.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41145 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | CodeGen/CodeGenTypes.cpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index 3854465ea4..6a2bb1e273 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/CodeGen/CodeGenTypes.cpp @@ -15,12 +15,13 @@ #include "clang/Basic/TargetInfo.h" #include "clang/AST/AST.h" #include "llvm/DerivedTypes.h" +#include "llvm/Module.h" using namespace clang; using namespace CodeGen; -CodeGenTypes::CodeGenTypes(ASTContext &Ctx) - : Context(Ctx), Target(Ctx.Target) { +CodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M) + : Context(Ctx), Target(Ctx.Target), TheModule(M) { } /// ConvertType - Convert the specified type to its LLVM form. @@ -133,7 +134,29 @@ const llvm::Type *CodeGenTypes::ConvertType(QualType T) { return llvm::FunctionType::get(ResultType, ArgTys, isVarArg, 0); } case Type::Tagged: - break; + const TagType &TT = cast<TagType>(Ty); + const TagDecl *TD = TT.getDecl(); + llvm::Type *ResultType; + + 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 + assert(0 && "FIXME: Implement tag decl kind!"); + } + + std::string TypeName(TD->getKindName()); + TypeName += '.'; + TypeName += TD->getName(); + + TheModule.addTypeName(TypeName, ResultType); + return ResultType; } // FIXME: implement. |