From 62f8b31cf00cbc81238aa90874d562a7ecb74f45 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sat, 5 Nov 2016 22:47:18 +0300 Subject: [PATCH 1/7] Google protobuf has been added to the build --- backend.native/build.gradle | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/backend.native/build.gradle b/backend.native/build.gradle index 300b8294b9d..eab4f5fe8d0 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -5,10 +5,12 @@ buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.0" } } +apply plugin: "com.google.protobuf" apply plugin: 'java' apply plugin: 'kotlin' apply plugin: org.jetbrains.kotlin.NativeInteropPlugin @@ -40,7 +42,8 @@ allprojects { sourceSets { compiler { - java.srcDir 'compiler/ir/backend.native/src/' + proto.srcDir 'compiler/ir/backend.native/src/' + java.srcDirs 'compiler/ir/backend.native/src/', 'build/generated/source/proto/compiler/java/' kotlin.srcDir 'compiler/ir/backend.native/src/' } cli_bc { @@ -53,6 +56,12 @@ sourceSets { } } +// The protobuf plugin specifies this dependency for java by itself, +// but not for Kotlin. +compileCompilerKotlin { + dependsOn('generateCompilerProto') +} + String[] linkerOpts1() { def libs = ['-lLLVMX86Disassembler', '-lLLVMX86AsmParser', @@ -132,6 +141,9 @@ configurations { } dependencies { + + compilerCompile "com.google.protobuf:protobuf-java:3.0.0" + compilerCompile kotlinCompilerModule compilerCompile kotlinNativeInterop['llvm'].configuration compilerCompile kotlinNativeInterop['hash'].configuration @@ -178,3 +190,12 @@ task jars { } } } + + +protobuf { + protoc { + artifact = 'com.google.protobuf:protoc:3.0.0' + } +} + + From f76a4f6dc985da75322bf987a006ab04feb3513a Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sat, 5 Nov 2016 22:42:01 +0300 Subject: [PATCH 2/7] A simple protobuf description for bitcode metadata --- .../org/jetbrains/kotlin/backend/BinaryMetadata.proto | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto new file mode 100644 index 00000000000..66d8254edb2 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto @@ -0,0 +1,10 @@ + +syntax="proto2"; +package org.jetbrains.kotlin.backend; + +option java_outer_classname = "BinaryMetadata"; + +message FunMetadata { + required string hash = 1; + required string name = 2; +} From 26e310101443fa32761c4721bd72a932fb5532fc Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Sat, 5 Nov 2016 21:06:52 +0300 Subject: [PATCH 3/7] Now we can add metadata nodes to bitcode module. We just put in the names of functions for now. --- .../kotlin/backend/native/llvm/IrToBitcode.kt | 2 + .../kotlin/backend/native/llvm/Logger.kt | 6 ++ .../backend/native/llvm/MetadataGenerator.kt | 66 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt index 6441b5ec699..4226eb73548 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt @@ -71,6 +71,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid val generator = CodeGenerator(context) val logger = Logger(generator, context) + val metadator = MetadataGenerator(context) //-------------------------------------------------------------------------// @@ -140,6 +141,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid override fun visitFunction(declaration: IrFunction) { generator.function(declaration) + metadator.function(declaration) declaration.acceptChildrenVoid(this) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt index 4c228f315a8..02231f6f236 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.backend.native.llvm import kotlin_native.interop.asCString import llvm.LLVMPrintModuleToString import llvm.LLVMPrintValueToString +import llvm.LLVMOpaqueValue import org.jetbrains.kotlin.backend.native.llvm.Context import org.jetbrains.kotlin.backend.native.llvm.ContextUtils import org.jetbrains.kotlin.ir.IrElement @@ -36,3 +37,8 @@ fun ir2string(ir: IrElement?): String { ir?.accept(DumpIrTreeVisitor(strWriter), "") return strWriter.toString().takeWhile { it != '\n' } } + +fun llvm2string(value: LLVMOpaqueValue?): String { + return LLVMPrintValueToString(value)!!.asCString().toString() +} + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt new file mode 100644 index 00000000000..ef7ce366385 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt @@ -0,0 +1,66 @@ +package org.jetbrains.kotlin.backend.native.llvm + + +import kotlin_native.interop.* +import llvm.* +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.backend.BinaryMetadata +import org.jetbrains.kotlin.backend.BinaryMetadata.FunMetadata + +internal class MetadataGenerator(override val context: Context): ContextUtils { + + private fun metadata_string(str: String): LLVMOpaqueValue? { + return LLVMMDString(str, str.length) + } + + private fun metadata_node(args: MutableList): LLVMOpaqueValue? { + memScoped { + val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue)) + args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]} + return LLVMMDNode(rargs[0], args.size); + } + } + + private fun metadata_fun(fn: LLVMOpaqueValue?, info: String): LLVMOpaqueValue? { + val args: MutableList = mutableListOf() + args += fn + args += metadata_string(info); + + val md = metadata_node(args) + return md + } + + private fun emit_module_metadata(name: String, md: LLVMOpaqueValue?) { + LLVMAddNamedMetadataOperand(context.llvmModule, name, md) + } + + private fun serialize_fun_signature(declaration:IrFunction): String { + val builder = FunMetadata.newBuilder() + + val hash = "0x123456 some hash" + val name = declaration.descriptor.name.asString() + + val proto = builder + .setHash(hash) + .setName(name) + .build() + + // Convert it to ProtoBuf's TextFormat representation. + // Use TextFormat.merge(str, builder) to parse it back + val str = proto.toString() + + return str + } + + internal fun function(declaration: IrFunction) { + + val fn = declaration.descriptor.llvmFunction.getLlvmValue() + + val proto = serialize_fun_signature(declaration) + + val md = metadata_fun(fn, proto) + emit_module_metadata("kfun", md); + } +} + + From 56f574684a7c4ed4d657360a76e768d6d9ba70e2 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 7 Nov 2016 14:24:49 +0300 Subject: [PATCH 4/7] Code style and nullables fixes --- .../kotlin/backend/native/llvm/Logger.kt | 1 + .../backend/native/llvm/MetadataGenerator.kt | 30 ++++++++----------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt index 02231f6f236..7cd8c664aaa 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt @@ -39,6 +39,7 @@ fun ir2string(ir: IrElement?): String { } fun llvm2string(value: LLVMOpaqueValue?): String { + if (value == null) return "" return LLVMPrintValueToString(value)!!.asCString().toString() } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt index ef7ce366385..1efac2d8efc 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt @@ -9,32 +9,29 @@ import org.jetbrains.kotlin.backend.BinaryMetadata.FunMetadata internal class MetadataGenerator(override val context: Context): ContextUtils { - private fun metadata_string(str: String): LLVMOpaqueValue? { - return LLVMMDString(str, str.length) + private fun metadataString(str: String): LLVMOpaqueValue { + return LLVMMDString(str, str.length)!! } - private fun metadata_node(args: MutableList): LLVMOpaqueValue? { + private fun metadataNode(args: MutableList): LLVMOpaqueValue { memScoped { val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue)) - args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]} - return LLVMMDNode(rargs[0], args.size); + args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]} + return LLVMMDNode(rargs[0], args.size)!! } } - private fun metadata_fun(fn: LLVMOpaqueValue?, info: String): LLVMOpaqueValue? { - val args: MutableList = mutableListOf() - args += fn - args += metadata_string(info); - - val md = metadata_node(args) + private fun metadataFun(fn: LLVMOpaqueValue?, info: String): LLVMOpaqueValue { + val args: MutableList = mutableListOf(fn, metadataString(info)); + val md = metadataNode(args) return md } - private fun emit_module_metadata(name: String, md: LLVMOpaqueValue?) { + private fun emitModuleMetadata(name: String, md: LLVMOpaqueValue?) { LLVMAddNamedMetadataOperand(context.llvmModule, name, md) } - private fun serialize_fun_signature(declaration:IrFunction): String { + private fun serializeFunSignature(declaration:IrFunction): String { val builder = FunMetadata.newBuilder() val hash = "0x123456 some hash" @@ -53,13 +50,12 @@ internal class MetadataGenerator(override val context: Context): ContextUtils { } internal fun function(declaration: IrFunction) { - val fn = declaration.descriptor.llvmFunction.getLlvmValue() - val proto = serialize_fun_signature(declaration) + val proto = serializeFunSignature(declaration) - val md = metadata_fun(fn, proto) - emit_module_metadata("kfun", md); + val md = metadataFun(fn, proto) + emitModuleMetadata("kfun", md); } } From 4afc7be7b71aea52bd4976cd8932f6bdb2fdd3e3 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 7 Nov 2016 18:03:30 +0300 Subject: [PATCH 5/7] 'native' is a java keyword, so javac doesn't allow it as a package name component. Renamed 'native' to 'konan'. Moved BinaryMetadata.proto to konan/llvm where it belongs for now. --- .../kotlin/backend/{native => konan}/DescriptorUtils.kt | 0 .../jetbrains/kotlin/backend/{native => konan}/ModuleIndex.kt | 0 .../kotlin/backend/{native => konan}/NativeBackendFacade.kt | 0 .../kotlin/backend/{native => konan}/NativeIrCodegenFactory.kt | 0 .../kotlin/backend/{ => konan/llvm}/BinaryMetadata.proto | 3 ++- .../kotlin/backend/{native => konan}/llvm/CodeGenerator.kt | 0 .../jetbrains/kotlin/backend/{native => konan}/llvm/Context.kt | 0 .../kotlin/backend/{native => konan}/llvm/ContextUtils.kt | 0 .../kotlin/backend/{native => konan}/llvm/DataLayout.kt | 0 .../kotlin/backend/{native => konan}/llvm/HashUtils.kt | 0 .../kotlin/backend/{native => konan}/llvm/IrToBitcode.kt | 0 .../kotlin/backend/{native => konan}/llvm/LlvmUtils.kt | 0 .../jetbrains/kotlin/backend/{native => konan}/llvm/Logger.kt | 0 .../kotlin/backend/{native => konan}/llvm/MetadataGenerator.kt | 0 .../kotlin/backend/{native => konan}/llvm/NameUtils.kt | 0 .../kotlin/backend/{native => konan}/llvm/RTTIGenerator.kt | 0 .../jetbrains/kotlin/backend/{native => konan}/llvm/Runtime.kt | 0 17 files changed, 2 insertions(+), 1 deletion(-) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/DescriptorUtils.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/ModuleIndex.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/NativeBackendFacade.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/NativeIrCodegenFactory.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{ => konan/llvm}/BinaryMetadata.proto (74%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/CodeGenerator.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/Context.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/ContextUtils.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/DataLayout.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/HashUtils.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/IrToBitcode.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/LlvmUtils.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/Logger.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/MetadataGenerator.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/NameUtils.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/RTTIGenerator.kt (100%) rename backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/{native => konan}/llvm/Runtime.kt (100%) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/DescriptorUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/DescriptorUtils.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/DescriptorUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/ModuleIndex.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ModuleIndex.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/ModuleIndex.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ModuleIndex.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeBackendFacade.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeBackendFacade.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeIrCodegenFactory.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/NativeIrCodegenFactory.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto similarity index 74% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto index 66d8254edb2..45680031844 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/BinaryMetadata.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto @@ -1,6 +1,6 @@ syntax="proto2"; -package org.jetbrains.kotlin.backend; +package org.jetbrains.kotlin.backend.konan.llvm; option java_outer_classname = "BinaryMetadata"; @@ -8,3 +8,4 @@ message FunMetadata { required string hash = 1; required string name = 2; } + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/CodeGenerator.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Context.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Context.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Context.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/ContextUtils.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/DataLayout.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/DataLayout.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DataLayout.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/HashUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/HashUtils.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/HashUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/IrToBitcode.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/LlvmUtils.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Logger.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Logger.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Logger.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/MetadataGenerator.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/NameUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/NameUtils.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/NameUtils.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/NameUtils.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/RTTIGenerator.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Runtime.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt similarity index 100% rename from backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/llvm/Runtime.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/Runtime.kt From dab43d9862381cd28d623c16fe1e15350782f55c Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 7 Nov 2016 18:05:45 +0300 Subject: [PATCH 6/7] Added some type info to fun metadata --- .../backend/konan/llvm/BinaryMetadata.proto | 6 ++++ .../backend/konan/llvm/MetadataGenerator.kt | 30 +++++++++++++++---- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto index 45680031844..4c2b6eca0e6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto @@ -4,8 +4,14 @@ package org.jetbrains.kotlin.backend.konan.llvm; option java_outer_classname = "BinaryMetadata"; +message TypeMetadata { + required string name = 1; +} + message FunMetadata { required string hash = 1; required string name = 2; + required TypeMetadata rettype = 3; + repeated TypeMetadata arg = 4; } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt index 1efac2d8efc..52d72e8b953 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt @@ -4,8 +4,8 @@ package org.jetbrains.kotlin.backend.native.llvm import kotlin_native.interop.* import llvm.* import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.backend.BinaryMetadata -import org.jetbrains.kotlin.backend.BinaryMetadata.FunMetadata +import org.jetbrains.kotlin.backend.konan.llvm.BinaryMetadata.* +import org.jetbrains.kotlin.types.KotlinType internal class MetadataGenerator(override val context: Context): ContextUtils { @@ -31,15 +31,33 @@ internal class MetadataGenerator(override val context: Context): ContextUtils { LLVMAddNamedMetadataOperand(context.llvmModule, name, md) } - private fun serializeFunSignature(declaration:IrFunction): String { - val builder = FunMetadata.newBuilder() + private fun protobufType(type:KotlinType): TypeMetadata { + val builder = TypeMetadata.newBuilder() + val name = type.toString() + val proto = builder + .setName(name) + .build() + + return proto + } + + private fun serializeFunSignature(declaration: IrFunction): String { + val func = declaration.descriptor val hash = "0x123456 some hash" - val name = declaration.descriptor.name.asString() + val name = func.name.asString() - val proto = builder + val ktype = func.getReturnType()!! + val rettype = protobufType(ktype) + + val params = func.getValueParameters() + val argtypes = params.map{ protobufType(it.getType()) } + + val proto = FunMetadata.newBuilder() .setHash(hash) .setName(name) + .setRettype(rettype) + .addAllArg(argtypes) .build() // Convert it to ProtoBuf's TextFormat representation. From 9a5454c333898c151d80e50d6bb2952513b3d946 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 7 Nov 2016 18:47:34 +0300 Subject: [PATCH 7/7] Disentangled class metadata and llvm metadata. It was decided to call class data 'link data'. And retain the metadata name for LLVM metadata. --- .../backend/konan/llvm/BinaryLinkdata.proto | 17 ++++++++++ .../backend/konan/llvm/BinaryMetadata.proto | 17 ---------- .../backend/konan/llvm/MetadataGenerator.kt | 33 +++++++++---------- 3 files changed, 33 insertions(+), 34 deletions(-) create mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryLinkdata.proto delete mode 100644 backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryLinkdata.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryLinkdata.proto new file mode 100644 index 00000000000..158243a0676 --- /dev/null +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryLinkdata.proto @@ -0,0 +1,17 @@ + +syntax="proto2"; +package org.jetbrains.kotlin.backend.konan.llvm; + +option java_outer_classname = "BinaryLinkdata"; + +message TypeLinkdata { + required string name = 1; +} + +message FunLinkdata { + required string hash = 1; + required string name = 2; + required TypeLinkdata returnType = 3; + repeated TypeLinkdata arg = 4; +} + diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto deleted file mode 100644 index 4c2b6eca0e6..00000000000 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryMetadata.proto +++ /dev/null @@ -1,17 +0,0 @@ - -syntax="proto2"; -package org.jetbrains.kotlin.backend.konan.llvm; - -option java_outer_classname = "BinaryMetadata"; - -message TypeMetadata { - required string name = 1; -} - -message FunMetadata { - required string hash = 1; - required string name = 2; - required TypeMetadata rettype = 3; - repeated TypeMetadata arg = 4; -} - diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt index 52d72e8b953..bd3c306f2af 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/MetadataGenerator.kt @@ -4,7 +4,7 @@ package org.jetbrains.kotlin.backend.native.llvm import kotlin_native.interop.* import llvm.* import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.backend.konan.llvm.BinaryMetadata.* +import org.jetbrains.kotlin.backend.konan.llvm.BinaryLinkdata.* import org.jetbrains.kotlin.types.KotlinType internal class MetadataGenerator(override val context: Context): ContextUtils { @@ -13,16 +13,16 @@ internal class MetadataGenerator(override val context: Context): ContextUtils { return LLVMMDString(str, str.length)!! } - private fun metadataNode(args: MutableList): LLVMOpaqueValue { + private fun metadataNode(args: List): LLVMOpaqueValue { memScoped { - val rargs = alloc(array[args.size](Ref to LLVMOpaqueValue)) - args.forEachIndexed { i, llvmOpaqueValue -> rargs[i].value = args[i]} - return LLVMMDNode(rargs[0], args.size)!! + val references = alloc(array[args.size](Ref to LLVMOpaqueValue)) + args.forEachIndexed { i, llvmOpaqueValue -> references[i].value = args[i]} + return LLVMMDNode(references[0], args.size)!! } } private fun metadataFun(fn: LLVMOpaqueValue?, info: String): LLVMOpaqueValue { - val args: MutableList = mutableListOf(fn, metadataString(info)); + val args = listOf(fn, metadataString(info)); val md = metadataNode(args) return md } @@ -31,8 +31,8 @@ internal class MetadataGenerator(override val context: Context): ContextUtils { LLVMAddNamedMetadataOperand(context.llvmModule, name, md) } - private fun protobufType(type:KotlinType): TypeMetadata { - val builder = TypeMetadata.newBuilder() + private fun protobufType(type:KotlinType): TypeLinkdata { + val builder = TypeLinkdata.newBuilder() val name = type.toString() val proto = builder .setName(name) @@ -47,24 +47,23 @@ internal class MetadataGenerator(override val context: Context): ContextUtils { val hash = "0x123456 some hash" val name = func.name.asString() - val ktype = func.getReturnType()!! - val rettype = protobufType(ktype) + val kotlinType = func.getReturnType()!! + val returnType = protobufType(kotlinType) - val params = func.getValueParameters() - val argtypes = params.map{ protobufType(it.getType()) } + val parameters = func.getValueParameters() + val argumentTypes = parameters.map{ protobufType(it.getType()) } - val proto = FunMetadata.newBuilder() + val proto = FunLinkdata.newBuilder() .setHash(hash) .setName(name) - .setRettype(rettype) - .addAllArg(argtypes) + .setReturnType(returnType) + .addAllArg(argumentTypes) .build() // Convert it to ProtoBuf's TextFormat representation. // Use TextFormat.merge(str, builder) to parse it back val str = proto.toString() - - return str + return str } internal fun function(declaration: IrFunction) {