summaryrefslogtreecommitdiffstats
path: root/clang/CodeGen/CodeGenTypes.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2007-08-17 22:00:32 +0000
committerAnders Carlsson <andersca@mac.com>2007-08-17 22:00:32 +0000
commitf087c0c1c6f673334831c6a5ce46cb6d48be1de5 (patch)
tree1c8de69fba0c83b550e296029870f996bc8b7454 /clang/CodeGen/CodeGenTypes.cpp
parentd1fcfcc76c4239b3935e9d9aa743c564133b61cf (diff)
downloadbcm5719-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.cpp29
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.
OpenPOWER on IntegriCloud