From: Anders Carlsson Date: Fri, 17 Aug 2007 22:00:32 +0000 (+0000) Subject: Add preliminary support for converting struct types. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e533287e6a9adac78c9ac370612581aad9b8c5e;p=clang Add preliminary support for converting struct types. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index a1a498b082..44cb91dd1d 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/CodeGen/CodeGenModule.cpp @@ -26,7 +26,7 @@ using namespace CodeGen; CodeGenModule::CodeGenModule(ASTContext &C, llvm::Module &M) - : Context(C), TheModule(M), Types(C) {} + : Context(C), TheModule(M), Types(C, M) {} llvm::Constant *CodeGenModule::GetAddrOfGlobalDecl(const Decl *D) { // See if it is already in the map. 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(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(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!"); + } + + std::string TypeName(TD->getKindName()); + TypeName += '.'; + TypeName += TD->getName(); + + TheModule.addTypeName(TypeName, ResultType); + return ResultType; } // FIXME: implement. diff --git a/CodeGen/CodeGenTypes.h b/CodeGen/CodeGenTypes.h index 1b49dce0c3..1e3416c98c 100644 --- a/CodeGen/CodeGenTypes.h +++ b/CodeGen/CodeGenTypes.h @@ -17,6 +17,7 @@ #include namespace llvm { + class Module; class Type; } @@ -33,9 +34,9 @@ namespace CodeGen { class CodeGenTypes { ASTContext &Context; TargetInfo &Target; - + llvm::Module& TheModule; public: - CodeGenTypes(ASTContext &Ctx); + CodeGenTypes(ASTContext &Ctx, llvm::Module &M); TargetInfo &getTarget() const { return Target; }