Implement conversion of clang ast types to LLVM types, at least for some trivial
cases. llvm-svn: 39519
This commit is contained in:
parent
2a8ad18e71
commit
d1af2d2956
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -19,6 +19,5 @@ using namespace CodeGen;
|
|||
|
||||
|
||||
void CodeGenModule::EmitFunction(FunctionDecl *FD) {
|
||||
CodeGenFunction CGF(*this);
|
||||
|
||||
CodeGenFunction(*this).GenerateCode(FD);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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 = "";
|
||||
|
|
|
|||
Loading…
Reference in New Issue