llvm-mos
Dieser Artikel ist sehr kurz und nicht besonders ausführlich. Hilf bitte mit, ihn zu verbessern. |
llvm-mos | |
---|---|
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 | |
Medien | keine Version |
Sprache(n) | |
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