diff --git a/.gitignore b/.gitignore index 5b4bbf65181..95c0c2f3a03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,14 @@ .DS_Store .idea/shelf -/dependencies -/dist +dependencies +dist out tmp workspace.xml *.versionsBackup .gradle -/build/ +build # Ignore Gradle GUI config gradle-app.setting diff --git a/translator/.idea/.name b/translator/.idea/.name new file mode 100644 index 00000000000..85562220163 --- /dev/null +++ b/translator/.idea/.name @@ -0,0 +1 @@ +ast-kotlin \ No newline at end of file diff --git a/translator/.idea/gradle.xml b/translator/.idea/gradle.xml index ab6e46d7aef..05e52194ddf 100644 --- a/translator/.idea/gradle.xml +++ b/translator/.idea/gradle.xml @@ -3,7 +3,6 @@ diff --git a/translator/.idea/misc.xml b/translator/.idea/misc.xml index ee2a58cb493..20cd4f70c34 100644 --- a/translator/.idea/misc.xml +++ b/translator/.idea/misc.xml @@ -13,8 +13,8 @@ - - + + diff --git a/translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module b/translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module deleted file mode 100644 index 057d2d3830c..00000000000 Binary files a/translator/build/classes/main/META-INF/ast-kotlin_main.kotlin_module and /dev/null differ diff --git a/translator/build/classes/main/hello/KotlinScriptParser$Companion$classPath$2.class b/translator/build/classes/main/hello/KotlinScriptParser$Companion$classPath$2.class deleted file mode 100644 index 79b25720589..00000000000 Binary files a/translator/build/classes/main/hello/KotlinScriptParser$Companion$classPath$2.class and /dev/null differ diff --git a/translator/build/classes/main/hello/KotlinScriptParser$Companion$messageCollector$1.class b/translator/build/classes/main/hello/KotlinScriptParser$Companion$messageCollector$1.class deleted file mode 100644 index 5b14cb22de2..00000000000 Binary files a/translator/build/classes/main/hello/KotlinScriptParser$Companion$messageCollector$1.class and /dev/null differ diff --git a/translator/build/classes/main/hello/KotlinScriptParser$Companion.class b/translator/build/classes/main/hello/KotlinScriptParser$Companion.class deleted file mode 100644 index d3489af3d52..00000000000 Binary files a/translator/build/classes/main/hello/KotlinScriptParser$Companion.class and /dev/null differ diff --git a/translator/build/classes/main/hello/KotlinScriptParser.class b/translator/build/classes/main/hello/KotlinScriptParser.class deleted file mode 100644 index cd9e6a004a1..00000000000 Binary files a/translator/build/classes/main/hello/KotlinScriptParser.class and /dev/null differ diff --git a/translator/build/classes/main/hello/MainKt.class b/translator/build/classes/main/hello/MainKt.class deleted file mode 100644 index 2d8372d5b04..00000000000 Binary files a/translator/build/classes/main/hello/MainKt.class and /dev/null differ diff --git a/translator/build/classes/main/hello/llvmVariable.class b/translator/build/classes/main/hello/llvmVariable.class deleted file mode 100644 index e282413b68a..00000000000 Binary files a/translator/build/classes/main/hello/llvmVariable.class and /dev/null differ diff --git a/translator/build/classes/main/llvmBuilder$llvmBuilder.class b/translator/build/classes/main/llvmBuilder$llvmBuilder.class deleted file mode 100644 index 8eaeb8d1204..00000000000 Binary files a/translator/build/classes/main/llvmBuilder$llvmBuilder.class and /dev/null differ diff --git a/translator/build/classes/main/llvmBuilder.class b/translator/build/classes/main/llvmBuilder.class deleted file mode 100644 index bb65853b6ca..00000000000 Binary files a/translator/build/classes/main/llvmBuilder.class and /dev/null differ diff --git a/translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class b/translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class deleted file mode 100644 index ce174ba60c2..00000000000 Binary files a/translator/build/classes/main/org/kotlin/native/translator/debug/DebugKt.class and /dev/null differ diff --git a/translator/src/main/kotlin/llvmBuilder.kt b/translator/src/main/kotlin/llvmBuilder.kt deleted file mode 100644 index a06fbeb9348..00000000000 --- a/translator/src/main/kotlin/llvmBuilder.kt +++ /dev/null @@ -1,14 +0,0 @@ -package hello - -class llvmBuilder{ - private val llvmCode : StringBuilder = StringBuilder() - class llvmBuilder constructor() {} - - fun addLlvmCode(code : String){ - llvmCode.appendln(code) - } - - override fun toString(): String { - return llvmCode.toString() - } -} \ No newline at end of file diff --git a/translator/src/main/kotlin/llvmVariable.kt b/translator/src/main/kotlin/llvmVariable.kt deleted file mode 100644 index 7c0f255d22c..00000000000 --- a/translator/src/main/kotlin/llvmVariable.kt +++ /dev/null @@ -1,3 +0,0 @@ -package hello - -data class llvmVariable(val label : String) \ No newline at end of file diff --git a/translator/src/main/kotlin/main.kt b/translator/src/main/kotlin/main.kt index 7c6ef167d3c..150924f27eb 100644 --- a/translator/src/main/kotlin/main.kt +++ b/translator/src/main/kotlin/main.kt @@ -1,152 +1,23 @@ -package hello - import com.intellij.openapi.util.Disposer -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiWhiteSpace -import com.intellij.psi.impl.source.tree.LeafPsiElement -import com.intellij.psi.impl.source.tree.TreeElement -import com.intellij.psi.search.GlobalSearchScope -import com.intellij.psi.tree.IElementType -import org.jetbrains.kotlin.KtNodeType -import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.messages.* -import org.jetbrains.kotlin.cli.jvm.compiler.* -import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots -import org.jetbrains.kotlin.cli.jvm.config.getModuleName -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.resolve. AnalyzingUtils -import org.jetbrains.kotlin.resolve.TopDownAnalysisContext -import org.jetbrains.kotlin.resolve.TopDownAnalysisMode -import org.jetbrains.kotlin.resolve.jvm.JvmAnalyzerFacade -import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM -import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory -import org.jetbrains.kotlin.utils.PathUtil -import org.jetbrains.kotlin.cli.jvm.compiler.* -import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.lexer.KtKeywordToken -import org.jetbrains.kotlin.lexer.KtSingleValueToken -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtConstantExpression -import org.jetbrains.kotlin.psi.KtReturnExpression -import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext -import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments -import org.kotlin.native.translator.debug.debugPrintNode -import org.jetbrains.kotlin.lexer.KtToken -import java.lang.StringBuilder -import java.io.File -import java.util.* -import java.util.logging.Logger - - -var llvmCode = llvmBuilder() - -fun expressionWalker(expr : Any?) { - when(expr){ - is KtBlockExpression -> evaluateBlockExpression(expr) - is PsiElement -> evaluatePsiExpression(expr) - null -> Unit - else -> UnsupportedOperationException() - } -} - - -fun evaluateBlockExpression(expr : KtBlockExpression){ - var element = expr - expressionWalker(element.firstChild) - - expressionWalker(element.getNextSiblingIgnoringWhitespaceAndComments()) -} - -var variableCount = 0 -fun evaluatePsiExpression(expr : PsiElement){ - var element = expr - evaluateExpression(element.firstChild) - - evaluatePsiExpression(element.getNextSiblingIgnoringWhitespaceAndComments() ?: return) -} - -fun evaluateExpression(expr: Any?) : llvmVariable?{ - return when(expr){ - is KtBinaryExpression -> evaluateBinaryExpression(expr) - is PsiWhiteSpace -> null - is PsiElement -> evaluatePsiElement(expr) - is KtConstantExpression -> evaluateConstantExpression(expr) - null -> null - else -> throw UnsupportedOperationException() - } -} - -fun evaluateBinaryExpression(expr : KtBinaryExpression) : llvmVariable{ - val left = evaluateExpression(expr.firstChild) - val right = evaluateExpression(expr.lastChild) - val operator = expr.operationToken - - - - val llvmOperator = when (operator) { - KtTokens.PLUS -> "add nsw i32" - KtTokens.MINUS -> "sub nsw i32" - KtTokens.MUL -> "mul nsw i32" - else -> throw UnsupportedOperationException("Unkbown binary operator") - } - - variableCount++ - llvmCode.addLlvmCode("%var$variableCount = $llvmOperator ${left?.label}, ${right?.label}") - return llvmVariable("%var$variableCount") -} - -fun evaluateConstantExpression(expr : KtConstantExpression) : llvmVariable { - val node = expr.node - return llvmVariable(node.firstChildNode.text) -} - -fun evaluatePsiElement(element : PsiElement) : llvmVariable? { - return when(element){ - is LeafPsiElement -> evaluateLeafPsiElement(element) - is KtConstantExpression -> evaluateConstantExpression(element) - KtTokens.INTEGER_LITERAL -> null - else -> null - } -} - -fun evaluateLeafPsiElement(element : LeafPsiElement) : llvmVariable? { - return when(element.elementType){ - KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) - else -> llvmVariable("") - } - -} - -fun evaluateReturnInstruction(element : LeafPsiElement) : llvmVariable?{ - var next = element.getNextSiblingIgnoringWhitespaceAndComments(); - val retVar = evaluateExpression(next) - - llvmCode.addLlvmCode("ret i32 ${retVar?.label}") - return null -} +import org.kotlinnative.translator.FileTranslator +import org.kotlinnative.translator.TranslationState fun main(args: Array) { - val scriptFile = "/home/user/Kotlin/manual/sum.kt" - val parser = KotlinScriptParser() + if (args.isEmpty()) { + println("Enter filename") + return + } - val analyzeContext = parser.parse(scriptFile) + val disposer = Disposer.newDisposable() + val state = TranslationState(args.asList(), disposer) - val function = analyzeContext.functions.keys.first() - var body = function.bodyExpression as KtBlockExpression + val files = state.environment.getSourceFiles() + if (files.isEmpty()) { + print("Empty") + return + } - llvmCode.addLlvmCode("define i32 @${function.fqName}() #0{") + println(FileTranslator(state, files[0]).generateCode()) +} - expressionWalker(body); - - llvmCode.addLlvmCode("}") - println(llvmCode) - - -} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt new file mode 100644 index 00000000000..4ad543cd1cd --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FileTranslator.kt @@ -0,0 +1,32 @@ +package org.kotlinnative.translator + +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.resolve.BindingContext +import org.kotlin.native.translator.llvm.LLVMBuilder +import org.kotlinnative.translator.llvm.LLVMDescriptorGenearte +import org.kotlinnative.translator.llvm.LLVMMapStandardType + +class FileTranslator(val state: TranslationState, val file: KtFile) { + + private var codeBuilder = LLVMBuilder() + private var compiled = false; + + fun generateCode(): String { + if (!compiled) { + generateFileBody() + } + + compiled = true + return codeBuilder.toString() + } + + private fun generateFileBody() { + for (declaration in file.declarations) { + when (declaration) { + is KtNamedFunction -> FunctionCodegen(state, declaration, codeBuilder).generate() + } + } + } + +} diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt new file mode 100644 index 00000000000..356ef86a0f7 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -0,0 +1,122 @@ +package org.kotlinnative.translator + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtBlockExpression +import org.jetbrains.kotlin.psi.KtConstantExpression +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.resolve.BindingContext +import org.kotlin.native.translator.llvm.LLVMBuilder +import org.kotlin.native.translator.llvm.LLVMVariable +import org.kotlinnative.translator.llvm.LLVMDescriptorGenearte +import org.kotlinnative.translator.llvm.LLVMMapStandardType + + +class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction, val codeBuilder: LLVMBuilder) { + + private var variableCount = 0 + + fun generate() { + generateDeclaration(function) + codeBuilder.addLlvmCode("{") + expressionWalker(function.bodyExpression) + codeBuilder.addLlvmCode("}") + } + + private fun generateDeclaration(function: KtNamedFunction) { + val descriptor = state.bindingContext.get(BindingContext.FUNCTION, function) + var args = descriptor?.valueParameters?.map { + Pair(it.name.toString(), LLVMMapStandardType(it.type.toString())) + } + val returnType = LLVMMapStandardType(descriptor?.returnType.toString()) + + + codeBuilder.addLlvmCode(LLVMDescriptorGenearte(function.fqName.toString(), args, returnType)) + } + + private fun expressionWalker(expr: Any?) { + when (expr) { + is KtBlockExpression -> evaluateBlockExpression(expr) + is PsiElement -> evaluatePsiExpression(expr) + null -> Unit + else -> UnsupportedOperationException() + } + } + + private fun evaluateBlockExpression(expr: KtBlockExpression) { + var element = expr + expressionWalker(element.firstChild) + + expressionWalker(element.getNextSiblingIgnoringWhitespaceAndComments()) + } + + private fun evaluatePsiExpression(expr: PsiElement) { + var element = expr + evaluateExpression(element.firstChild) + + evaluatePsiExpression(element.getNextSiblingIgnoringWhitespaceAndComments() ?: return) + } + + private fun evaluateExpression(expr: Any?): LLVMVariable? { + return when (expr) { + is KtBinaryExpression -> evaluateBinaryExpression(expr) + is PsiWhiteSpace -> null + is PsiElement -> evaluatePsiElement(expr) + is KtConstantExpression -> evaluateConstantExpression(expr) + null -> null + else -> throw UnsupportedOperationException() + } + } + + private fun evaluateBinaryExpression(expr: KtBinaryExpression): LLVMVariable { + val left = evaluateExpression(expr.firstChild) + val right = evaluateExpression(expr.lastChild) + val operator = expr.operationToken + + + val llvmOperator = when (operator) { + KtTokens.PLUS -> "add nsw i32" + KtTokens.MINUS -> "sub nsw i32" + KtTokens.MUL -> "mul nsw i32" + else -> throw UnsupportedOperationException("Unkbown binary operator") + } + + variableCount++ + codeBuilder.addLlvmCode("%var$variableCount = $llvmOperator ${left?.label}, ${right?.label}") + return LLVMVariable("%var$variableCount") + } + + private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMVariable { + val node = expr.node + return LLVMVariable(node.firstChildNode.text) + } + + private fun evaluatePsiElement(element: PsiElement): LLVMVariable? { + return when (element) { + is LeafPsiElement -> evaluateLeafPsiElement(element) + is KtConstantExpression -> evaluateConstantExpression(element) + KtTokens.INTEGER_LITERAL -> null + else -> null + } + } + + private fun evaluateLeafPsiElement(element: LeafPsiElement): LLVMVariable? { + return when (element.elementType) { + KtTokens.RETURN_KEYWORD -> evaluateReturnInstruction(element) + else -> LLVMVariable("") + } + + } + + private fun evaluateReturnInstruction(element: LeafPsiElement): LLVMVariable? { + var next = element.getNextSiblingIgnoringWhitespaceAndComments(); + val retVar = evaluateExpression(next) + + codeBuilder.addLlvmCode("ret i32 ${retVar?.label}") + return null + } +} \ No newline at end of file diff --git a/translator/src/main/kotlin/KotlinScriptParser.kt b/translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt similarity index 98% rename from translator/src/main/kotlin/KotlinScriptParser.kt rename to translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt index 4183fdb40fe..c8ff7fd4c5c 100644 --- a/translator/src/main/kotlin/KotlinScriptParser.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/KotlinScriptParser.kt @@ -29,11 +29,7 @@ import org.jetbrains.kotlin.utils.PathUtil import java.io.File import java.util.* import java.util.logging.Logger -import org.kotlin.native.translator.debug.* -/** - * Created by user on 7/8/16. - */ class KotlinScriptParser { companion object { private val LOG = Logger.getLogger(KotlinScriptParser.javaClass.name) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt new file mode 100644 index 00000000000..bf18de7e8e1 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt @@ -0,0 +1,80 @@ +package org.kotlinnative.translator +import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.messages.* +import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles +import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.config.getModuleName +import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.addKotlinSourceRoots +import org.jetbrains.kotlin.load.java.JvmAbi +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM +import org.jetbrains.kotlin.utils.PathUtil +import org.kotlinnative.translator.exceptions.TranslationException + + +class TranslationState(sources: List, disposer: Disposable) { + + val environment: KotlinCoreEnvironment + val bindingContext: BindingContext + + init { + val configuration = CompilerConfiguration() + val messageCollector = GroupingMessageCollector(object : MessageCollector { + private var hasError = false + + override fun hasErrors(): Boolean { + return hasError; + } + + override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation) { + println("[report] $message") + hasError = severity.isError || hasError + } + }) + + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) + configuration.put(JVMConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) + + configuration.addKotlinSourceRoots(sources) + + environment = KotlinCoreEnvironment.createForProduction(disposer, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) + bindingContext = analyze(environment)?.bindingContext ?: throw TranslationException() + } + + fun analyze(environment: KotlinCoreEnvironment): AnalysisResult? { + val collector = environment.configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + + val analyzer = AnalyzerWithCompilerReport(collector) + analyzer.analyzeAndReport(environment.getSourceFiles(), object : AnalyzerWithCompilerReport.Analyzer { + override fun analyze(): AnalysisResult { + val sharedTrace = CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace() + val moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(environment.project, environment.getModuleName()) + + return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext( + moduleContext, + environment.getSourceFiles(), + sharedTrace, + environment.configuration.get(JVMConfigurationKeys.MODULES), + environment.configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS), + JvmPackagePartProvider(environment)) + } + + override fun reportEnvironmentErrors() { + var files = environment.configuration.jvmClasspathRoots + var runtimes = files.map { it.canonicalFile }.filter { it.name == PathUtil.KOTLIN_JAVA_RUNTIME_JAR && it.exists() } + collector.report(CompilerMessageSeverity.ERROR, runtimes.joinToString { it.path }, CompilerMessageLocation.NO_LOCATION) + println(runtimes.joinToString { it.toString() }) + } + }); + + return if (analyzer.hasErrors()) null else analyzer.analysisResult + } + +} \ No newline at end of file diff --git a/translator/src/main/kotlin/debug.kt b/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt similarity index 94% rename from translator/src/main/kotlin/debug.kt rename to translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt index 5b4e584cf6d..55f35bddc21 100644 --- a/translator/src/main/kotlin/debug.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/debug/debug.kt @@ -1,7 +1,4 @@ -/** - * Created by user on 7/8/16. - */ -package org.kotlin.native.translator.debug +package org.kotlinnative.translator.debug import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt b/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt new file mode 100644 index 00000000000..576f5d38e8a --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/exceptions/TranslationException.kt @@ -0,0 +1,3 @@ +package org.kotlinnative.translator.exceptions + +class TranslationException : Exception() \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt new file mode 100644 index 00000000000..6ee8edd05fe --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -0,0 +1,13 @@ +package org.kotlin.native.translator.llvm + +class LLVMBuilder { + private val llvmCode: StringBuilder = StringBuilder() + + fun addLlvmCode(code: String) { + llvmCode.appendln(code) + } + + override fun toString(): String { + return llvmCode.toString() + } +} \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt new file mode 100644 index 00000000000..9ee935d9088 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt @@ -0,0 +1,3 @@ +package org.kotlin.native.translator.llvm + +data class LLVMVariable(val label: String) \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt new file mode 100644 index 00000000000..28b0d7a3626 --- /dev/null +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt @@ -0,0 +1,9 @@ +package org.kotlinnative.translator.llvm + +fun LLVMDescriptorGenearte(name: String, argTypes: List>?, returnType: String) = + "define $returnType @$name(${argTypes?.mapIndexed { i: Int, s: Pair -> "${s.second} %${s.first}" }?.joinToString() ?: "" })" + +fun LLVMMapStandardType(type: String) = when(type) { + "Int" -> "i32" + else -> "%$type*" +} \ No newline at end of file