diff options
author | Chris Lattner <sabre@nondot.org> | 2007-05-29 23:17:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-05-29 23:17:50 +0000 |
commit | d1af2d2956e829ab16a124fbad1ecd65d81af234 (patch) | |
tree | aabd57f22564ce994ecaa98761de93e895ec46b7 | |
parent | 2a8ad18e7118008528f7002ee23236b7cec796fc (diff) | |
download | bcm5719-llvm-d1af2d2956e829ab16a124fbad1ecd65d81af234.tar.gz bcm5719-llvm-d1af2d2956e829ab16a124fbad1ecd65d81af234.zip |
Implement conversion of clang ast types to LLVM types, at least for some trivial
cases.
llvm-svn: 39519
-rw-r--r-- | clang/CodeGen/CodeGenFunction.cpp | 89 | ||||
-rw-r--r-- | clang/CodeGen/CodeGenFunction.h | 10 | ||||
-rw-r--r-- | clang/CodeGen/CodeGenModule.cpp | 3 | ||||
-rw-r--r-- | clang/CodeGen/CodeGenModule.h | 2 | ||||
-rw-r--r-- | clang/clang.xcodeproj/project.pbxproj | 23 |
5 files changed, 101 insertions, 26 deletions
diff --git a/clang/CodeGen/CodeGenFunction.cpp b/clang/CodeGen/CodeGenFunction.cpp index 94146c016ee..cfe5d9d9521 100644 --- a/clang/CodeGen/CodeGenFunction.cpp +++ b/clang/CodeGen/CodeGenFunction.cpp @@ -13,8 +13,97 @@ #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "clang/Basic/TargetInfo.h" +#include "clang/AST/AST.h" +#include "llvm/DerivedTypes.h" #include "llvm/Support/LLVMBuilder.h" using namespace llvm; using namespace clang; using namespace CodeGen; +CodeGenFunction::CodeGenFunction(CodeGenModule &cgm) + : CGM(cgm), Target(CGM.getContext().Target) {} + + +/// ConvertType - Convert the specified type to its LLVM form. +const llvm::Type *CodeGenFunction::ConvertType(QualType T, SourceLocation Loc) { + // FIXME: Cache these, move the CodeGenModule, expand, etc. + const clang::Type &Ty = *T.getCanonicalType(); + + switch (Ty.getTypeClass()) { + case Type::Builtin: { + switch (cast<BuiltinType>(Ty).getKind()) { + case BuiltinType::Void: + // LLVM void type can only be used as the result of a function call. Just + // map to the same as char. + case BuiltinType::Char: + case BuiltinType::SChar: + case BuiltinType::UChar: + return IntegerType::get(Target.getCharWidth(Loc)); + + case BuiltinType::Bool: + return IntegerType::get(Target.getBoolWidth(Loc)); + + case BuiltinType::Short: + case BuiltinType::UShort: + return IntegerType::get(Target.getShortWidth(Loc)); + + case BuiltinType::Int: + case BuiltinType::UInt: + return IntegerType::get(Target.getIntWidth(Loc)); + + case BuiltinType::Long: + case BuiltinType::ULong: + return IntegerType::get(Target.getLongWidth(Loc)); + + case BuiltinType::LongLong: + case BuiltinType::ULongLong: + return IntegerType::get(Target.getLongLongWidth(Loc)); + + case BuiltinType::Float: return llvm::Type::FloatTy; + case BuiltinType::Double: return llvm::Type::DoubleTy; + case BuiltinType::LongDouble: + case BuiltinType::FloatComplex: + case BuiltinType::DoubleComplex: + case BuiltinType::LongDoubleComplex: + ; + } + break; + } + case Type::Pointer: + case Type::Reference: + case Type::Array: + break; + case Type::FunctionNoProto: + case Type::FunctionProto: { + const FunctionType &FP = cast<FunctionType>(Ty); + const llvm::Type *ResultType; + + if (FP.getResultType()->isVoidType()) + ResultType = llvm::Type::VoidTy; // Result of function uses llvm void. + else + ResultType = ConvertType(FP.getResultType(), Loc); + + // FIXME: Convert argument types. + + return llvm::FunctionType::get(ResultType, + std::vector<const llvm::Type*>(), + false, + 0); + } + case Type::TypeName: + case Type::Tagged: + break; + } + + // FIXME: implement. + return OpaqueType::get(); +} + + +void CodeGenFunction::GenerateCode(FunctionDecl *FD) { + const llvm::Type *Ty = ConvertType(FD->getType(), FD->getLocation()); + + Ty->dump(); + +} diff --git a/clang/CodeGen/CodeGenFunction.h b/clang/CodeGen/CodeGenFunction.h index ebb3e797e13..e7b1a05ebcc 100644 --- a/clang/CodeGen/CodeGenFunction.h +++ b/clang/CodeGen/CodeGenFunction.h @@ -16,9 +16,13 @@ namespace llvm { class Module; + class Type; namespace clang { class ASTContext; class FunctionDecl; + class QualType; + class SourceLocation; + class TargetInfo; namespace CodeGen { class CodeGenModule; @@ -27,9 +31,13 @@ namespace CodeGen { /// while generating LLVM code. class CodeGenFunction { CodeGenModule &CGM; // Per-module state. + TargetInfo &Target; public: - CodeGenFunction(CodeGenModule &cgm) : CGM(cgm) {} + CodeGenFunction(CodeGenModule &cgm); + const llvm::Type *ConvertType(QualType T, SourceLocation Loc); + + void GenerateCode(FunctionDecl *FD); }; } // end namespace CodeGen } // end namespace clang diff --git a/clang/CodeGen/CodeGenModule.cpp b/clang/CodeGen/CodeGenModule.cpp index cbd679ae32c..f1f24f5dcf0 100644 --- a/clang/CodeGen/CodeGenModule.cpp +++ b/clang/CodeGen/CodeGenModule.cpp @@ -19,6 +19,5 @@ using namespace CodeGen; void CodeGenModule::EmitFunction(FunctionDecl *FD) { - CodeGenFunction CGF(*this); - + CodeGenFunction(*this).GenerateCode(FD); } diff --git a/clang/CodeGen/CodeGenModule.h b/clang/CodeGen/CodeGenModule.h index c971d42705f..c5d3b9395ff 100644 --- a/clang/CodeGen/CodeGenModule.h +++ b/clang/CodeGen/CodeGenModule.h @@ -30,6 +30,8 @@ class CodeGenModule { public: CodeGenModule(ASTContext &C, Module &M) : Context(C), TheModule(M) {} + ASTContext &getContext() const { return Context; } + void EmitFunction(FunctionDecl *FD); void PrintStats() {} diff --git a/clang/clang.xcodeproj/project.pbxproj b/clang/clang.xcodeproj/project.pbxproj index b880ce7ace9..5a9178c2aec 100644 --- a/clang/clang.xcodeproj/project.pbxproj +++ b/clang/clang.xcodeproj/project.pbxproj @@ -103,23 +103,6 @@ DED7D9E50A5257F6003AD0FB /* ScratchBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DED7D9E40A5257F6003AD0FB /* ScratchBuffer.cpp */; }; /* End PBXBuildFile section */ -/* Begin PBXBuildStyle section */ - 84FADE170C0B37FF00330902 /* Development */ = { - isa = PBXBuildStyle; - buildSettings = { - COPY_PHASE_STRIP = NO; - }; - name = Development; - }; - 84FADE180C0B37FF00330902 /* Deployment */ = { - isa = PBXBuildStyle; - buildSettings = { - COPY_PHASE_STRIP = YES; - }; - name = Deployment; - }; -/* End PBXBuildStyle section */ - /* Begin PBXCopyFilesBuildPhase section */ 8DD76F690486A84900D96B5E /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -555,12 +538,6 @@ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; - buildSettings = { - }; - buildStyles = ( - 84FADE170C0B37FF00330902 /* Development */, - 84FADE180C0B37FF00330902 /* Deployment */, - ); hasScannedForEncodings = 1; mainGroup = 08FB7794FE84155DC02AAC07 /* clang */; projectDirPath = ""; |