CODEGEN: more logging and verification

This commit is contained in:
Vasily Levchenko
2016-11-26 12:58:05 +03:00
parent ce19f73172
commit f4529298e4
@@ -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)