summaryrefslogtreecommitdiffstats
path: root/clang/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/CodeGen')
-rw-r--r--clang/CodeGen/CodeGenFunction.cpp89
-rw-r--r--clang/CodeGen/CodeGenFunction.h10
-rw-r--r--clang/CodeGen/CodeGenModule.cpp3
-rw-r--r--clang/CodeGen/CodeGenModule.h2
4 files changed, 101 insertions, 3 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() {}
OpenPOWER on IntegriCloud