CODEGEN: more logging and verification
This commit is contained in:
+9
-4
@@ -39,6 +39,11 @@ fun emitLLVM(module: IrModuleFragment, runtimeFile: String, outFile: String) {
|
|||||||
module.acceptVoid(RTTIGeneratorVisitor(context))
|
module.acceptVoid(RTTIGeneratorVisitor(context))
|
||||||
println("\n--- Generate bitcode ------------------------------------------------------\n")
|
println("\n--- Generate bitcode ------------------------------------------------------\n")
|
||||||
module.acceptVoid(CodeGeneratorVisitor(context))
|
module.acceptVoid(CodeGeneratorVisitor(context))
|
||||||
|
verifyModule(llvmModule)
|
||||||
|
LLVMWriteBitcodeToFile(llvmModule, outFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun verifyModule(llvmModule: LLVMModuleRef) {
|
||||||
memScoped {
|
memScoped {
|
||||||
val errorRef = allocPointerTo<CInt8Var>()
|
val errorRef = allocPointerTo<CInt8Var>()
|
||||||
// TODO: use LLVMDisposeMessage() on errorRef, once possible in interop.
|
// TODO: use LLVMDisposeMessage() on errorRef, once possible in interop.
|
||||||
@@ -48,7 +53,6 @@ fun emitLLVM(module: IrModuleFragment, runtimeFile: String, outFile: String) {
|
|||||||
throw Error("Invalid module");
|
throw Error("Invalid module");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LLVMWriteBitcodeToFile(llvmModule, outFile)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class RTTIGeneratorVisitor(context: Context) : IrElementVisitorVoid {
|
internal class RTTIGeneratorVisitor(context: Context) : IrElementVisitorVoid {
|
||||||
@@ -207,13 +211,13 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
}
|
}
|
||||||
|
|
||||||
codegen.ret(thisPtr)
|
codegen.ret(thisPtr)
|
||||||
logger.log("visitConstructor : ${ir2string(constructorDeclaration)}")
|
logger.log("visitConstructor : ${ir2string(constructorDeclaration)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
|
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
|
||||||
logger.log("visitAnonymousInitializer : ${ir2string(declaration)}")
|
logger.log("visitAnonymousInitializer : ${ir2string(declaration)}")
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
@@ -257,6 +261,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
codegen.function(declaration)
|
codegen.function(declaration)
|
||||||
metadator.function(declaration)
|
metadator.function(declaration)
|
||||||
declaration.acceptChildrenVoid(this)
|
declaration.acceptChildrenVoid(this)
|
||||||
|
verifyModule(context.llvmModule)
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
@@ -751,7 +756,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
|
|
||||||
private fun evaluateOperatorCall(tmpVariableName: String, callee: IrCall, args: List<LLVMValueRef?>): LLVMValueRef {
|
private fun evaluateOperatorCall(tmpVariableName: String, callee: IrCall, args: List<LLVMValueRef?>): LLVMValueRef {
|
||||||
logger.log("evaluateCall $tmpVariableName origin:$callee")
|
logger.log("evaluateCall : $tmpVariableName origin:${ir2string(callee)}")
|
||||||
val descriptor = callee.descriptor
|
val descriptor = callee.descriptor
|
||||||
when (descriptor.name) {
|
when (descriptor.name) {
|
||||||
kEqeq -> return evaluateOperatorEqeq (callee as IrBinaryPrimitiveImpl, args[0]!!, args[1]!!, tmpVariableName)
|
kEqeq -> return evaluateOperatorEqeq (callee as IrBinaryPrimitiveImpl, args[0]!!, args[1]!!, tmpVariableName)
|
||||||
|
|||||||
Reference in New Issue
Block a user