]> granicus.if.org Git - clang/commitdiff
Add preliminary support for converting struct types.
authorAnders Carlsson <andersca@mac.com>
Fri, 17 Aug 2007 22:00:32 +0000 (22:00 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 17 Aug 2007 22:00:32 +0000 (22:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41145 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenModule.cpp
CodeGen/CodeGenTypes.cpp
CodeGen/CodeGenTypes.h

index a1a498b082825f6a40d0459a43cd0044b62654e8..44cb91dd1de5aa4a367dad27a50656f94ef1f120 100644 (file)
@@ -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.
index 3854465ea49a264f17449a620aa6175326a03f49..6a2bb1e273907f866e3c20c6c9d113918c82b6bc 100644 (file)
 #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.
index 1b49dce0c39446f805cabae7277946f0b27be753..1e3416c98ce567bc2698c7c2c3b4d7ab44237cf1 100644 (file)
@@ -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; }