CODEGEN: Possibility to create string literal from String implemented (refactoring)

This commit is contained in:
Konstantin Anisimov
2016-12-14 15:08:21 +03:00
committed by vvlevchenko
parent 4706ec9ddd
commit bca03288f6
2 changed files with 10 additions and 5 deletions
@@ -122,6 +122,9 @@ internal class StaticData(override val context: Context): ContextUtils {
private val stringLiterals = mutableMapOf<String, ConstPointer>() private val stringLiterals = mutableMapOf<String, ConstPointer>()
fun kotlinStringLiteral(value: String) =
stringLiterals.getOrPut(value) { createKotlinStringLiteral(value) }
fun kotlinStringLiteral(value: IrConst<String>) = fun kotlinStringLiteral(value: IrConst<String>) =
stringLiterals.getOrPut(value.value) { createKotlinStringLiteral(value) } stringLiterals.getOrPut(value.value) { createKotlinStringLiteral(value) }
} }
@@ -41,11 +41,13 @@ private fun StaticData.staticContainerHeader(): Struct {
return Struct(header, padding) return Struct(header, padding)
} }
internal fun StaticData.createKotlinStringLiteral(value: IrConst<String>): ConstPointer { internal fun StaticData.createKotlinStringLiteral(value: IrConst<String>) = createKotlinStringLiteral(value.value)
val name = "kstr:" + value.value.globalHashBase64
val elements = value.value.toByteArray(Charsets.UTF_8).map { Int8(it) }
val objRef = createKotlinArray(value.type, elements) internal fun StaticData.createKotlinStringLiteral(value: String): ConstPointer {
val name = "kstr:" + value.globalHashBase64
val elements = value.toByteArray(Charsets.UTF_8).map(::Int8)
val objRef = createKotlinArray(KonanPlatform.builtIns.stringType, elements)
val res = createAlias(name, objRef) val res = createAlias(name, objRef)
LLVMSetLinkage(res.llvm, LLVMLinkage.LLVMWeakAnyLinkage) LLVMSetLinkage(res.llvm, LLVMLinkage.LLVMWeakAnyLinkage)