processing Call IR expressions and void functions (crash expected)
This commit is contained in:
+1
-1
@@ -125,7 +125,7 @@ internal class CodeGenerator(override val context:Context) : ContextUtils {
|
|||||||
fun load(value:LLVMOpaqueValue, varName: String):LLVMOpaqueValue = LLVMBuildLoad(context.llvmBuilder, value, varName)!!
|
fun load(value:LLVMOpaqueValue, varName: String):LLVMOpaqueValue = LLVMBuildLoad(context.llvmBuilder, value, varName)!!
|
||||||
fun store(value:LLVMOpaqueValue, ptr:LLVMOpaqueValue):LLVMOpaqueValue = LLVMBuildStore(context.llvmBuilder, value, ptr)!!
|
fun store(value:LLVMOpaqueValue, ptr:LLVMOpaqueValue):LLVMOpaqueValue = LLVMBuildStore(context.llvmBuilder, value, ptr)!!
|
||||||
|
|
||||||
fun call(descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>, result: String): LLVMOpaqueValue? {
|
fun call(descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>, result: String?): LLVMOpaqueValue? {
|
||||||
if (args.size == 0) return LLVMBuildCall(context.llvmBuilder, descriptor.llvmFunction.getLlvmValue(), null, 0, result)
|
if (args.size == 0) return LLVMBuildCall(context.llvmBuilder, descriptor.llvmFunction.getLlvmValue(), null, 0, result)
|
||||||
memScoped {
|
memScoped {
|
||||||
val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue))
|
val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue))
|
||||||
|
|||||||
+4
-2
@@ -84,8 +84,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
evaluateCall(generator.tmpVariable(), expression)
|
evaluateCall(generator.tmpVariable(), expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitConstructor(declaration: IrConstructor, data: Nothing?) {
|
override fun visitCall(expression: IrCall) {
|
||||||
super.visitConstructor(declaration, data)
|
evaluateExpression(generator.tmpVariable(), expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitFunction(declaration: IrFunction) {
|
override fun visitFunction(declaration: IrFunction) {
|
||||||
@@ -183,6 +183,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun evaluateSimpleFunctionCall(tmpVariableName: String, value: IrCall, args: MutableList<LLVMOpaqueValue?>): LLVMOpaqueValue? {
|
private fun evaluateSimpleFunctionCall(tmpVariableName: String, value: IrCall, args: MutableList<LLVMOpaqueValue?>): LLVMOpaqueValue? {
|
||||||
|
if (KotlinBuiltIns.isUnit(value.descriptor.returnType!!))
|
||||||
|
return generator.call(value.descriptor as FunctionDescriptor, args, null)
|
||||||
return generator.call(value.descriptor as FunctionDescriptor, args, tmpVariableName)
|
return generator.call(value.descriptor as FunctionDescriptor, args, tmpVariableName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user