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
|
||||
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)
|
||||
}
|
||||
|
||||
+4
-4
@@ -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 }
|
||||
|
||||
|
||||
+7
-3
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>) {
|
||||
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())
|
||||
}
|
||||
Reference in New Issue
Block a user