translator: arm compilation fix
This commit is contained in:
@@ -10,7 +10,7 @@ fun main(args: Array<String>) {
|
||||
}
|
||||
|
||||
val disposer = Disposer.newDisposable()
|
||||
val state = parseAndAnalyze(args.asList(), disposer)
|
||||
val state = parseAndAnalyze(args.asList(), disposer, true)
|
||||
|
||||
val files = state.environment.getSourceFiles()
|
||||
if (files.isEmpty()) {
|
||||
|
||||
@@ -72,7 +72,7 @@ class ClassCodegen(val state: TranslationState, val clazz: KtClass, val codeBuil
|
||||
argFields.add(thisField)
|
||||
argFields.addAll(fields)
|
||||
|
||||
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(clazz.name!!, argFields, LLVMVoidType()))
|
||||
codeBuilder.addLLVMCode(LLVMFunctionDescriptor(clazz.name!!, argFields, LLVMVoidType(), arm = state.arm))
|
||||
|
||||
codeBuilder.addStartExpression()
|
||||
generateLoadArguments(thisField)
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.kotlinnative.translator.llvm.LLVMBuilder
|
||||
|
||||
class FileTranslator(val state: TranslationState, val file: KtFile) {
|
||||
|
||||
private var codeBuilder = LLVMBuilder()
|
||||
private var codeBuilder = LLVMBuilder(state.arm)
|
||||
|
||||
fun generateCode(): String {
|
||||
codeBuilder.clean()
|
||||
|
||||
@@ -60,7 +60,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -20,14 +20,14 @@ import org.jetbrains.kotlin.utils.PathUtil
|
||||
import org.kotlinnative.translator.exceptions.TranslationException
|
||||
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 classes = HashMap<String, ClassCodegen>()
|
||||
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 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 bindingContext = analyze(environment)?.bindingContext ?: throw TranslationException()
|
||||
|
||||
return TranslationState(environment, bindingContext)
|
||||
return TranslationState(environment, bindingContext, arm)
|
||||
}
|
||||
|
||||
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.LLVMType
|
||||
|
||||
class LLVMBuilder {
|
||||
class LLVMBuilder(val arm: Boolean) {
|
||||
private var llvmCode: StringBuilder = StringBuilder()
|
||||
private var variableCount = 0
|
||||
private var labelCount = 0
|
||||
@@ -16,7 +16,12 @@ class LLVMBuilder {
|
||||
|
||||
private fun initBuilder() {
|
||||
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)
|
||||
|
||||
if (arm) {
|
||||
llvmCode.appendln(funcAttributes)
|
||||
}
|
||||
}
|
||||
|
||||
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.*
|
||||
|
||||
|
||||
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(${
|
||||
argTypes?.mapIndexed { i: Int, s: LLVMVariable ->
|
||||
"${s.getType()} %${s.label}"
|
||||
}?.joinToString()})"
|
||||
}?.joinToString() }) ${ if (arm) "#0 " else ""}"
|
||||
|
||||
fun LLVMMapStandardType(type: String): LLVMType = when (type) {
|
||||
"Int" -> LLVMIntType()
|
||||
|
||||
Reference in New Issue
Block a user