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()
}
}