translator: fix malloc in ByteArray
This commit is contained in:
@@ -18,9 +18,10 @@ class PropertyCodegen(val state: TranslationState, val variableManager: Variable
|
|||||||
val value = varInfo.value
|
val value = varInfo.value
|
||||||
if (kotlinType.nameIfStandardType != null) {
|
if (kotlinType.nameIfStandardType != null) {
|
||||||
val variableType = LLVMInstanceOfStandardType(property.name ?: return, kotlinType).type
|
val variableType = LLVMInstanceOfStandardType(property.name ?: return, kotlinType).type
|
||||||
val variable = LLVMVariable(property.name.toString(), variableType, property.name.toString(), LLVMVariableScope(), pointer = 1)
|
val variable = LLVMVariable(property.name.toString(), variableType, property.name.toString(), LLVMVariableScope())
|
||||||
variableManager.addGlobalVariable(property.name.toString(), variable)
|
variableManager.addGlobalVariable(property.name.toString(), variable)
|
||||||
codeBuilder.defineGlobalVariable(variable, variableType.parseArg(value.toString()))
|
codeBuilder.defineGlobalVariable(variable, variableType.parseArg(value.toString()))
|
||||||
|
variable.pointer++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,18 @@ class LLVMBuilder(val arm: Boolean) {
|
|||||||
private fun initBuilder() {
|
private fun initBuilder() {
|
||||||
val declares = arrayOf(
|
val declares = arrayOf(
|
||||||
"declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)",
|
"declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)",
|
||||||
"declare i8* @${if (arm) "malloc_static" else "malloc"}(i32)")
|
if (arm) "declare i8* @malloc_static(i32)" else
|
||||||
|
"""
|
||||||
|
declare i8* @malloc(i32) #0
|
||||||
|
define i8* @malloc_static(i32 %size) #0 {
|
||||||
|
%1 = alloca i32, align 4
|
||||||
|
store i32 %size, i32* %1, align 4
|
||||||
|
%2 = load i32* %1, align 4
|
||||||
|
%3 = call i8* @malloc(i32 %2)
|
||||||
|
ret i8* %3
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
|
||||||
declares.forEach { globalCode.appendln(it) }
|
declares.forEach { globalCode.appendln(it) }
|
||||||
|
|
||||||
@@ -188,7 +199,7 @@ class LLVMBuilder(val arm: Boolean) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun makeStructInitializer(args: List<LLVMVariable>, values: List<String>)
|
fun makeStructInitializer(args: List<LLVMVariable>, values: List<String>)
|
||||||
= "{ ${ args.mapIndexed { i: Int, variable: LLVMVariable -> "${variable.type} ${values[i]}" }.joinToString() } }"
|
= "{ ${args.mapIndexed { i: Int, variable: LLVMVariable -> "${variable.type} ${values[i]}" }.joinToString()} }"
|
||||||
|
|
||||||
fun loadAndGetVariable(source: LLVMVariable): LLVMVariable {
|
fun loadAndGetVariable(source: LLVMVariable): LLVMVariable {
|
||||||
assert(source.pointer > 0)
|
assert(source.pointer > 0)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
declare i8* @malloc(i32) #1
|
declare i8* @malloc_static(i32)
|
||||||
|
|
||||||
define i32 @malloc_array(i32 %x) #0 {
|
define i32 @malloc_array(i32 %x) #0 {
|
||||||
%1 = alloca i32, align 4
|
%1 = alloca i32, align 4
|
||||||
store i32 %x, i32* %1, align 4
|
store i32 %x, i32* %1, align 4
|
||||||
%2 = load i32* %1, align 4
|
%2 = load i32* %1, align 4
|
||||||
%3 = call i8* @malloc(i32 %2)
|
%3 = call i8* @malloc_static(i32 %2)
|
||||||
%4 = ptrtoint i8* %3 to i32
|
%4 = ptrtoint i8* %3 to i32
|
||||||
ret i32 %4
|
ret i32 %4
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user