From 8496a0f2a933e51eeb10ce46f64710a164db4d84 Mon Sep 17 00:00:00 2001 From: Konstantin Anisimov Date: Fri, 25 Nov 2016 15:05:19 +0300 Subject: [PATCH] CODEGEN: naive implementation of string_concatination (not tested) (cherry picked from commit 8e0e9480d7cbec6e640f1b5a8a15af0d2f1bc278) --- .../jetbrains/kotlin/cli/bc/KonanConfig.kt | 1 + .../cli/bc/TopDownAnalyzerFacadeForKonan.kt | 2 + .../org/jetbrains/kotlin/cli/bc/injection.kt | 1 + .../kotlin/backend/konan/llvm/IrToBitcode.kt | 56 +++++++++++++------ .../backend/konan/llvm}/KonanPlatform.kt | 3 +- .../konan/llvm}/KonanPlatformConfigurator.kt | 4 +- 6 files changed, 48 insertions(+), 19 deletions(-) rename backend.native/{cli.bc/src/org/jetbrains/kotlin/cli/bc => compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm}/KonanPlatform.kt (92%) rename backend.native/{cli.bc/src/org/jetbrains/kotlin/cli/bc => compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm}/KonanPlatformConfigurator.kt (96%) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanConfig.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanConfig.kt index 72427fdaf4e..46e812bfb34 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanConfig.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanConfig.kt @@ -1,6 +1,7 @@ package org.jetbrains.kotlin.cli.bc import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.backend.konan.llvm.KonanPlatform import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/TopDownAnalyzerFacadeForKonan.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/TopDownAnalyzerFacadeForKonan.kt index dd3f48a88e0..e3705bdb81b 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/TopDownAnalyzerFacadeForKonan.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/TopDownAnalyzerFacadeForKonan.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.cli.bc import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.backend.konan.llvm.KonanBuiltIns +import org.jetbrains.kotlin.backend.konan.llvm.KonanPlatform import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.context.ContextForNewModule diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/injection.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/injection.kt index acf5fe114bb..08cd402103b 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/injection.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/injection.kt @@ -15,6 +15,7 @@ */ package org.jetbrains.kotlin.cli.bc +import org.jetbrains.kotlin.backend.konan.llvm.KonanPlatform import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.useImpl diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 02ca5ae7849..d7a35238e8f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -4,6 +4,7 @@ import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.backend.konan.llvm.KonanPlatform import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LazyClassReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor @@ -345,27 +346,42 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid private fun evaluateExpression(tmpVariableName: String, value: IrElement?): LLVMValueRef? { when (value) { - is IrSetterCallImpl -> return evaluateSetterCall (tmpVariableName, value) - is IrTypeOperatorCall-> return evaluateTypeOperator(tmpVariableName, value) - is IrCall -> return evaluateCall (tmpVariableName, value) - is IrGetValue -> return evaluateGetValue (tmpVariableName, value) - is IrSetVariable -> return evaluateSetVariable ( value) - is IrVariable -> return evaluateVariable ( value) - is IrGetField -> return evaluateGetField ( value) - is IrSetField -> return evaluateSetField ( value) - is IrConst<*> -> return evaluateConst ( value) - is IrReturn -> return evaluateReturn ( value) - is IrBlock -> return evaluateBlock ( value) - is IrExpressionBody -> return evaluateExpression (tmpVariableName, value.expression) - is IrWhen -> return evaluateWhen (tmpVariableName, value) - is IrThrow -> return evaluateThrow (tmpVariableName, value) - null -> return null - else -> { + is IrSetterCallImpl -> return evaluateSetterCall (tmpVariableName, value) + is IrTypeOperatorCall -> return evaluateTypeOperator (tmpVariableName, value) + is IrCall -> return evaluateCall (tmpVariableName, value) + is IrGetValue -> return evaluateGetValue (tmpVariableName, value) + is IrSetVariable -> return evaluateSetVariable ( value) + is IrVariable -> return evaluateVariable ( value) + is IrGetField -> return evaluateGetField ( value) + is IrSetField -> return evaluateSetField ( value) + is IrConst<*> -> return evaluateConst ( value) + is IrReturn -> return evaluateReturn ( value) + is IrBlock -> return evaluateBlock ( value) + is IrExpressionBody -> return evaluateExpression (tmpVariableName, value.expression) + is IrWhen -> return evaluateWhen (tmpVariableName, value) + is IrThrow -> return evaluateThrow (tmpVariableName, value) + is IrStringConcatenation -> return evaluateStringConcatenation(tmpVariableName, value) + null -> return null + else -> { TODO("${ir2string(value)}") } } } + private fun evaluateStringConcatenation(tmpVariableName: String, value: IrStringConcatenation): LLVMValueRef? { + val stringPlus = KonanPlatform.builtIns.stringType.memberScope.getContributedFunctions(Name.identifier("plus"), NoLookupLocation.FROM_BACKEND).first() + var res:LLVMValueRef? = null + val strings:List = value.arguments.map { + val descriptor = getToString(it.type) + + val args = listOf(evaluateExpression(codegen.newVar(), it)) + return@map evaluateSimpleFunctionCall(codegen.newVar(), descriptor, args)!! + } + val concatResult = strings.take(1).fold(strings.first()) {res, it -> evaluateSimpleFunctionCall(codegen.newVar(), stringPlus, listOf(res, it))} + return concatResult + } + + //-------------------------------------------------------------------------// private fun evaluateThrow(tmpVariableName: String, expression: IrThrow): LLVMValueRef? { @@ -747,6 +763,14 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid //-------------------------------------------------------------------------// + private fun getToString(type: KotlinType): SimpleFunctionDescriptor { + val name = Name.identifier("toString") + val descriptor = type.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).first() + return descriptor + } + + //-------------------------------------------------------------------------// + private fun evaluateOperatorEqeq(callee: IrBinaryPrimitiveImpl, arg0: LLVMValueRef, arg1: LLVMValueRef, tmpVariableName: String): LLVMValueRef { val arg0Type = callee.argument0.type diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatform.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt similarity index 92% rename from backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatform.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt index df3808b5413..2dea8a8bf6f 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatform.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatform.kt @@ -14,9 +14,10 @@ * limitations under the License. */ -package org.jetbrains.kotlin.cli.bc +package org.jetbrains.kotlin.backend.konan.llvm import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.backend.konan.llvm.KonanPlatformConfigurator import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.TargetPlatform diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatformConfigurator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatformConfigurator.kt similarity index 96% rename from backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatformConfigurator.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatformConfigurator.kt index 2ad6441a6ca..170dbaf16ba 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/KonanPlatformConfigurator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/KonanPlatformConfigurator.kt @@ -16,7 +16,7 @@ // Adapted from JS compiler, but everyhing has been switched off for now. -package org.jetbrains.kotlin.cli.bc +package org.jetbrains.kotlin.backend.konan.llvm import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useImpl @@ -42,7 +42,7 @@ object KonanPlatformConfigurator : PlatformConfigurator( overloadFilter = OverloadFilter.DEFAULT, platformToKotlinClassMap = PlatformToKotlinClassMap.EMPTY ) { - override fun configureModuleComponents(container: StorageComponentContainer) { + override fun configureModuleComponents(container: StorageComponentContainer) { container.useInstance(SyntheticScopes.Empty) container.useInstance(SyntheticConstructorsProvider.Empty) container.useInstance(TypeSpecificityComparator.NONE)