translator: valid malloc for x86

This commit is contained in:
e5l
2016-07-18 17:20:51 +03:00
parent 90bb2998f6
commit 2f14894ff8
3 changed files with 9 additions and 10 deletions
+6 -7
View File
@@ -1,8 +1,7 @@
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)
declare i8* @malloc_static(i32)
attributes #0 = { nounwind "stack-protector-buffer-size"="8" "target-cpu"="cortex-m3" "target-features"="+hwdiv,+strict-align" }
declare i8* @malloc(i32)
%class.ComplexRef = type { i32, %class.Simple* }
define void @ComplexRef(%class.ComplexRef* %classvariable.this, i32 %i, %class.Simple* %s) #0
define void @ComplexRef(%class.ComplexRef* %classvariable.this, i32 %i, %class.Simple* %s)
{
%classvariable.this.addr = alloca %class.ComplexRef, align 4
%i.addr = alloca i32, align 4
@@ -18,7 +17,7 @@ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var4, i8* %var5, i64 8, i32 4, i1 fals
ret void
}
%class.Simple = type { i32 }
define void @Simple(%class.Simple* %classvariable.this, i32 %i) #0
define void @Simple(%class.Simple* %classvariable.this, i32 %i)
{
%classvariable.this.addr = alloca %class.Simple, align 4
%i.addr = alloca i32, align 4
@@ -31,15 +30,15 @@ store i32 %var6, i32* %var7, align 4
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var8, i8* %var9, i64 4, i32 4, i1 false)
ret void
}
define void @kotlin_main() #0
define void @main()
{
%var11 = call i8* @malloc_static(i32 4)
%var11 = call i8* @malloc(i32 4)
%var10 = bitcast i8* %var11 to %class.Simple*
call void @Simple(%class.Simple* %var10, i32 5)
%managed.s.1 = alloca %class.Simple, align 4
%var12 = load %class.Simple* %var10, align 4
store %class.Simple %var12, %class.Simple* %managed.s.1, align 4
%var14 = call i8* @malloc_static(i32 4)
%var14 = call i8* @malloc(i32 4)
%var13 = bitcast i8* %var14 to %class.ComplexRef*
call void @ComplexRef(%class.ComplexRef* %var13, i32 1, %class.Simple* %managed.s.1)
%managed.i.1 = alloca %class.ComplexRef, align 4
+1 -1
View File
@@ -10,7 +10,7 @@ fun main(args: Array<String>) {
}
val disposer = Disposer.newDisposable()
val state = parseAndAnalyze(args.asList(), disposer, arm = true)
val state = parseAndAnalyze(args.asList(), disposer, arm = false)
val files = state.environment.getSourceFiles()
if (files.isEmpty()) {
@@ -22,7 +22,7 @@ class LLVMBuilder(val arm: Boolean) {
private fun initBuilder() {
val declares = arrayOf(
"declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)",
"declare i8* @malloc_static(i32)")
"declare i8* @${if (arm) "malloc_static" else "malloc"}(i32)")
declares.forEach { globalCode.appendln(it) }
@@ -168,7 +168,7 @@ class LLVMBuilder(val arm: Boolean) {
val allocedVar = getNewVariable(LLVMCharType(), pointer = 1)
val size = if (target.pointer > 0) POINTER_SIZE else target.type.size
val alloc = "$allocedVar = call i8* @malloc_static(i32 $size)"
val alloc = "$allocedVar = call i8* @${if (arm) "malloc_static" else "malloc"}(i32 $size)"
localCode.appendln(alloc)
val cast = "$target = bitcast ${allocedVar.getType()} $allocedVar to ${target.getType()}"