From a24cc9732fae8866c860d8d541c83b1005f063c1 Mon Sep 17 00:00:00 2001 From: e5l Date: Thu, 21 Jul 2016 13:31:34 +0300 Subject: [PATCH] translator: elvis operator, fix includes in build system, gradle jar build --- car_llvmkot/kotlib/kotlin_main.ll | 135 +++++++++--------- .../2.9/taskArtifacts/cache.properties.lock | Bin 17 -> 17 bytes .../.gradle/2.9/taskArtifacts/fileHashes.bin | Bin 18733 -> 26187 bytes .../2.9/taskArtifacts/fileSnapshots.bin | Bin 19118 -> 172634 bytes .../2.9/taskArtifacts/outputFileStates.bin | Bin 18632 -> 18932 bytes .../2.9/taskArtifacts/taskArtifacts.bin | Bin 19236 -> 24342 bytes translator/.idea/modules/ast-kotlin_test.iml | 1 + translator/build.gradle | 16 ++- translator/idea_run.sh | 3 +- translator/src/main/kotlin/main.kt | 8 +- .../kotlinnative/translator/BlockCodegen.kt | 101 +++++++++++-- .../translator/llvm/LLVMBuilder.kt | 47 +----- .../src/test/kotlin/tests/kotlin/if_1.kt | 6 +- 13 files changed, 179 insertions(+), 138 deletions(-) diff --git a/car_llvmkot/kotlib/kotlin_main.ll b/car_llvmkot/kotlib/kotlin_main.ll index 06f73785689..b057e1ddaa2 100644 --- a/car_llvmkot/kotlib/kotlin_main.ll +++ b/car_llvmkot/kotlib/kotlin_main.ll @@ -1,86 +1,72 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) declare i8* @malloc(i32) -%class.MyClass = type { i32 } -define void @MyClass(%class.MyClass* %classvariable.this, i32 %i) -{ -%classvariable.this.addr = alloca %class.MyClass, align 4 -%i.addr = alloca i32, align 4 -store i32 %i, i32* %i.addr, align 4 -%var1 = load i32* %i.addr, align 4 -%var2 = getelementptr inbounds %class.MyClass* %classvariable.this.addr, i32 0, i32 0 -store i32 %var1, i32* %var2, align 4 -%var3 = bitcast %class.MyClass* %classvariable.this to i8* -%var4 = bitcast %class.MyClass* %classvariable.this.addr to i8* -call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var3, i8* %var4, i64 4, i32 4, i1 false) -ret void -} %class.ByteArray = type { i32, i32 } define void @ByteArray(%class.ByteArray* %classvariable.this, i32 %size) { %classvariable.this.addr = alloca %class.ByteArray, align 4 %size.addr = alloca i32, align 4 store i32 %size, i32* %size.addr, align 4 -%var5 = load i32* %size.addr, align 4 -%var6 = getelementptr inbounds %class.ByteArray* %classvariable.this.addr, i32 0, i32 0 -store i32 %var5, i32* %var6, align 4 -%var7 = bitcast %class.ByteArray* %classvariable.this to i8* -%var8 = bitcast %class.ByteArray* %classvariable.this.addr to i8* -call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var7, i8* %var8, i64 8, i32 4, i1 false) -%var9 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 -%var10 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 -%var11 = load i32* %var10, align 4 -%var12 = call i32 @malloc_array(i32 %var11) -%var13 = alloca i32, align 4 -store i32 %var12, i32* %var13, align 4 -%var14 = load i32* %var9, align 4 -%var15 = load i32* %var13, align 4 -store i32 %var15, i32* %var9, align 4 +%var1 = load i32* %size.addr, align 4 +%var2 = getelementptr inbounds %class.ByteArray* %classvariable.this.addr, i32 0, i32 0 +store i32 %var1, i32* %var2, align 4 +%var3 = bitcast %class.ByteArray* %classvariable.this to i8* +%var4 = bitcast %class.ByteArray* %classvariable.this.addr to i8* +call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var3, i8* %var4, i64 8, i32 4, i1 false) +%var5 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 +%var6 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 +%var7 = load i32* %var6, align 4 +%var8 = call i32 @malloc_array(i32 %var7) +%var9 = alloca i32, align 4 +store i32 %var8, i32* %var9, align 4 +%var10 = load i32* %var5, align 4 +%var11 = load i32* %var9, align 4 +store i32 %var11, i32* %var5, align 4 ret void } define i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %index) { %index.addr = alloca i32, align 4 store i32 %index, i32* %index.addr, align 4 -%var16 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 -%var17 = load i32* %var16, align 4 -%var18 = load i32* %index.addr, align 4 -%var19 = call i8 @kotlinclib_get_byte(i32 %var17, i32 %var18) -%var20 = alloca i8, align 1 -store i8 %var19, i8* %var20, align 1 -%var21 = load i8* %var20, align 1 -ret i8 %var21 +%var12 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 +%var13 = load i32* %var12, align 4 +%var14 = load i32* %index.addr, align 4 +%var15 = call i8 @kotlinclib_get_byte(i32 %var13, i32 %var14) +%var16 = alloca i8, align 1 +store i8 %var15, i8* %var16, align 1 +%var17 = load i8* %var16, align 1 +ret i8 %var17 } define void @ByteArray.clone(%class.ByteArray** %instance, %class.ByteArray* %classvariable.this) { -%var22 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 -%var23 = load i32* %var22, align 4 -%var25 = call i8* @malloc(i32 8) -%var24 = bitcast i8* %var25 to %class.ByteArray* -call void @ByteArray(%class.ByteArray* %var24, i32 %var23) +%var18 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 +%var19 = load i32* %var18, align 4 +%var21 = call i8* @malloc(i32 8) +%var20 = bitcast i8* %var21 to %class.ByteArray* +call void @ByteArray(%class.ByteArray* %var20, i32 %var19) %managed.index.1 = alloca i32, align 4 store i32 0, i32* %managed.index.1, align 4 br label %label.while.1 label.while.1: -%var26 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 -%var27 = load i32* %managed.index.1, align 4 -%var28 = load i32* %var26, align 4 -%var29 = icmp slt i32 %var27, %var28 -br i1 %var29, label %label.while.2, label %label.while.3 +%var22 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0 +%var23 = load i32* %managed.index.1, align 4 +%var24 = load i32* %var22, align 4 +%var25 = icmp slt i32 %var23, %var24 +br i1 %var25, label %label.while.2, label %label.while.3 label.while.2: -%var30 = load i32* %managed.index.1, align 4 -%var31 = call i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %var30) -%var32 = alloca i8, align 1 -store i8 %var31, i8* %var32, align 1 +%var26 = load i32* %managed.index.1, align 4 +%var27 = call i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %var26) +%var28 = alloca i8, align 1 +store i8 %var27, i8* %var28, align 1 +%var29 = load i32* %managed.index.1, align 4 +%var30 = load i8* %var28, align 1 +call void @ByteArray.set(%class.ByteArray* %var20, i32 %var29, i8 %var30) +%var31 = load i32* %managed.index.1, align 4 +%var32 = add nsw i32 %var31, 1 %var33 = load i32* %managed.index.1, align 4 -%var34 = load i8* %var32, align 1 -call void @ByteArray.set(%class.ByteArray* %var24, i32 %var33, i8 %var34) -%var35 = load i32* %managed.index.1, align 4 -%var36 = add nsw i32 %var35, 1 -%var37 = load i32* %managed.index.1, align 4 -store i32 %var36, i32* %managed.index.1, align 4 +store i32 %var32, i32* %managed.index.1, align 4 br label %label.while.1 label.while.3: -store %class.ByteArray* %var24, %class.ByteArray** %instance, align 4 +store %class.ByteArray* %var20, %class.ByteArray** %instance, align 4 ret void } define void @ByteArray.set(%class.ByteArray* %classvariable.this, i32 %index, i8 %value) @@ -89,22 +75,29 @@ define void @ByteArray.set(%class.ByteArray* %classvariable.this, i32 %index, store i32 %index, i32* %index.addr, align 4 %value.addr = alloca i8, align 1 store i8 %value, i8* %value.addr, align 1 -%var38 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 -%var39 = load i32* %var38, align 4 -%var40 = load i32* %index.addr, align 4 -%var41 = load i8* %value.addr, align 1 -call void @kotlinclib_set_byte(i32 %var39, i32 %var40, i8 %var41) +%var34 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1 +%var35 = load i32* %var34, align 4 +%var36 = load i32* %index.addr, align 4 +%var37 = load i8* %value.addr, align 1 +call void @kotlinclib_set_byte(i32 %var35, i32 %var36, i8 %var37) ret void } declare i8 @kotlinclib_get_byte(i32 %src, i32 %index) +define i8 @bytearray_1(i8 %x) +{ +%x.addr = alloca i8, align 1 +store i8 %x, i8* %x.addr, align 1 +%var39 = call i8* @malloc(i32 8) +%var38 = bitcast i8* %var39 to %class.ByteArray* +call void @ByteArray(%class.ByteArray* %var38, i32 10) +%var40 = load i8* %x.addr, align 1 +call void @ByteArray.set(%class.ByteArray* %var38, i32 1, i8 %var40) +%var41 = call i8 @ByteArray.get(%class.ByteArray* %var38, i32 1) +%var42 = alloca i8, align 1 +store i8 %var41, i8* %var42, align 1 +%var43 = load i8* %var42, align 1 +ret i8 %var43 +} declare i32 @malloc_array(i32 %size) declare void @kotlinclib_set_byte(i32 %src, i32 %index, i8 %value) -define void @createMyClass(%class.MyClass** %instance) -{ -%var43 = call i8* @malloc(i32 4) -%var42 = bitcast i8* %var43 to %class.MyClass* -call void @MyClass(%class.MyClass* %var42, i32 1) -store %class.MyClass* %var42, %class.MyClass** %instance, align 4 -ret void -} diff --git a/translator/.gradle/2.9/taskArtifacts/cache.properties.lock b/translator/.gradle/2.9/taskArtifacts/cache.properties.lock index 5d12538d200fe76eab4922f28524ed748bb95639..d061c564a6c362c0fa68d0ea20f096102a1bc779 100644 GIT binary patch literal 17 VcmZSnTh{Pwzt;N`3}C?g763)R25kTU literal 17 UcmZSnTh{Pwzt;N`3=kj*07T^lmH+?% diff --git a/translator/.gradle/2.9/taskArtifacts/fileHashes.bin b/translator/.gradle/2.9/taskArtifacts/fileHashes.bin index 2097cddd1b2f81084c5415992454ec22cfecc211..697fb99ea5c7809f0b0d30517c410f84fd1d6cd5 100644 GIT binary patch literal 26187 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 S_)i}#x^C>_O>xvdwf_Nx;=d9A delta 69 zcmX?ohH>pA#tEXF3{W7pabmCd#0ABZln>snb<1PT%TNfSx diff --git a/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin b/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin index 15cddfed94eacbd5d669d5c0533d8b06a0ca593e..d791606d08d563a885eab2abd0afd7b1f0353cea 100644 GIT binary patch literal 172634 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 diff --git a/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin b/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin index 6e981f93221312c3930840ed8c4497defc650026..90ce29235990d584ce56c6f5505d6d052b1706bc 100644 GIT binary patch literal 18932 zcmeI(T}YEr9LMoTGq8wUC}Z>nwTkMdH;ceQZ!0$FZDkY%BZ4kM5h60JD3o3>M%3t{ zq(Dir1{-9%uu+8Ci^_vV#exu}F3MnDNEujnzgV2^x{B|CXAkH1JLin^xg9h8 zhT(B#)i830J9o+q0R#|0009ILKmY**5I_I{1Q0*~0R#|0009L42LW@ReT(VNO+4%J z*8->%d0o3b9y9S^gd9~ z?el+E>(5HQth8cDCjDqgt&d2))?JvMNG@KW^4*gAJ8zvF^_GvQb2=nH+Hlofx4mo9 z#2$ev$*XJH+s+?2SE=%tVlrHncjsbSEuwkRY0-oD%BlEQ?v zwo&Kp%$v7)ckg@O`+eX0zVA&YY02fdA!*m*4@aM5+PPkW{ssD8m;wC-`aW+V$MLi1 zd-*7y(9r5nu!u0Y=~} zOrWIMvHBD=Ya@?3y`0{w+vDT5Cr8aQeea^7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q>yD1c8=u9OpO!t(i3bi!#4U{`R)! z&FK^RDGU1+PRSAnT}DT0U(j$+2x2LqAVG@Af+6Wux)8-uB!aL|PWy^nI^;#Q{bpy*j(~vc_3@dxvxLyW#Z^$qr`eadr{Z`9Bq)*^6!KIvocLkH z;L>K5X6L%{D#|>0r4{)lMR^@mAQI`e`q}J>hWZaB><`J+sH@L=W(#zSjuzt6+#jHw zB#n=~)ila8`_4bMK6vF=-QL@|dEdISXj#tHElmV&B{FLt$CT=h!97M(qK85+@IdAQAGrZN4#@D_Pe)s#{2cGrR%nhZr?aFvF z^~{km?>*7>N`ey+cQBFKBCHrxuYs^UwOYoS zN<8m=2~+R6E!*R*C@k^13W_UA++I%|@wgn~eZ^AP3M&TJy9mY#jd~Q5jqAx6oFF4_ zZh^NVr=-|Z;>ueSKno>PF=khXOJI4jppLnLR-A!gs0i5@OEoSC6tTxnrf)hb{V0j! z3%F!mUW{T9f;MXXr@GkM1W4^_rL?C9@?Bv6xaByz;q}L)@#}9-|5#o;^3e3W(23B2 z!&4W%IOX*DE45-5j^pj@IH$YkIElge#vTM#CQ6g%=biMP^u_BVT3bJRwQWy>_tVK) ztLrbGcuE+(q_zva=gX0f4*x&V8`2Ne+Sa>0au)x(u4(=F6`x!#lm9%dF5`D|P8F3N zt{Q%}CnBeTbSwRSX_2${JdW!L)r})+yEE( zhDg$)=z*e64Ni$cb@bhvGi21kiLuT0#*ixc6cnIZk+5b*$o}mS(u)!DAmi<4-1QA@ z%NHa;r51@;QPE*=$sr@G7+fElP;3>7A-`!5vD6l$p`6AdBr*~5w@Ab~Cpw`BRx1Nl zPAMFikVQ;teXzq;%a$f+rV%j>H^Rh5Iq@PBAW`+KLUD$sDM(V^9EO*k+Va^Y2glFn zdR0q`N#b`M3!NEl@9#)Yy1?jy*mUoiuujwH@>9Z>m_ z9s*EJxyu@!e)&L_1u9DZf;ny4bQ-Q=>+~AkKw+p~;n zJYVnAGy|?2Qp8H+#B<{k2Df{bOIE8;Adc;fa(aHl+oSJ*zW|4uKmw2(V&(sZb#>fC z2_YcAla+4}0^$=BA^{vbuy6YbT}RJIHq^p!Zv%hmCW$q2P}MM+Dancn;jeqMxo5x- z0XYCAnZ*&5LplNS?_vrd#sv``@XofKe}8QGL^uZp_Bp^@ng!i5Td^7TA^gg+2MU=Tq&apMKK+aFM^aj&i+T@D+S9mT+S2&$kvRe+%Nl!lb;n4I|IS+ZF*%!86zdrc?U0A-_ z7b$)k!RUaC6y!E&Ny|sS+!9O~zFBSic=4a^N>8~k^+5U2^4s=*ZT99jbW!?78p!HZuBayCE8h z9o9vXKLLmN7->l(ezv;T!}}WV9c0!IZo3cHo%1H&{n}W^UwisMFFl_1{+-iSWHkCm z?)+$F<*4aX_g9WsnI7wDy|!d-e|XN_e^J+`|DIn{{lux}z_^2xjw;)FS}$r|{`5Zq D9A?Ld delta 69 zcmbQXk8#N~#tEXF3{W7pG4QPT#02BXauSMyj0VZl5lp + diff --git a/translator/build.gradle b/translator/build.gradle index 3286ebcc285..cbea023af9b 100644 --- a/translator/build.gradle +++ b/translator/build.gradle @@ -2,16 +2,19 @@ group 'ast-kotlin' version '1.0-SNAPSHOT' buildscript { + ext.kotlin_version = '1.0.3' + repositories { mavenCentral() } dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.2" } } apply plugin: 'java' apply plugin: 'kotlin' +apply plugin: 'application' repositories { mavenCentral() @@ -19,7 +22,16 @@ repositories { dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1" - // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-compiler compile group: 'org.jetbrains.kotlin', name: 'kotlin-compiler', version: '1.0.3' testCompile group: 'junit', name: 'junit', version: '4.11' } + +jar { + manifest { + attributes 'Main-Class': 'MainKt' + } + + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } +} + +mainClassName = 'MainKt' diff --git a/translator/idea_run.sh b/translator/idea_run.sh index 73b76133699..de4cd777fe6 100755 --- a/translator/idea_run.sh +++ b/translator/idea_run.sh @@ -1,4 +1,3 @@ #!/bin/bash - -/usr/lib/jvm/default-java/bin/java -Didea.launcher.port=7533 -Didea.launcher.bin.path=/opt/idea-IU-145.1617.8/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/default-java/jre/lib/charsets.jar:/usr/lib/jvm/default-java/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/default-java/jre/lib/ext/dnsns.jar:/usr/lib/jvm/default-java/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/default-java/jre/lib/ext/jaccess.jar:/usr/lib/jvm/default-java/jre/lib/ext/localedata.jar:/usr/lib/jvm/default-java/jre/lib/ext/nashorn.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunec.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/default-java/jre/lib/ext/zipfs.jar:/usr/lib/jvm/default-java/jre/lib/jce.jar:/usr/lib/jvm/default-java/jre/lib/jsse.jar:/usr/lib/jvm/default-java/jre/lib/management-agent.jar:/usr/lib/jvm/default-java/jre/lib/resources.jar:/usr/lib/jvm/default-java/jre/lib/rt.jar:/home/user/Kotlin/carkot/translator/build/classes/main:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.0.1/68cddd9aec83d23f789f72bfdc933db245c4a635/kotlin-stdlib-1.0.1.jar:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler/1.0.3/5dbeb14062996a5c2208861d6364cc97a21b06b8/kotlin-compiler-1.0.3.jar:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-runtime/1.0.1/124852ea8cdd3d89827923b5e79627e8a7c314b2/kotlin-runtime-1.0.1.jar:/opt/idea-IU-145.1617.8/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain MainKt $1 > $2 +java -jar build/libs/ast-kotlin-1.0-SNAPSHOT.jar $1 > $2 diff --git a/translator/src/main/kotlin/main.kt b/translator/src/main/kotlin/main.kt index 2a3bc8babb9..b834fa8c304 100644 --- a/translator/src/main/kotlin/main.kt +++ b/translator/src/main/kotlin/main.kt @@ -14,11 +14,9 @@ fun main(args: Array) { val analyzedFiles = ArrayList() - val kotlib = ClassLoader.getSystemClassLoader().getResources("kotlib/kotlin") - for (resource in kotlib) { - for (app in File(resource.toURI()).listFiles()) { - analyzedFiles.add(app.absoluteFile.toString()) - } + val kotlib = File("build/resources/main/kotlib/kotlin").listFiles() + for (resourse in kotlib) { + analyzedFiles.add(resourse.absolutePath) } analyzedFiles.addAll(args.toList()) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 49e09948129..a15430f089f 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -67,6 +67,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM is KtReferenceExpression -> evaluateReferenceExpression(expr, scopeDepth) is KtIfExpression -> evaluateIfOperator(expr.firstChild as LeafPsiElement, scopeDepth + 1, true) is KtStringTemplateExpression -> evaluateStringTemplateExpression(expr) + is KtReturnExpression -> evaluateReturnInstruction(expr.firstChild, scopeDepth) is PsiWhiteSpace -> null is PsiElement -> evaluatePsiElement(expr, scopeDepth) null -> null @@ -175,7 +176,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when (expr) { is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1) else -> if ((expr is KtNameReferenceExpression) && (classScope != null)) evaluatenameReferenceExpression(expr, scopeDepth + 1, classScope) - else variableManager.getLLVMvalue(expr.firstChild.text) + else variableManager.getLLVMvalue(expr.firstChild.text) } private fun evaluateCallExpression(expr: KtCallExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? { @@ -217,9 +218,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM callArgs.addAll(loadedArgs) return evaluateFunctionCallExpression(LLVMVariable(methodFullName, returnType, scope = LLVMVariableScope()), callArgs) - } - } val nestedConstructor = classScope?.nestedClasses?.get(expr.calleeExpression!!.text) @@ -306,15 +305,19 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM } private fun evaluateBinaryExpression(expr: KtBinaryExpression, scopeDepth: Int): LLVMVariable { + val operator = expr.operationToken + if (operator == KtTokens.ELVIS) { + return evaluateElvisOperator(expr, scopeDepth) + } + val left = evaluateExpression(expr.firstChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception") val right = evaluateExpression(expr.lastChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception") - val operator = expr.operationToken return executeBinaryExpression(operator, expr.operationReference, left, right, scopeDepth) } private fun executeBinaryExpression(operator: IElementType, referenceName: KtSimpleNameExpression?, left: LLVMSingleValue, right: LLVMSingleValue, scopeDepth: Int): LLVMVariable { - val result = codeBuilder.addPrimitiveBinaryOperation(operator, referenceName, left, right) + val result = addPrimitiveBinaryOperation(operator, referenceName, left, right) if (left.type is LLVMReferenceType && left.pointer > 0 && right.pointer > 0) { variableManager.addVariable((left as LLVMVariable).kotlinName!!, result, scopeDepth) @@ -323,6 +326,80 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM return result } + private fun evaluateElvisOperator(expr: KtBinaryExpression, scopeDepth: Int): LLVMVariable { + val left = evaluateExpression(expr.firstChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception") + val condition = left.type!!.operatorEq(left, LLVMVariable("", LLVMNullType())) + + val conditionResult = codeBuilder.getNewVariable(condition.variableType) + codeBuilder.addAssignment(conditionResult, condition) + + val elvisResult = codeBuilder.getNewVariable(left.type!!, pointer = left.pointer) + codeBuilder.allocStackVar(elvisResult) + elvisResult.pointer++ + + val thenLabel = codeBuilder.getNewLabel(prefix = "elvis") + val elseLabel = codeBuilder.getNewLabel(prefix = "elvis") + val endLabel = codeBuilder.getNewLabel(prefix = "elvis") + + codeBuilder.addCondition(conditionResult, thenLabel, elseLabel) + + codeBuilder.markWithLabel(thenLabel) + codeBuilder.storeVariable(elvisResult, left) + codeBuilder.addUnconditionalJump(endLabel) + + codeBuilder.markWithLabel(elseLabel) + val right = evaluateExpression(expr.lastChild, scopeDepth + 1) + if (right != null) { + codeBuilder.storeVariable(elvisResult, right) + } + + codeBuilder.addUnconditionalJump(endLabel) + codeBuilder.markWithLabel(endLabel) + return elvisResult + } + + private fun addPrimitiveBinaryOperation(operator: IElementType, referenceName: KtSimpleNameExpression?, firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMVariable { + val firstNativeOp = codeBuilder.receiveNativeValue(firstOp) + val secondNativeOp = codeBuilder.receiveNativeValue(secondOp) + val llvmExpression = when (operator) { + KtTokens.PLUS -> firstOp.type!!.operatorPlus(firstNativeOp, secondNativeOp) + KtTokens.MINUS -> firstOp.type!!.operatorMinus(firstNativeOp, secondNativeOp) + KtTokens.MUL -> firstOp.type!!.operatorTimes(firstNativeOp, secondNativeOp) + KtTokens.LT -> firstOp.type!!.operatorLt(firstNativeOp, secondNativeOp) + KtTokens.GT -> firstOp.type!!.operatorGt(firstNativeOp, secondNativeOp) + KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp) + KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp) + KtTokens.EQEQ -> + if (firstOp.type is LLVMReferenceType) + firstOp.type!!.operatorEq(firstOp, secondOp) + else + firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) + KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) + KtTokens.EQ -> { + if (secondOp.type is LLVMNullType) { + val result = codeBuilder.getNewVariable(firstOp.type!!, firstOp.pointer) + codeBuilder.allocStackVar(result) + result.pointer++ + + codeBuilder.storeNull(result) + return result + } + + if (firstOp.type is LLVMReferenceType && firstOp.pointer > 0 && secondOp.pointer > 0) { + return secondOp as LLVMVariable + } + + val result = firstOp as LLVMVariable + codeBuilder.storeVariable(result, secondNativeOp) + return result + } + else -> codeBuilder.addPrimitiveReferenceOperation(referenceName!!, firstNativeOp, secondNativeOp) + } + val resultOp = codeBuilder.getNewVariable(llvmExpression.variableType) + codeBuilder.addAssignment(resultOp, llvmExpression) + return resultOp + } + private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant { val node = expr.node @@ -535,17 +612,21 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM return null } - private fun evaluateReturnInstruction(element: LeafPsiElement, scopeDepth: Int): LLVMVariable? { + private fun evaluateReturnInstruction(element: PsiElement, scopeDepth: Int): LLVMVariable? { val next = element.getNextSiblingIgnoringWhitespaceAndComments() - val retVar = evaluateExpression(next, scopeDepth) as LLVMSingleValue + val retVar = evaluateExpression(next, scopeDepth) + val type = retVar?.type ?: LLVMVoidType() - when (returnType!!.type) { + when (type) { is LLVMReferenceType -> { - codeBuilder.storeVariable(returnType!!, retVar) + codeBuilder.storeVariable(returnType!!, retVar!!) + codeBuilder.addAnyReturn(LLVMVoidType()) + } + is LLVMVoidType -> { codeBuilder.addAnyReturn(LLVMVoidType()) } else -> { - val retNativeValue = codeBuilder.receiveNativeValue(retVar) + val retNativeValue = codeBuilder.receiveNativeValue(retVar!!) codeBuilder.addReturnOperator(retNativeValue) } } 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 7756cc5e068..f2b1c694ffa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -70,57 +70,14 @@ class LLVMBuilder(val arm: Boolean) { } } - fun addPrimitiveBinaryOperation(operation: IElementType, referenceName: KtSimpleNameExpression?, firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMVariable { - val firstNativeOp = receiveNativeValue(firstOp) - val secondNativeOp = receiveNativeValue(secondOp) - val llvmExpression = when (operation) { - KtTokens.PLUS -> firstOp.type!!.operatorPlus(firstNativeOp, secondNativeOp) - KtTokens.MINUS -> firstOp.type!!.operatorMinus(firstNativeOp, secondNativeOp) - KtTokens.MUL -> firstOp.type!!.operatorTimes(firstNativeOp, secondNativeOp) - KtTokens.LT -> firstOp.type!!.operatorLt(firstNativeOp, secondNativeOp) - KtTokens.GT -> firstOp.type!!.operatorGt(firstNativeOp, secondNativeOp) - KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp) - KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp) - KtTokens.EQEQ -> - if (firstOp.type is LLVMReferenceType) - firstOp.type!!.operatorEq(firstOp, secondOp) - else - firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) - KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) - KtTokens.EQ -> { - if (secondOp.type is LLVMNullType) { - val result = getNewVariable(firstOp.type!!, firstOp.pointer) - allocStackVar(result) - result.pointer++ - - storeNull(result) - return result - } - - if (firstOp.type is LLVMReferenceType && firstOp.pointer > 0 && secondOp.pointer > 0) { - return secondOp as LLVMVariable - } - - val result = firstOp as LLVMVariable - storeVariable(result, secondNativeOp) - return result - } - else -> addPrimitiveReferenceOperation(referenceName!!, firstNativeOp, secondNativeOp) - } - val resultOp = getNewVariable(llvmExpression.variableType) - addAssignment(resultOp, llvmExpression) - - return resultOp - } - fun clean() { localCode = StringBuilder() globalCode = StringBuilder() initBuilder() } - fun addAssignment(llvmVariable: LLVMVariable, rhs: LLVMNode) { - localCode.appendln("$llvmVariable = $rhs") + fun addAssignment(lhs: LLVMVariable, rhs: LLVMNode) { + localCode.appendln("$lhs = $rhs") } fun addReturnOperator(llvmVariable: LLVMSingleValue) { diff --git a/translator/src/test/kotlin/tests/kotlin/if_1.kt b/translator/src/test/kotlin/tests/kotlin/if_1.kt index 90da5a214e5..a67f222497f 100644 --- a/translator/src/test/kotlin/tests/kotlin/if_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/if_1.kt @@ -8,11 +8,11 @@ fun if_test_1(x: Int): Int { return a } -class MyClass(i: Int) +class MyClass2(i: Int) fun if_test_null(x: Int): Int { - val y: MyClass? = null + val y: MyClass2? = null if (y == null) { return 1 } else { @@ -21,7 +21,7 @@ fun if_test_null(x: Int): Int { } fun if_test_null_2(x: Int): Int { - val y: MyClass? = MyClass(1) + val y: MyClass2? = MyClass2(1) if (y == null) { return 1