Add preliminary support for converting struct types.

llvm-svn: 41145
This commit is contained in:
Anders Carlsson 2007-08-17 22:00:32 +00:00
parent d1fcfcc76c
commit f087c0c1c6
3 changed files with 30 additions and 6 deletions

View 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.

View File

@ -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.

View 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; }