Review feedback

This commit is contained in:
Svyatoslav Scherbina
2016-12-05 14:31:54 +07:00
committed by SvyatoslavScherbina
parent 415f2f1d35
commit 737a132b5d
6 changed files with 34 additions and 12 deletions
@@ -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)
}
@@ -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 }
@@ -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)
}
+6
View File
@@ -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())
}