translator: rewrite calculating class size - fix class allocation, test
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user