translator: arm compilation fix
This commit is contained in:
@@ -10,7 +10,7 @@ fun main(args: Array<String>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val disposer = Disposer.newDisposable()
|
val disposer = Disposer.newDisposable()
|
||||||
val state = parseAndAnalyze(args.asList(), disposer)
|
val state = parseAndAnalyze(args.asList(), disposer, true)
|
||||||
|
|
||||||
val files = state.environment.getSourceFiles()
|
val files = state.environment.getSourceFiles()
|
||||||
if (files.isEmpty()) {
|
if (files.isEmpty()) {
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil
|
|||||||
argFields.add(thisField)
|
argFields.add(thisField)
|
||||||
argFields.addAll(fields)
|
argFields.addAll(fields)
|
||||||
|
|
||||||
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(clazz.name!!, argFields, LLVMVoidType()))
|
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(clazz.name!!, argFields, LLVMVoidType(), arm = state.arm))
|
||||||
|
|
||||||
codeBuilder.addStartExpression()
|
codeBuilder.addStartExpression()
|
||||||
generateLoadArguments(thisField)
|
generateLoadArguments(thisField)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import org.kotlinnative.translator.llvm.LLVMBuilder
|
|||||||
|
|
||||||
class FileTranslator(val state: TranslationState, val file: KtFile) {
|
class FileTranslator(val state: TranslationState, val file: KtFile) {
|
||||||
|
|
||||||
private var codeBuilder = LLVMBuilder()
|
private var codeBuilder = LLVMBuilder(state.arm)
|
||||||
|
|
||||||
fun generateCode(): String {
|
fun generateCode(): String {
|
||||||
codeBuilder.clean()
|
codeBuilder.clean()
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
|||||||
keyword = keyword.getNextSiblingIgnoringWhitespaceAndComments()
|
keyword = keyword.getNextSiblingIgnoringWhitespaceAndComments()
|
||||||
}
|
}
|
||||||
|
|
||||||
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(function.fqName.toString(), args, returnType, external))
|
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(function.fqName.toString(), args, returnType, external, state.arm))
|
||||||
return external
|
return external
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ import org.jetbrains.kotlin.utils.PathUtil
|
|||||||
import org.kotlinnative.translator.exceptions.TranslationException
|
import org.kotlinnative.translator.exceptions.TranslationException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class TranslationState(val environment: KotlinCoreEnvironment, val bindingContext: BindingContext) {
|
class TranslationState(val environment: KotlinCoreEnvironment, val bindingContext: BindingContext, val arm: Boolean) {
|
||||||
|
|
||||||
var functions = HashMap<String, FunctionCodegen>()
|
var functions = HashMap<String, FunctionCodegen>()
|
||||||
var classes = HashMap<String, ClassCodegen>()
|
var classes = HashMap<String, ClassCodegen>()
|
||||||
val variableManager = VariableManager()
|
val variableManager = VariableManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun parseAndAnalyze(sources: List<String>, disposer: Disposable): TranslationState {
|
fun parseAndAnalyze(sources: List<String>, disposer: Disposable, arm: Boolean = false): TranslationState {
|
||||||
|
|
||||||
val configuration = CompilerConfiguration()
|
val configuration = CompilerConfiguration()
|
||||||
val messageCollector = GroupingMessageCollector(object : MessageCollector {
|
val messageCollector = GroupingMessageCollector(object : MessageCollector {
|
||||||
@@ -49,7 +49,7 @@ fun parseAndAnalyze(sources: List<String>, disposer: Disposable): TranslationSta
|
|||||||
val environment = KotlinCoreEnvironment.createForProduction(disposer, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
val environment = KotlinCoreEnvironment.createForProduction(disposer, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES)
|
||||||
val bindingContext = analyze(environment)?.bindingContext ?: throw TranslationException()
|
val bindingContext = analyze(environment)?.bindingContext ?: throw TranslationException()
|
||||||
|
|
||||||
return TranslationState(environment, bindingContext)
|
return TranslationState(environment, bindingContext, arm)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun analyze(environment: KotlinCoreEnvironment): AnalysisResult? {
|
fun analyze(environment: KotlinCoreEnvironment): AnalysisResult? {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
|||||||
import org.kotlinnative.translator.llvm.types.LLVMIntType
|
import org.kotlinnative.translator.llvm.types.LLVMIntType
|
||||||
import org.kotlinnative.translator.llvm.types.LLVMType
|
import org.kotlinnative.translator.llvm.types.LLVMType
|
||||||
|
|
||||||
class LLVMBuilder {
|
class LLVMBuilder(val arm: Boolean) {
|
||||||
private var llvmCode: StringBuilder = StringBuilder()
|
private var llvmCode: StringBuilder = StringBuilder()
|
||||||
private var variableCount = 0
|
private var variableCount = 0
|
||||||
private var labelCount = 0
|
private var labelCount = 0
|
||||||
@@ -16,7 +16,12 @@ class LLVMBuilder {
|
|||||||
|
|
||||||
private fun initBuilder() {
|
private fun initBuilder() {
|
||||||
val memcpy = "declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)"
|
val memcpy = "declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)"
|
||||||
|
val funcAttributes = """attributes #0 = { nounwind "stack-protector-buffer-size"="8" "target-cpu"="cortex-m3" "target-features"="+hwdiv,+strict-align" }"""
|
||||||
llvmCode.appendln(memcpy)
|
llvmCode.appendln(memcpy)
|
||||||
|
|
||||||
|
if (arm) {
|
||||||
|
llvmCode.appendln(funcAttributes)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getNewVariable(type: LLVMType?, pointer: Boolean = false, kotlinName: String? = null): LLVMVariable {
|
fun getNewVariable(type: LLVMType?, pointer: Boolean = false, kotlinName: String? = null): LLVMVariable {
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package org.kotlinnative.translator.llvm
|
|||||||
import org.kotlinnative.translator.llvm.types.*
|
import org.kotlinnative.translator.llvm.types.*
|
||||||
|
|
||||||
|
|
||||||
fun LLVMFunctionDescriptor(name: String, argTypes: List<LLVMVariable>?, returnType: LLVMType, declare: Boolean = false) =
|
fun LLVMFunctionDescriptor(name: String, argTypes: List<LLVMVariable>?, returnType: LLVMType, declare: Boolean = false, arm: Boolean = false) =
|
||||||
"${if (declare) "declare" else "define"} $returnType @$name(${
|
"${if (declare) "declare" else "define"} $returnType @$name(${
|
||||||
argTypes?.mapIndexed { i: Int, s: LLVMVariable ->
|
argTypes?.mapIndexed { i: Int, s: LLVMVariable ->
|
||||||
"${s.getType()} %${s.label}"
|
"${s.getType()} %${s.label}"
|
||||||
}?.joinToString()})"
|
}?.joinToString() }) ${ if (arm) "#0 " else ""}"
|
||||||
|
|
||||||
fun LLVMMapStandardType(type: String): LLVMType = when (type) {
|
fun LLVMMapStandardType(type: String): LLVMType = when (type) {
|
||||||
"Int" -> LLVMIntType()
|
"Int" -> LLVMIntType()
|
||||||
|
|||||||
Reference in New Issue
Block a user