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 | |
| parent | d1fcfcc76c4239b3935e9d9aa743c564133b61cf (diff) | |
| download | bcm5719-llvm-f087c0c1c6f673334831c6a5ce46cb6d48be1de5.tar.gz bcm5719-llvm-f087c0c1c6f673334831c6a5ce46cb6d48be1de5.zip | |
Add preliminary support for converting struct types.
llvm-svn: 41145
| -rw-r--r-- | clang/CodeGen/CodeGenModule.cpp | 2 | ||||
| -rw-r--r-- | clang/CodeGen/CodeGenTypes.cpp | 29 | ||||
| -rw-r--r-- | clang/CodeGen/CodeGenTypes.h | 5 |
3 files changed, 30 insertions, 6 deletions
diff --git a/clang/CodeGen/CodeGenModule.cpp b/clang/CodeGen/CodeGenModule.cpp index a1a498b0828..44cb91dd1de 100644 --- a/clang/CodeGen/CodeGenModule.cpp +++ b/clang/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/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. diff --git a/clang/CodeGen/CodeGenTypes.h b/clang/CodeGen/CodeGenTypes.h index 1b49dce0c39..1e3416c98ce 100644 --- a/clang/CodeGen/CodeGenTypes.h +++ b/clang/CodeGen/CodeGenTypes.h @@ -17,6 +17,7 @@ #include <vector> 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; } |

