From 737a132b5d91ebeb40beac4762f20c2c0219f201 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Mon, 5 Dec 2016 14:31:54 +0700 Subject: [PATCH] Review feedback --- .../kotlin/backend/konan/llvm/ContextUtils.kt | 8 +++++--- .../kotlin/backend/konan/llvm/RTTIGenerator.kt | 8 ++++---- .../jetbrains/kotlin/backend/konan/llvm/StaticData.kt | 10 +++++++--- backend.native/tests/build.gradle | 6 ++++++ backend.native/tests/datagen/literals/listof1.kt | 9 +++++++++ backend.native/tests/runtime/collections/listof0.kt | 5 +++-- 6 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 backend.native/tests/datagen/literals/listof1.kt diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt index d3be020a764..b55531974c4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/ContextUtils.kt @@ -24,6 +24,11 @@ internal interface ContextUtils { val runtime: Runtime get() = context.runtime + /** + * Describes the target platform. + * + * TODO: using [llvmTargetData] usually results in generating non-portable bitcode. + */ val llvmTargetData: LLVMTargetDataRef get() = runtime.targetData @@ -155,7 +160,4 @@ internal interface ContextUtils { val FqName.localHash: LocalHash get() = this.toString().localHash - - val pointerSize: Int - get() = LLVMPointerSize(llvmTargetData) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt index 6126fb6f126..070f2ba2512 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/RTTIGenerator.kt @@ -121,7 +121,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { } private val arrayClasses = mapOf( - "kotlin.Array" to -pointerSize, + "kotlin.Array" to -LLVMABISizeOfType(llvmTargetData, kObjHeaderPtr).toInt(), "kotlin.ByteArray" to -1, "kotlin.CharArray" to -2, "kotlin.ShortArray" to -2, @@ -136,7 +136,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { private fun getInstanceSize(classType: LLVMTypeRef?, className: FqName) : Int { val arraySize = arrayClasses.get(className.asString()); if (arraySize != null) return arraySize; - return LLVMStoreSizeOfType(runtime.targetData, classType).toInt() + return LLVMStoreSizeOfType(llvmTargetData, classType).toInt() } fun generate(classDesc: ClassDescriptor) { @@ -166,14 +166,14 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils { } } // TODO: reuse offsets obtained for 'fields' below - val objOffsets = refFieldIndices.map { LLVMOffsetOfElement(runtime.targetData, classType, it) } + val objOffsets = refFieldIndices.map { LLVMOffsetOfElement(llvmTargetData, classType, it) } val objOffsetsPtr = staticData.placeGlobalConstArray("krefs:$className", int32Type, objOffsets.map { Int32(it.toInt()) }) val fields = classDesc.fields.mapIndexed { index, field -> // Note: using FQ name because a class may have multiple fields with the same name due to property overriding val nameSignature = field.fqNameSafe.localHash // FIXME: add signature - val fieldOffset = LLVMOffsetOfElement(runtime.targetData, classType, index) + val fieldOffset = LLVMOffsetOfElement(llvmTargetData, classType, index) FieldTableRecord(nameSignature, fieldOffset.toInt()) }.sortedBy { it.nameSignature.value } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt index a68f10458ef..9b06f919f9d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/StaticData.kt @@ -15,13 +15,17 @@ internal class StaticData(override val context: Context): ContextUtils { companion object { fun create(staticData: StaticData, type: LLVMTypeRef, name: String): Global { val module = staticData.context.llvmModule - if (name != "" && LLVMGetNamedGlobal(module, name) != null) { + + val isUnnamed = (name == "") // LLVM will select the unique index and represent the global as `@idx`. + + if (!isUnnamed && LLVMGetNamedGlobal(module, name) != null) { throw IllegalArgumentException("Global '$name' already exists") } val llvmGlobal = LLVMAddGlobal(module, type, name)!! - - if (name == "") { + if (isUnnamed) { + // Currently using unnamed globals may result in link errors due to symbol redefinition; + // apply the workaround: LLVMSetLinkage(llvmGlobal, LLVMLinkage.LLVMPrivateLinkage) } diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index cd44549a5fc..514d2ad03de 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -479,9 +479,15 @@ task array_list1(type: RunKonanTest) { task listof0(type: RunKonanTest) { goldValue = "abc\n[a, b, c, d]\n[n, s, a]\n" + arguments = ["a"] source = "runtime/collections/listof0.kt" } +task listof1(type: RunKonanTest) { + goldValue = "true\n[a, b, c]\n" + source = "datagen/literals/listof1.kt" +} + task moderately_large_array(type: RunKonanTest) { goldValue = "0\n" diff --git a/backend.native/tests/datagen/literals/listof1.kt b/backend.native/tests/datagen/literals/listof1.kt new file mode 100644 index 00000000000..237c9f1044d --- /dev/null +++ b/backend.native/tests/datagen/literals/listof1.kt @@ -0,0 +1,9 @@ +fun main(args: Array) { + val list = foo() + println(list === foo()) + println(list.toString()) +} + +fun foo(): List { + return listOf("a", "b", "c") +} \ No newline at end of file diff --git a/backend.native/tests/runtime/collections/listof0.kt b/backend.native/tests/runtime/collections/listof0.kt index 92ebdcb7684..ee6495194fb 100644 --- a/backend.native/tests/runtime/collections/listof0.kt +++ b/backend.native/tests/runtime/collections/listof0.kt @@ -1,10 +1,11 @@ fun main(args : Array) { - val list = arrayListOf("a", "b", "c") + val nonConstStr = args[0] + val list = arrayListOf(nonConstStr, "b", "c") for (element in list) print(element) println() list.add("d") println(list.toString()) - val list2 = listOf("n", "s", "a") + val list2 = listOf("n", "s", nonConstStr) println(list2.toString()) } \ No newline at end of file