added function parsing
This commit is contained in:
parent
da963e40b7
commit
68622fbd00
|
@ -0,0 +1,81 @@
|
|||
|
||||
#include <alloca.h>
|
||||
#include <codegen/backend.h>
|
||||
#include <llvm-c/Core.h>
|
||||
#include <llvm-c/Types.h>
|
||||
#include <llvm/parser.h>
|
||||
#include <llvm/types.h>
|
||||
#include <set/types.h>
|
||||
#include <sys/log.h>
|
||||
|
||||
BackendError impl_param_type(LLVMBackendCompileUnit* unit,
|
||||
LLVMGlobalScope* scope, Paramer* param,
|
||||
LLVMTypeRef* llvm_type) {
|
||||
BackendError err = SUCCESS;
|
||||
|
||||
Type* gemstone_type = NULL;
|
||||
IO_Qualifier qualifier = In;
|
||||
|
||||
if (param->kind == ParameterDeclarationKind) {
|
||||
gemstone_type = ¶m->impl.declaration.type;
|
||||
qualifier = param->impl.declaration.qualifier;
|
||||
} else {
|
||||
gemstone_type = ¶m->impl.definiton.declaration.type;
|
||||
qualifier = param->impl.definiton.declaration.qualifier;
|
||||
}
|
||||
|
||||
// wrap output variables as pointers
|
||||
if (qualifier == Out || qualifier == InOut) {
|
||||
Type* reference_type = alloca(sizeof(Type));
|
||||
|
||||
reference_type->kind = TypeKindReference;
|
||||
reference_type->impl.reference = gemstone_type;
|
||||
|
||||
gemstone_type = reference_type;
|
||||
}
|
||||
|
||||
err = get_type_impl(unit, scope, gemstone_type, llvm_type);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
BackendError impl_func_decl(LLVMBackendCompileUnit* unit,
|
||||
LLVMGlobalScope* scope, FunctionDefinition* fundef,
|
||||
LLVMValueRef* llvm_fun, const char* name) {
|
||||
DEBUG("implementing function declaration: %s()", name);
|
||||
BackendError err = SUCCESS;
|
||||
|
||||
Paramer* params = (Paramer*)fundef->parameter;
|
||||
GArray* llvm_params = g_array_new(FALSE, FALSE, sizeof(LLVMTypeRef));
|
||||
|
||||
for (size_t i = 0; i < fundef->parameter->len; i++) {
|
||||
Paramer* param = ¶ms[i];
|
||||
|
||||
LLVMTypeRef llvm_type = NULL;
|
||||
err = impl_param_type(unit, scope, param, &llvm_type);
|
||||
|
||||
if (err.kind != Success) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG("implemented %ld parameter", llvm_params->len);
|
||||
|
||||
LLVMTypeRef llvm_fun_type =
|
||||
LLVMFunctionType(LLVMVoidTypeInContext(unit->context),
|
||||
(LLVMTypeRef*)llvm_params->data, llvm_params->len, 0);
|
||||
|
||||
*llvm_fun = LLVMAddFunction(unit->module, name, llvm_fun_type);
|
||||
|
||||
g_array_free(llvm_params, FALSE);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
BackendError impl_func(LLVMBackendCompileUnit* unit, LLVMGlobalScope* scope,
|
||||
FunctionDefinition* fundef, const char* name) {
|
||||
BackendError err = SUCCESS;
|
||||
|
||||
|
||||
return err;
|
||||
}
|
Loading…
Reference in New Issue