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 | f087c0c1c6f673334831c6a5ce46cb6d48be1de5 (patch) | |
tree | 1c8de69fba0c83b550e296029870f996bc8b7454 /clang/CodeGen/CodeGenTypes.cpp | |
parent | d1fcfcc76c4239b3935e9d9aa743c564133b61cf (diff) | |
download | bcm5719-llvm-f087c0c1c6f673334831c6a5ce46cb6d48be1de5.tar.gz bcm5719-llvm-f087c0c1c6f673334831c6a5ce46cb6d48be1de5.zip |
Add preliminary support for converting struct types.
llvm-svn: 41145
Diffstat (limited to 'clang/CodeGen/CodeGenTypes.cpp')
-rw-r--r-- | clang/CodeGen/CodeGenTypes.cpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/clang/CodeGen/CodeGenTypes.cpp b/clang/CodeGen/CodeGenTypes.cpp index 3854465ea49..6a2bb1e2739 100644 --- a/clang/CodeGen/CodeGenTypes.cpp +++ b/clang/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. |