Review feedback
This commit is contained in:
committed by
SvyatoslavScherbina
parent
415f2f1d35
commit
737a132b5d
+5
-3
@@ -24,6 +24,11 @@ internal interface ContextUtils {
|
|||||||
val runtime: Runtime
|
val runtime: Runtime
|
||||||
get() = context.runtime
|
get() = context.runtime
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the target platform.
|
||||||
|
*
|
||||||
|
* TODO: using [llvmTargetData] usually results in generating non-portable bitcode.
|
||||||
|
*/
|
||||||
val llvmTargetData: LLVMTargetDataRef
|
val llvmTargetData: LLVMTargetDataRef
|
||||||
get() = runtime.targetData
|
get() = runtime.targetData
|
||||||
|
|
||||||
@@ -155,7 +160,4 @@ internal interface ContextUtils {
|
|||||||
|
|
||||||
val FqName.localHash: LocalHash
|
val FqName.localHash: LocalHash
|
||||||
get() = this.toString().localHash
|
get() = this.toString().localHash
|
||||||
|
|
||||||
val pointerSize: Int
|
|
||||||
get() = LLVMPointerSize(llvmTargetData)
|
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -121,7 +121,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val arrayClasses = mapOf(
|
private val arrayClasses = mapOf(
|
||||||
"kotlin.Array" to -pointerSize,
|
"kotlin.Array" to -LLVMABISizeOfType(llvmTargetData, kObjHeaderPtr).toInt(),
|
||||||
"kotlin.ByteArray" to -1,
|
"kotlin.ByteArray" to -1,
|
||||||
"kotlin.CharArray" to -2,
|
"kotlin.CharArray" to -2,
|
||||||
"kotlin.ShortArray" 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 {
|
private fun getInstanceSize(classType: LLVMTypeRef?, className: FqName) : Int {
|
||||||
val arraySize = arrayClasses.get(className.asString());
|
val arraySize = arrayClasses.get(className.asString());
|
||||||
if (arraySize != null) return arraySize;
|
if (arraySize != null) return arraySize;
|
||||||
return LLVMStoreSizeOfType(runtime.targetData, classType).toInt()
|
return LLVMStoreSizeOfType(llvmTargetData, classType).toInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generate(classDesc: ClassDescriptor) {
|
fun generate(classDesc: ClassDescriptor) {
|
||||||
@@ -166,14 +166,14 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: reuse offsets obtained for 'fields' below
|
// 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,
|
val objOffsetsPtr = staticData.placeGlobalConstArray("krefs:$className", int32Type,
|
||||||
objOffsets.map { Int32(it.toInt()) })
|
objOffsets.map { Int32(it.toInt()) })
|
||||||
|
|
||||||
val fields = classDesc.fields.mapIndexed { index, field ->
|
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
|
// 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 nameSignature = field.fqNameSafe.localHash // FIXME: add signature
|
||||||
val fieldOffset = LLVMOffsetOfElement(runtime.targetData, classType, index)
|
val fieldOffset = LLVMOffsetOfElement(llvmTargetData, classType, index)
|
||||||
FieldTableRecord(nameSignature, fieldOffset.toInt())
|
FieldTableRecord(nameSignature, fieldOffset.toInt())
|
||||||
}.sortedBy { it.nameSignature.value }
|
}.sortedBy { it.nameSignature.value }
|
||||||
|
|
||||||
|
|||||||
+7
-3
@@ -15,13 +15,17 @@ internal class StaticData(override val context: Context): ContextUtils {
|
|||||||
companion object {
|
companion object {
|
||||||
fun create(staticData: StaticData, type: LLVMTypeRef, name: String): Global {
|
fun create(staticData: StaticData, type: LLVMTypeRef, name: String): Global {
|
||||||
val module = staticData.context.llvmModule
|
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")
|
throw IllegalArgumentException("Global '$name' already exists")
|
||||||
}
|
}
|
||||||
|
|
||||||
val llvmGlobal = LLVMAddGlobal(module, type, name)!!
|
val llvmGlobal = LLVMAddGlobal(module, type, name)!!
|
||||||
|
if (isUnnamed) {
|
||||||
if (name == "") {
|
// Currently using unnamed globals may result in link errors due to symbol redefinition;
|
||||||
|
// apply the workaround:
|
||||||
LLVMSetLinkage(llvmGlobal, LLVMLinkage.LLVMPrivateLinkage)
|
LLVMSetLinkage(llvmGlobal, LLVMLinkage.LLVMPrivateLinkage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -479,9 +479,15 @@ task array_list1(type: RunKonanTest) {
|
|||||||
|
|
||||||
task listof0(type: RunKonanTest) {
|
task listof0(type: RunKonanTest) {
|
||||||
goldValue = "abc\n[a, b, c, d]\n[n, s, a]\n"
|
goldValue = "abc\n[a, b, c, d]\n[n, s, a]\n"
|
||||||
|
arguments = ["a"]
|
||||||
source = "runtime/collections/listof0.kt"
|
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) {
|
task moderately_large_array(type: RunKonanTest) {
|
||||||
goldValue = "0\n"
|
goldValue = "0\n"
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun main(args: Array<String>) {
|
||||||
|
val list = foo()
|
||||||
|
println(list === foo())
|
||||||
|
println(list.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(): List<String> {
|
||||||
|
return listOf("a", "b", "c")
|
||||||
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
fun main(args : Array<String>) {
|
fun main(args : Array<String>) {
|
||||||
val list = arrayListOf("a", "b", "c")
|
val nonConstStr = args[0]
|
||||||
|
val list = arrayListOf(nonConstStr, "b", "c")
|
||||||
for (element in list) print(element)
|
for (element in list) print(element)
|
||||||
println()
|
println()
|
||||||
list.add("d")
|
list.add("d")
|
||||||
println(list.toString())
|
println(list.toString())
|
||||||
|
|
||||||
val list2 = listOf("n", "s", "a")
|
val list2 = listOf("n", "s", nonConstStr)
|
||||||
println(list2.toString())
|
println(list2.toString())
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user