translator: rewrite calculating class size - fix class allocation, test

This commit is contained in:
Alexey Stepanov
2016-08-15 12:09:27 +03:00
parent c42e82b209
commit 31ccb13ec5
4 changed files with 27 additions and 2 deletions
@@ -1,5 +1,6 @@
package org.kotlinnative.translator
import com.jshmrsn.karg.defaultPrintHelpCallback
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtParameter
@@ -48,6 +49,8 @@ class ClassCodegen(state: TranslationState,
return
}
for (field in parameters) {
val item = resolveType(field, state.bindingContext.get(BindingContext.TYPE, field.typeReference)!!)
item.offset = fields.size
@@ -55,7 +58,18 @@ class ClassCodegen(state: TranslationState,
constructorFields.add(item)
fields.add(item)
fieldsIndex[item.label] = item
size += item.type.size
}
val classAlignment = fields.map { it.type.size }.max()?.toInt() ?: 0
var alignmentRemainder = 0
for (item in fields) {
alignmentRemainder = alignmentRemainder - (alignmentRemainder % item.type.size)
if (alignmentRemainder < item.type.size) {
size += classAlignment
alignmentRemainder = classAlignment - item.type.size
} else {
alignmentRemainder -= item.type.size
}
}
}
@@ -69,7 +69,7 @@ class LLVMLongType() : LLVMType() {
return other is LLVMLongType
}
override val align = 4
override val align = 8
override var size: Int = 8
override val defaultValue = "0"
@@ -0,0 +1 @@
class_alignment_1() == 300
@@ -0,0 +1,10 @@
class class_alignment_1_class(var field1: Long, var field2: Int, var field3: Long)
fun class_alignment_1(): Long {
val b = class_alignment_1_class(100L, 200, 300L)
assert(b.field1 == 100L)
assert(b.field2 == 200)
assert(b.field3 == 300L)
return b.field3
}