76 lines
1.8 KiB
C
76 lines
1.8 KiB
C
|
|
#include <codegen/backend.h>
|
|
#include <llvm-c/Core.h>
|
|
#include <llvm-c/TargetMachine.h>
|
|
#include <sys/log.h>
|
|
#include <ast/ast.h>
|
|
#include <llvm/backend.h>
|
|
#include <llvm/parser.h>
|
|
|
|
Target create_native_target() {
|
|
Target target;
|
|
|
|
target.triple.str = LLVMGetDefaultTargetTriple();
|
|
target.triple.allocation = LLVM;
|
|
|
|
target.cpu.str = LLVMGetHostCPUName();
|
|
target.cpu.allocation = LLVM;
|
|
|
|
target.features.str = LLVMGetHostCPUFeatures();
|
|
target.features.allocation = LLVM;
|
|
|
|
target.opt = LLVMCodeGenLevelDefault;
|
|
target.reloc = LLVMRelocDefault;
|
|
target.model = LLVMCodeModelDefault;
|
|
|
|
return target;
|
|
}
|
|
|
|
Target create_target_from_config() {
|
|
PANIC("NOT IMPLEMENTED");
|
|
}
|
|
|
|
static void delete_string(String string) {
|
|
switch (string.allocation) {
|
|
case LLVM:
|
|
LLVMDisposeMessage(string.str);
|
|
break;
|
|
case LIBC:
|
|
free(string.str);
|
|
break;
|
|
case NONE:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void delete_target(Target target) {
|
|
delete_string(target.name);
|
|
delete_string(target.cpu);
|
|
delete_string(target.features);
|
|
delete_string(target.triple);
|
|
}
|
|
|
|
typedef enum LLVMBackendError_t {
|
|
UnresolvedImport
|
|
} LLVMBackendError;
|
|
|
|
static BackendError llvm_backend_codegen(const Module* unit, void** output) {
|
|
return parse_module(unit, output);
|
|
}
|
|
|
|
static BackendError llvm_backend_codegen_init(void) {
|
|
return new_backend_error(Success);
|
|
}
|
|
|
|
static BackendError llvm_backend_codegen_deinit(void) {
|
|
return new_backend_error(Success);
|
|
}
|
|
|
|
void llvm_backend_init() {
|
|
BackendError err = set_backend(&llvm_backend_codegen_init, &llvm_backend_codegen_deinit, &llvm_backend_codegen, "LLVM");
|
|
|
|
if (err.kind != Success) {
|
|
PANIC("unable to init llvm backend: %ld", err);
|
|
}
|
|
}
|