backend parses type and function declarations
This commit is contained in:
parent
4a3b974d9f
commit
fa32df1010
|
@ -1,4 +1,9 @@
|
||||||
|
|
||||||
|
#include <llvm/function/function-types.h>
|
||||||
|
#include <llvm/function/function.h>
|
||||||
|
#include <llvm/types/scope.h>
|
||||||
|
#include <llvm/types/structs.h>
|
||||||
|
#include <llvm/types/type.h>
|
||||||
#include <codegen/backend.h>
|
#include <codegen/backend.h>
|
||||||
#include <sys/log.h>
|
#include <sys/log.h>
|
||||||
#include <ast/ast.h>
|
#include <ast/ast.h>
|
||||||
|
@ -10,12 +15,37 @@ typedef enum LLVMBackendError_t {
|
||||||
UnresolvedImport
|
UnresolvedImport
|
||||||
} LLVMBackendError;
|
} LLVMBackendError;
|
||||||
|
|
||||||
static BackendError llvm_backend_codegen(const AST_NODE_PTR, void**) {
|
static BackendError llvm_backend_codegen(const AST_NODE_PTR module_node, void**) {
|
||||||
// we start with a LLVM module
|
// we start with a LLVM module
|
||||||
LLVMContextRef context = LLVMContextCreate();
|
LLVMContextRef context = LLVMContextCreate();
|
||||||
LLVMModuleRef module = LLVMModuleCreateWithNameInContext("gemstone application", context);
|
LLVMModuleRef module = LLVMModuleCreateWithNameInContext("gemstone application", context);
|
||||||
|
|
||||||
|
TypeScopeRef global_scope = type_scope_new();
|
||||||
|
|
||||||
|
for (size_t i = 0; i < module_node->child_count; i++) {
|
||||||
|
// iterate over all nodes in module
|
||||||
|
// can either be a function, box, definition, declaration or typedefine
|
||||||
|
|
||||||
|
AST_NODE_PTR global_node = AST_get_node(module_node, i);
|
||||||
|
|
||||||
|
GemstoneTypedefRef typedefref;
|
||||||
|
GemstoneFunRef funref;
|
||||||
|
|
||||||
|
switch (global_node->kind) {
|
||||||
|
case AST_Typedef:
|
||||||
|
typedefref = get_type_def_from_ast(global_scope, global_node);
|
||||||
|
type_scope_append_type(global_scope, typedefref);
|
||||||
|
break;
|
||||||
|
case AST_Fun:
|
||||||
|
funref = fun_from_ast(global_scope, global_node);
|
||||||
|
type_scope_add_fun(global_scope, funref);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PANIC("NOT IMPLEMENTED");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type_scope_delete(global_scope);
|
||||||
|
|
||||||
LLVMDisposeModule(module);
|
LLVMDisposeModule(module);
|
||||||
LLVMContextDispose(context);
|
LLVMContextDispose(context);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
|
|
||||||
|
#include "llvm/function/function-types.h"
|
||||||
#include <ast/ast.h>
|
#include <ast/ast.h>
|
||||||
|
#include <llvm-c/Core.h>
|
||||||
#include <llvm/types/scope.h>
|
#include <llvm/types/scope.h>
|
||||||
#include <llvm/function/function.h>
|
#include <llvm/function/function.h>
|
||||||
#include <llvm/types/type.h>
|
#include <llvm/types/type.h>
|
||||||
|
@ -105,3 +107,16 @@ void fun_delete(const GemstoneFunRef fun) {
|
||||||
g_array_free(fun->params, TRUE);
|
g_array_free(fun->params, TRUE);
|
||||||
free(fun);
|
free(fun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMTypeRef get_gemstone_function_llvm_signature(LLVMContextRef context, GemstoneFunRef function) {
|
||||||
|
unsigned int param_count = function->params->len;
|
||||||
|
|
||||||
|
LLVMTypeRef* params = malloc(sizeof(LLVMTypeRef));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < param_count; i++) {
|
||||||
|
GemstoneParam* gem_param = ((GemstoneParam*) function->params->data) + i;
|
||||||
|
params[i] = llvm_type_from_gemstone_type(context, gem_param->typename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LLVMFunctionType(LLVMVoidType(), params, param_count, 0);
|
||||||
|
}
|
||||||
|
|
|
@ -71,3 +71,17 @@ GemstoneTypedefRef get_type_def_from_ast(const TypeScopeRef scope, const AST_NOD
|
||||||
|
|
||||||
return new_typedefref(type, name);
|
return new_typedefref(type, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMTypeRef llvm_type_from_gemstone_type(LLVMContextRef context, GemstoneTypeRef type) {
|
||||||
|
LLVMTypeRef llvmTypeRef = NULL;
|
||||||
|
|
||||||
|
switch (type->kind) {
|
||||||
|
case TypeComposite:
|
||||||
|
llvmTypeRef = llvm_type_from_composite(context, &type->specs.composite);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PANIC("NOT IMPLEMENTED");
|
||||||
|
}
|
||||||
|
|
||||||
|
return llvmTypeRef;
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#define GEMSTONE_TYPE_H_
|
#define GEMSTONE_TYPE_H_
|
||||||
|
|
||||||
#include <ast/ast.h>
|
#include <ast/ast.h>
|
||||||
|
#include <llvm-c/Types.h>
|
||||||
#include <llvm/types/composite.h>
|
#include <llvm/types/composite.h>
|
||||||
#include <llvm/types/structs.h>
|
#include <llvm/types/structs.h>
|
||||||
#include <llvm/types/scope.h>
|
#include <llvm/types/scope.h>
|
||||||
|
@ -32,6 +33,15 @@ GemstoneTypedefRef get_type_def_from_ast(const TypeScopeRef scope, const AST_NOD
|
||||||
*/
|
*/
|
||||||
GemstoneTypedefRef new_typedefref(GemstoneTypeRef type, const char* name);
|
GemstoneTypedefRef new_typedefref(GemstoneTypeRef type, const char* name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create the LLVM function signature
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @param type
|
||||||
|
* @return LLVMTypeRef
|
||||||
|
*/
|
||||||
|
LLVMTypeRef llvm_type_from_gemstone_type(LLVMContextRef context, GemstoneTypeRef type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Free the type definition reference and its underlying type
|
* @brief Free the type definition reference and its underlying type
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue