diff --git a/translator/.idea/modules/translator_test.iml b/translator/.idea/modules/translator_test.iml index 55d07f067ff..a13aea70b5f 100644 --- a/translator/.idea/modules/translator_test.iml +++ b/translator/.idea/modules/translator_test.iml @@ -10,6 +10,7 @@ + diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 759c6e97582..1cebd8749cd 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -118,7 +118,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val receiveValue = state.bindingContext.get(BindingContext.COMPILE_TIME_VALUE, expr) val type = (receiveValue as TypedCompileTimeConstant).type val value = receiveValue.getValue(type) ?: return null - val variable = variableManager.receiveVariable(".str", LLVMStringType(value.toString().length), LLVMVariableScope(), pointer = 0) + val variable = variableManager.receiveVariable(".str", LLVMStringType(value.toString().length, isLoaded = false), LLVMVariableScope(), pointer = 0) codeBuilder.addStringConstant(variable, value.toString()) return variable @@ -512,6 +512,17 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va codeBuilder.loadVariable(result, value as LLVMVariable) } + when (value.type) { + is LLVMStringType -> if (!(value.type as LLVMStringType).isLoaded) { + val newVariable = codeBuilder.getNewVariable(value.type!!, pointer = result.pointer + 1) + codeBuilder.allocStackPointedVarAsValue(newVariable) + codeBuilder.copyVariable(result as LLVMVariable, newVariable) + + result = codeBuilder.getNewVariable(argument.type, pointer = newVariable.pointer - 1) + codeBuilder.loadVariable(result, newVariable as LLVMVariable) + } + } + return result } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 6d22b336718..9968664c578 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -93,6 +93,7 @@ class LLVMBuilder(val arm: Boolean = false) { val stringType = source.type as LLVMStringType val code = "store ${target.type} getelementptr inbounds (" + "${stringType.fullType()}* $source, i32 0, i32 $offset), ${target.getType()} $target, align ${stringType.align}" + (target.type as LLVMStringType).isLoaded = true localCode.appendln(code) } @@ -139,7 +140,7 @@ class LLVMBuilder(val arm: Boolean = false) { } fun copyVariable(from: LLVMVariable, to: LLVMVariable) = when (from.type) { - is LLVMStringType -> storeString(to, from, 0) + is LLVMStringType -> if ((from.type as LLVMStringType).isLoaded) copyVariableValue(to, from) else storeString(to, from, 0) else -> copyVariableValue(to, from) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt index d422722e8a5..14c91e9aeec 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMStringType.kt @@ -1,6 +1,6 @@ package org.kotlinnative.translator.llvm.types -class LLVMStringType(override val length: Int) : LLVMArray, LLVMType() { +class LLVMStringType(override val length: Int, var isLoaded: Boolean = true) : LLVMArray, LLVMType() { override var size: Int = 1 override val align = 8 @@ -14,11 +14,12 @@ class LLVMStringType(override val length: Int) : LLVMArray, LLVMType() { else -> false } + override fun basicType() = LLVMCharType() override val typename = "i8*" override fun fullType() = "[${length + 1} x i8]" override fun hashCode(): Int { - return length * 31 + + return length * 31 + if (isLoaded) 1 else 0 + mangle().hashCode() } }