diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index 0108d1418f5..44774ac1a36 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -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 + } } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt index 38036a1d5a6..8d939230465 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMLongType.kt @@ -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" diff --git a/translator/src/test/kotlin/tests/input/class_alignment_1.txt b/translator/src/test/kotlin/tests/input/class_alignment_1.txt new file mode 100644 index 00000000000..5a69fd59e36 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/class_alignment_1.txt @@ -0,0 +1 @@ +class_alignment_1() == 300 diff --git a/translator/src/test/kotlin/tests/kotlin/class_alignment_1.kt b/translator/src/test/kotlin/tests/kotlin/class_alignment_1.kt new file mode 100644 index 00000000000..38519d4616d --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/class_alignment_1.kt @@ -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 +} \ No newline at end of file