manual c function interop
This commit is contained in:
+20
-5
@@ -202,7 +202,7 @@ emit_instruction_stream :: proc(
|
||||
strings.write_string(&emitter.builder, " ")
|
||||
}
|
||||
strings.write_string(&emitter.builder, "call ")
|
||||
if !target.c_abi {
|
||||
if target.calling_convention == .Brolang {
|
||||
strings.write_string(&emitter.builder, "fastcc ")
|
||||
}
|
||||
fmt.sbprintf(&emitter.builder, "%s @%s(", function_result_type(target), target.link_name)
|
||||
@@ -321,16 +321,31 @@ emit_constructor :: proc(emitter: ^Emitter) {
|
||||
|
||||
emit_functions :: proc(emitter: ^Emitter) {
|
||||
for function in emitter.module.functions {
|
||||
strings.write_string(&emitter.builder, "define ")
|
||||
if !function.c_abi {
|
||||
strings.write_string(&emitter.builder, "internal fastcc ")
|
||||
if function.implementation == .Declaration {
|
||||
strings.write_string(&emitter.builder, "declare ")
|
||||
} else {
|
||||
strings.write_string(&emitter.builder, "define ")
|
||||
if function.linkage == .Internal {
|
||||
strings.write_string(&emitter.builder, "internal ")
|
||||
}
|
||||
}
|
||||
if function.calling_convention == .Brolang {
|
||||
strings.write_string(&emitter.builder, "fastcc ")
|
||||
}
|
||||
fmt.sbprintf(&emitter.builder, "%s @%s(", function_result_type(function), function.link_name)
|
||||
for param_type, index in function.param_types {
|
||||
if index > 0 {
|
||||
strings.write_string(&emitter.builder, ", ")
|
||||
}
|
||||
fmt.sbprintf(&emitter.builder, "%s %%v%d", llvm_type(param_type), index)
|
||||
if function.implementation == .Declaration {
|
||||
fmt.sbprintf(&emitter.builder, "%s", llvm_type(param_type))
|
||||
} else {
|
||||
fmt.sbprintf(&emitter.builder, "%s %%v%d", llvm_type(param_type), index)
|
||||
}
|
||||
}
|
||||
if function.implementation == .Declaration {
|
||||
strings.write_string(&emitter.builder, ")\n\n")
|
||||
continue
|
||||
}
|
||||
strings.write_string(&emitter.builder, ") {\nentry:\n")
|
||||
_ = emit_instruction_stream(emitter, function.instructions, function)
|
||||
|
||||
Reference in New Issue
Block a user