LLVM my beloved
Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
parent
484d1a6e2c
commit
5455919d6e
@ -22,6 +22,30 @@ LLVMComdatRef :: distinct rawptr
|
|||||||
LLVMJITEventListenerRef :: distinct rawptr
|
LLVMJITEventListenerRef :: distinct rawptr
|
||||||
LLVMBinaryRef :: distinct rawptr
|
LLVMBinaryRef :: distinct rawptr
|
||||||
|
|
||||||
|
LLVMTypeKind :: enum {
|
||||||
|
LLVMVoidTypeKind,
|
||||||
|
LLVMHalfTypeKind,
|
||||||
|
LLVMFloatTypeKind,
|
||||||
|
LLVMDoubleTypeKind,
|
||||||
|
LLVMX86_FP80TypeKind,
|
||||||
|
LLVMFP128TypeKind,
|
||||||
|
LLVMPPC_FP128TypeKind,
|
||||||
|
LLVMLabelTypeKind,
|
||||||
|
LLVMIntegerTypeKind,
|
||||||
|
LLVMFunctionTypeKind,
|
||||||
|
LLVMStructTypeKind,
|
||||||
|
LLVMArrayTypeKind,
|
||||||
|
LLVMPointerTypeKind,
|
||||||
|
LLVMVectorTypeKind,
|
||||||
|
LLVMMetadataTypeKind,
|
||||||
|
LLVMX86_MMXTypeKind,
|
||||||
|
LLVMTokenTypeKind,
|
||||||
|
LLVMScalableVectorTypeKind,
|
||||||
|
LLVMBFloatTypeKind,
|
||||||
|
LLVMX86_AMXTypeKind,
|
||||||
|
LLVMTargetExtTypeKind,
|
||||||
|
}
|
||||||
|
|
||||||
@(default_calling_convention = "std")
|
@(default_calling_convention = "std")
|
||||||
foreign llvmc {
|
foreign llvmc {
|
||||||
LLVMContextCreate :: proc() -> LLVMContextRef ---
|
LLVMContextCreate :: proc() -> LLVMContextRef ---
|
||||||
@ -47,9 +71,15 @@ foreign llvmc {
|
|||||||
LLVMInt64TypeInContext :: proc(C: LLVMContextRef) -> LLVMTypeRef ---
|
LLVMInt64TypeInContext :: proc(C: LLVMContextRef) -> LLVMTypeRef ---
|
||||||
LLVMIntTypeInContext :: proc(C: LLVMContextRef, n: uint) -> LLVMTypeRef ---
|
LLVMIntTypeInContext :: proc(C: LLVMContextRef, n: uint) -> LLVMTypeRef ---
|
||||||
|
|
||||||
|
LLVMDoubleTypeInContext :: proc(C: LLVMContextRef) -> LLVMTypeRef ---
|
||||||
|
LLVMFloatTypeInContext :: proc(C: LLVMContextRef) -> LLVMTypeRef ---
|
||||||
|
|
||||||
|
LLVMVoidTypeInContext :: proc(C: LLVMContextRef) -> LLVMTypeRef ---
|
||||||
|
|
||||||
LLVMPointerType :: proc(ElementType: LLVMTypeRef, AddressSpace: uint) -> LLVMTypeRef ---
|
LLVMPointerType :: proc(ElementType: LLVMTypeRef, AddressSpace: uint) -> LLVMTypeRef ---
|
||||||
|
|
||||||
LLVMConstInt :: proc(IntTy: LLVMTypeRef, N: u64, SignExtend: LLVMBool) -> LLVMValueRef ---
|
LLVMConstInt :: proc(IntTy: LLVMTypeRef, N: u64, SignExtend: LLVMBool) -> LLVMValueRef ---
|
||||||
|
LLVMConstReal :: proc(RealTy: LLVMTypeRef, N: f64) -> LLVMValueRef ---
|
||||||
|
|
||||||
LLVMFunctionType :: proc(ReturnType: LLVMTypeRef, ParamTypes: [^]LLVMTypeRef, ParamCount: uint, IsVarArg: LLVMBool) -> LLVMTypeRef ---
|
LLVMFunctionType :: proc(ReturnType: LLVMTypeRef, ParamTypes: [^]LLVMTypeRef, ParamCount: uint, IsVarArg: LLVMBool) -> LLVMTypeRef ---
|
||||||
LLVMAddFunction :: proc(M: LLVMModuleRef, Name: cstring, FunctionType: LLVMTypeRef) -> LLVMValueRef ---
|
LLVMAddFunction :: proc(M: LLVMModuleRef, Name: cstring, FunctionType: LLVMTypeRef) -> LLVMValueRef ---
|
||||||
@ -58,6 +88,8 @@ foreign llvmc {
|
|||||||
|
|
||||||
LLVMPrintModuleToFile :: proc(M: LLVMModuleRef, Filename: cstring, ErrorMessage: ^cstring) -> LLVMBool ---
|
LLVMPrintModuleToFile :: proc(M: LLVMModuleRef, Filename: cstring, ErrorMessage: ^cstring) -> LLVMBool ---
|
||||||
|
|
||||||
|
LLVMGetValueName2 :: proc(V: LLVMValueRef, Length: ^u64) -> cstring ---
|
||||||
|
|
||||||
LLVMDisposeBuilder :: proc(Builder: LLVMBuilderRef) ---
|
LLVMDisposeBuilder :: proc(Builder: LLVMBuilderRef) ---
|
||||||
LLVMDisposeModule :: proc(M: LLVMModuleRef) ---
|
LLVMDisposeModule :: proc(M: LLVMModuleRef) ---
|
||||||
LLVMContextDispose :: proc(C: LLVMContextRef) ---
|
LLVMContextDispose :: proc(C: LLVMContextRef) ---
|
||||||
|
@ -85,5 +85,15 @@ main :: proc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
node_print(ast)
|
node_print(ast)
|
||||||
|
|
||||||
|
ctx := LLVMContextCreate()
|
||||||
|
defer LLVMContextDispose(ctx)
|
||||||
|
module := LLVMModuleCreateWithNameInContext("hello", ctx)
|
||||||
|
defer LLVMDisposeModule(module)
|
||||||
|
builder := LLVMCreateBuilderInContext(ctx)
|
||||||
|
|
||||||
|
generate_llvm(ctx, module, builder, ast)
|
||||||
|
|
||||||
|
LLVMPrintModuleToFile(module, "hello.ll", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,9 @@ is_number :: proc(node: ^Node) -> bool {
|
|||||||
|
|
||||||
@(private = "file")
|
@(private = "file")
|
||||||
ast_to_type :: proc(node: ^Node) -> ^Type {
|
ast_to_type :: proc(node: ^Node) -> ^Type {
|
||||||
|
if node == nil {
|
||||||
|
return type_create_integer(0, false)
|
||||||
|
}
|
||||||
if node.kind == .Identifier {
|
if node.kind == .Identifier {
|
||||||
value := node.value.([dynamic]u8)
|
value := node.value.([dynamic]u8)
|
||||||
if value[0] == 'u' {
|
if value[0] == 'u' {
|
||||||
@ -140,6 +143,8 @@ type_check_function_call :: proc(ast: ^Node, parent_ast: ^Node, must_be_function
|
|||||||
}
|
}
|
||||||
|
|
||||||
type_check :: proc(ast: ^Node, parent_ast: ^Node) {
|
type_check :: proc(ast: ^Node, parent_ast: ^Node) {
|
||||||
|
in_extern := false
|
||||||
|
|
||||||
#partial switch (ast.kind) {
|
#partial switch (ast.kind) {
|
||||||
case .Integer: fallthrough
|
case .Integer: fallthrough
|
||||||
case .Float: fallthrough
|
case .Float: fallthrough
|
||||||
@ -296,13 +301,22 @@ type_check :: proc(ast: ^Node, parent_ast: ^Node) {
|
|||||||
ast.return_type = ast_to_type(ast.children[1])
|
ast.return_type = ast_to_type(ast.children[1])
|
||||||
}
|
}
|
||||||
scope_stack[len(scope_stack) - 1].variable_definitions[get_character_sum_of_dyn_arr(&ast.children[0].value.([dynamic]u8))] = ast.return_type
|
scope_stack[len(scope_stack) - 1].variable_definitions[get_character_sum_of_dyn_arr(&ast.children[0].value.([dynamic]u8))] = ast.return_type
|
||||||
|
case .ExternFunction:
|
||||||
|
in_extern = true
|
||||||
|
fallthrough
|
||||||
case .Function:
|
case .Function:
|
||||||
scope_enter()
|
scope_enter()
|
||||||
ast.return_type = ast_to_type(ast.children[0])
|
ast.return_type = ast_to_type(ast.children[0])
|
||||||
scope_stack[len(scope_stack) - 1].function_return_type = ast.return_type
|
scope_stack[len(scope_stack) - 1].function_return_type = ast.return_type
|
||||||
for child, i in ast.children {
|
for child, i in ast.children {
|
||||||
if i < 2 {
|
if in_extern == false {
|
||||||
continue
|
if i < 2 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if i < 1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
type_check(child, ast)
|
type_check(child, ast)
|
||||||
scope_stack[len(scope_stack) - 1].variable_definitions[get_character_sum_of_dyn_arr(&child.children[0].value.([dynamic]u8))] = child.return_type
|
scope_stack[len(scope_stack) - 1].variable_definitions[get_character_sum_of_dyn_arr(&child.children[0].value.([dynamic]u8))] = child.return_type
|
||||||
@ -310,9 +324,6 @@ type_check :: proc(ast: ^Node, parent_ast: ^Node) {
|
|||||||
}
|
}
|
||||||
type_check(ast.children[1], ast)
|
type_check(ast.children[1], ast)
|
||||||
scope_leave()
|
scope_leave()
|
||||||
case .ExternFunction:
|
|
||||||
ast.return_type = ast_to_type(ast.children[0])
|
|
||||||
scope_stack[len(scope_stack) - 1].function_return_type = ast.return_type
|
|
||||||
case:
|
case:
|
||||||
fmt.panicf("Unhandled node kind in type_check: {}", ast.kind)
|
fmt.panicf("Unhandled node kind in type_check: {}", ast.kind)
|
||||||
}
|
}
|
||||||
@ -329,7 +340,7 @@ find_function_definitions :: proc(ast_: ^Node) -> (ret: [dynamic]^FunctionType)
|
|||||||
is_extern := false
|
is_extern := false
|
||||||
#partial switch (ast.kind) {
|
#partial switch (ast.kind) {
|
||||||
case .ExternFunction:
|
case .ExternFunction:
|
||||||
is_extern := true
|
is_extern = true
|
||||||
fallthrough
|
fallthrough
|
||||||
case .Function:
|
case .Function:
|
||||||
for fn in ret {
|
for fn in ret {
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
let asdf := 0b1101 as f32
|
\let asdf := 0b1101 as f32
|
||||||
let poop :: 12.0 + 2.0 * asdf
|
\let poop :: 12.0 + 2.0 * asdf
|
||||||
|
|
||||||
fn name(a b: f32) i32 {
|
\fn name(a b: f32) i32 {
|
||||||
ret (a + b) as i32
|
\ ret (a + b) as i32
|
||||||
}
|
\}
|
||||||
|
|
||||||
fn put_32(str: []u32)
|
\name 123.0 456.0
|
||||||
|
|
||||||
name 123.0 456.0
|
\let arr: []i32, arr2: [69]u8, ptr: ^i32
|
||||||
|
|
||||||
let arr: []i32, arr2: [69]u8, ptr: ^i32
|
fn put_i32(val: i32) i32
|
||||||
|
|
||||||
put_32("Hello")
|
put_i32 69420
|
||||||
|
Loading…
x
Reference in New Issue
Block a user