translator: arm compilation fix

This commit is contained in:
e5l
2016-07-13 12:57:50 +03:00
parent 2fe1a68439
commit 0c656b85c0
7 changed files with 15 additions and 10 deletions
+1 -1
View File
@@ -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()