llvm-mos

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Stub Dieser Artikel ist sehr kurz und nicht besonders ausführlich. Hilf bitte mit, ihn zu verbessern.
llvm-mos
Logo
Entwickler llvm-mos Team
Verleger llvm-mos Team
Release 2022
Lizenz Apache License 2.0 w/ LLVM modifications
Plattform(en) Linux, Microsoft-Windows, Mac OS
Genre Compiler, Assembler
Steuerung Icon tastatur.png
Medien keine Version
Sprache(n) Sprache:englisch
Information http://llvm-mos.org

Das Entwicklerpaket llvm-mos ist eine Variante von LLVM[1] (engl. Abkürzung für Low Level Virtual Machine), das Cross-Development für die MOS Technology 65xx-Serie von Mikroprozessoren und ihre Klone unterstützt, wie sie in den Heimcomputersystemen C64 und VIC-20, Atari (8-bit) und so weiter eingesetzt werden. Das Paket kann unter Linux/MacOS/Windows installiert werden und enthält den Clang-Compiler, LLD-Linker, GAS (GNU)-kompatiblen Assembler, ELF-Objektdateien und zugehörige Dienstprogramme.

Beschreibung[Bearbeiten | Quelltext bearbeiten]

Der Clang-Compiler und Eingabeeditor ist weitgehend C99/C++11-kompatibel (freistehend/freestanding, also ohne libc). Die Datentypen Float und Double sowie C++-Ausnahmen (Exceptions) werden allerdings nicht unterstützt. Es werden einfache Laufzeitumgebungen für den Commodore 64, oder den Atari 8-Bit und einen mitgelieferten 6502-Simulator bereitgestellt.

Der Compiler ist standardmäßig auf die Link-Time-Ganzprogramm-Optimierung eingestellt. Dadurch kann der Programmaufruf-Graph als Ganzes analysiert werden (d. h. welche Funktionen können welche Funktionen aufrufen). Dies wiederum ermöglicht zum Beispiel die Bestimmung, welche Funktionen rekursiv sein können; bei allen, die dies nicht sein können, werden die Stackframes im statisch globalen Speicher abgelegt, ohne dass zusätzliche Annotationen im Programmquelltext erforderlich wären. Außerdem wird die Standardbibliothek in die Optimierungen einbezogen; so können Bibliotheksroutinen oft statt als Unterprogrammaufruf direkt eingefügt werden, was das JSR und das Vorbereiten der Parameter einspart (inlining).

Beispielprogramm[Bearbeiten | Quelltext bearbeiten]

Ein Beispielprogramm demonstriert den einfachen Umgang mit dem Entwicklerpaket:

Eingabe im Editor:

 #include <stdio.h>

 void main(void) {
   printf("HELLO, 6502!\n");
 }
 

Nach dem Kompilieren erhält man folgenden lauffähigen Assembler-Code:

Assembler-Code:

  main:
        ldx     #1
        lda     #72
  .LBB0_1:
        cmp     #10
        beq     .LBB0_4
  .LBB0_2:
        jsr     65490
        lda     .Lstr,x
        inx
        cpx     #13
        bne     .LBB0_1
        lda     #13
        jsr     65490
        rts
  .LBB0_4:
        lda     #13
        jmp     .LBB0_2

  .Lstr:
	.asciz	"HELLO, 6502!"
 

LLVMs High-Level-Optimierungen erkennen, dass diese Verwendung von "printf" äquivalent zu dem schnelleren "puts" ist und ersetzen es daher. Dann wird die Implementierung von puts in main eingefügt. Die 16-Bit-Zeigerschleife in puts wird durch "Schleifenstärkenreduzierung" in eine 8-Bit-Form optimiert, um den indizierten Adressierungsmodus des 6502 zu nutzen. Ein C64-spezifisches putchar wird ebenfalls weginlined, so dass nur das JSR zum KERNAL übrig bleibt.

Weblinks[Bearbeiten | Quelltext bearbeiten]


Quellen