vbcc is (c) in 1995 by Volker Barthelmann

(cga68k): changes in the code generator for amiga68k
(cla68k): changes in the C library for amiga68k
(vca68k): changes in the compiler frontend for amiga68k

Changes since V0.2l

- in conditional-expressions the type of the result was used for the
  generated comparison due to a bug
- ceil() and floor() were added to m881.lib (cla68k)
- flags may be specified more than once
- vbcc does not change argv any more
- output of errors/warnings changed and error/warning-texts put in <errors.h>
- % with powers of two is not replaced by an 'and' any more if the operand is
  signed (cga68k)
- entries in the history-file now in (bad) English rather than German
- -dontwarn option added to suppress certain warnings
- type conversions that are unnecessary on a certain machine may be omitted

Aenderungen seit V0.2k

- bei shifts werden keine arithmetischen Typerweiterungen mehr vorgenommen
- endlose Fehlerschleifen sollten erkannt werden
- Anfang eines SmallCode/SmallData-Modus; -sc und -sd schalten den jeweiligen
  Modus ein; deswegen wird auch vermehrt lea/pea verwendet (cga68k)
- startup.o initialisiert nun a4 fuer den SmallData-Modus (cla68k)
- die xref _LVO aus startup entfernt
- fd2lib geschrieben
- diverse Libraryfunktionen geschrieben (vla68k)
- der rechte Teil einer conditional-expression ist jetzt eine
  conditional-expression (war faelschlicherweise expression)
- Verwaltung der sections etwas geaendert; section=-1 am Anfang (cga68k)
- Fehlerbehandlung verbessert: Initialisierungen von unvollstaendigen
  Strukturen/Unionen, Arrays mit size==0 und nicht vorhandene Identifier
- Fehler bei der Erkennung von Fehler-Endlosschleifen behoben; funktioniert
  aber trotzdem nicht immer
- Workaround fuer den compare-bug; leider nicht sehr schoen
- Warnung bei dem Push-Problem
- Ausdruecke hinter return wurden bemaengelt, wenn die Funktion void war
- Funktionsargumente werden bei -O=256 nicht mehr sofort vom Stack geholt
  sondern, wenn moeglich gesammelt und dann auf einmal

Aenderungen seit V0.2j

- vc ruft jetzt 'FreePhxAss' statt 'CPhxAss' auf (vca68k)
- free() verkraftet 0 (cla68k)
- bei aufgetretenen Fehlern wird der Returncode auf EXIT_FAILURE gesetzt
- keine Fehlermeldung bei Files ohne Funktionsdefinition mehr
- Fehler behoben, der bei Verwendung einer Adressierungsart der Form
  (d,ax,dy.w[*z]) zu unnoetigen internal errors und evtl. Schlimmerem
  fuehrte (&7 vergessen) (cga68k)
- difftime() wird in time.h als Makro definiert (cla68k)
- #undef difftime in difftime.c eingefuegt (cla68k)
- Deklaration von rename() in stdio.h korrigiert (cla68k)
- wird Flag 8 (256) bei -O gesetzt, wird a5 nicht mehr als Framepointer
  benutzt (cga68k)
- "offset out of object"-Meldungen geaendert
- string-Funktionen geaendert (cla68k)
- Fehler bei Registerallocation, der auftrat, wenn der Rueckgabewert nicht
  in einem Register zurueckgegen wird, behoben
- Variablendeklaration geaendert; sollte jetzt korrekter sein und tentative
  definitions besser behandeln
- fehlendes ; in stdlib.h eingefuegt (cla68k)
- bei saveregs vor einem function call wird ein Scratchregister, ueber das
  die Funktion aufgerufen wird, nicht gespeichert
- wenn der compare-Fehler auftritt sollte zumindest ein error gemeldet
  werden (cga68k)
- wenn keine lokalen Variablen benutzt werden, wird kein Platz auf dem
  Stack gemacht (cga68k)
- Berechnung des Alignments fuer Kopierschleife sollte jetzt auch ohne
  Framepointer korrekt sein (cga68k)
- vc stark geaendert und config-file eingefuehrt (vca68k)
- bei Meldungen wird der Filename mit ausgegeben

Aenderungen seit V0.2i

- Verbesserung der Codegenerierung fuer FPU-Operationen (cga68k)
- Problem bei USEQ2ASZ und Zusammenfassen von IC/ASSIGN behoben
- floating point nun auch ohne FPU moeglich, noch nicht 100% fehlerfrei (cga68k/cla68k)
- Anfang einer Mathelibrary fuer die IEEE-Libraries (cla68k)
  FloatingPoint<->UnsignedInteger nicht korrekt
- Fehler bei switch(UNSIGNED) behoben
- alignment von struct-members sollte wieder passen
- unsigned char/short->fp mit FPU korrigiert (cga68k)
- ein labeled-statement enthaelt das nachfolgende statement
- _main aus mieee.lib oeffnet die Libraries nun in der richtigen
  Reihenfolge (autsch) (cla68k)
- Test auf am->Register in get_reg() eingebaut
- Fehler bei Kopierschleife behoben
- allocreg zaehlt bei Nutzung von erweiterten Adressierungsarten als
  zerstoerend; sollte damit jetzt halbwegs stabil sein; allerdings duerften
  noch internal errors, die aber wohl nichts mehr bedeuten, drin sein
- allocreg/freereg von Registervariablen wird aus Code entfernt und internal
  errors sind beseitig; sollte nur Effekt haben, wenn Returnregister als
  Registervariable verwendet wird
- bei initialisierten Unionen werden jetzt auch die uebrigen Werte aufgefuellt
- bei initialisierten auto Strukturen und Unionen duerfen auch Strukturen/
  Unionen gleichen Typs angegeben werden
- die Kopierroutinen sollten jetzt in (fast?) allen Faellen korrekt
  funktionieren und teilweise auch schneller sein
- Fehler mit auto arrays der Form a[]=... behoben; der Offset wurde nicht
  hochgezaehlt
- difftime in der Math Library (cla68k)
- einige ueble Fehler aus dem frontend fuer amiga68k entfernt (vca68k)
- unbenannte Bitfelder werden bei Initialisierungen jetzt uebergangen
- strengere Pruefung bei Zuweisungen zwischen Zeigern mit verschiedenen
  Qualifiern
- Funktionsdefinitionen nach altem Stil erzeugen keinen Prototype mehr
- float Parameter in alten Funktionsdefinitionen werden korrekt behandelt
- diverse Aenderungen bei der Belegung von Registervariablen; gibt jetzt
  Register etwas leichter her

Aenderungen seit V0.2h

- Fehler beim Kommaoperator behoben und Meldung bei fehlenden sidefx
- Konvertierungsroutinen fuer target data types geaendert
- Routinen fuer Fehler/Warnungen akzeptieren jetzt beliebige Parameterlisten
- Initialisierungen wie (cast)&var werden erlaubt (evtl. Probleme, wenn
  verschiedene Pointer existieren)
- die Adresse eines Arrays kann jetzt ermittelt werden
- Ueberpruefung der Gleichheit von Typen verbessert
- Registerbelegung bei return verbessert
- ueberfluessige Warnung bei nicht initialisierter const extern Variable
  entfernt
- Franks div/mod in vc.lib eingebaut (cla68k)
- Fliesskomma-returnwerte nur noch in fp0, wenn fuer fpu generiert wird (cga68k)
- Stringkonstanten sind nicht mehr const char[] sondern char[]
- vc versteht nun -l Option (vca68k)
- printf/scanf durch leicht veraenderte Versionen aus libnix ersetzt (cla68k)
- Anfang einer Mathelibrary fuer 68881 (cla68k)
- (hoffentlich) korrekte floating point->integer Rundung bei FPU (cga68k)

Aenderungen seit V0.2g

- Fehler bei Registerbelegung in totem Code behoben
- Fehler bei Registerbelegung in switch-statements behoben
- boeser Fehler bei Variablen mit nicht-Register-return-values behoben
- vc.lib: Ctrl-C wird erkannt (manchmal) (cla68k)
- vc.lib: malloc() verbessert (cla68k)
- vc.lib: limits.h korrigiert (cla68k)
- vc.lib: time.h und time-Funktionen eingebaut (cla68k)
- keine Warnung mehr bei const typedefs
- Warnung bei Initialisierung von typedefs
- verschiedene Aenderungen bei der Behandlung von storage-classes
- globale static Variablen werden jetzt nicht mehr exportiert
- storage-classes in Prototypen werden beachtet
- const Variablen werden nicht mehr als Konstanten behandelt (war fehlerhaft)
- Fehler in union atyps behoben (vuchar war zchar statt zuchar, argh!)
- string concatenation eingebaut
- Umwandlung unsigned->floating point mit FPU korrigiert (cga68k)
- Vergleiche bei unsigned werden jetzt korrekt behandelt (cga68k)
- bessere Behandlung von Funktionsprototypen
- Zuweisungen zwischen Funktions- und Datenzeigern sind nicht mehr erlaubt

Aenderungen seit V0.2f

- -snma entfernt (cga68k)
- einige Vereinfachungen im Codegenerator wegen reg/freg-Benutzung (cga68k)
- Entfernung einiger alter Codefragmente im Codegenerator (cga68k)
- Abfrage bei malloc() eingebaut
- einige Fehler bei der IC-Generierung im Zusammenhang mit Registerbelegung
  behoben
- Fehlerbehandlung verbessert; nach -maxerror=n (default 10) Fehlern
  wird Uebersetzung abgebrochen (bei 0 wird nicht abgebrochen)
- -ansi unterdrueckt unwichtige Warnungen und Warnungen mit ANSI-Verletzung
  werden als Fehler behandelt
- Flags loeschen jetzt durch &=~
- Zuweisungen von Arrays werden korrekt(er) behandelt (cga68k)
- Zuweisungen von groesseren Typen geaendert, muss aber noch optimiert
  werden. (cga68k)
- falscher Returncode in alg_opt() korrigiert
- Behandlung von const-Konstanten korrigiert
- Meldung, wenn main() nicht int ist
- arithmetik mit void * nicht mehr erlaubt
- casting nach void erlaubt

Aenderungen seit V0.2e

- Nutzung von 680x0-Adressierungsarten eingebaut (cga68k)
- Schreibweise displ(ax) durch (displ,ax) ersetzt (cga68k)
- Nutzung von reg/freg; dadurch kein zusaetzlicher Pass noetig (cga68k)

Aenderungen seit V0.2d

- Typpruefung bei Zuweisungen verbessert und nun auch bei Initialisierungen
- freed free Register teilweise behoben (?)
- Deklarationen von Prototypen ohne Typ werden bemaekelt
- Abhanegigkeit in eigenen Include-Dateien behoben
- Fehler bei arithmetischen Operationen behoben (cga68k)
- falsche Fehlermeldung bei unsigned Typ als Schleifenbedingung
- / und % wird nun auch mit 68000 unterstuetzt (wenn auch ineffizient) (cga68k)
- Fehler bei ADDI2P und SUBIFP behoben
- Fehler (mit DREFOBJ) bei Zusammenfassung op x,y->reg;move reg->z behoben
- Optionen, die einen Parameter benoetigen, muessen jetzt -opt=parameter
  geschrieben werden, also z.B. vbcc -cpu=68020 file.c
  (das war noetig, um das Frontend und Wildcards zu vereinfachen)
- enumerations eingebaut; noch einfach ohne grosse Tests, Tags werden ignoriert
- arithmetische const Typen werden in Ausdruecken als Konstanten behandelt

Aenderungen seit V0.2c

- -noa4 Option hinzugekommen (cga68k)
- Fehler beim Vertauschen von COMPARE-Argumenten und mustrepeat behoben (cga68k)
- Fehler bei vorzeitiger Registerfreigabe bei POSTINC/POSTDEC behoben
- Fehler bei mehreren Variablendeklarationen mit Funktionen behoben
- Fehler bei dc float|double behoben (cga68k)
- Fehler bei sections und dc/ds behoben (cga68k)
- Fehler bei Rechnungen mit FP-Registern behoben (cga68k)
- diverse Fehler bei a op= b behoben
- jetzt hoffentlich immer korrekte Verwendung von lsl/lsr/asr (cga68k)
- vbcc hat sich endlich erfolgreich selbst kompiliert
- Fliesskommakonstanten eingebaut; Berechnung aber noch zu ungenau
- Deklaration fuer Bitfields eingebaut; werden aber noch als Integers behandelt
- Fehler bei interner Verarbeitung von Fliesskommazahlen behoben
- Deklarationen der Form unsigned a; extern a; etc. werden zugelassen
- Anfaenge einer eigenen C-Library


Noch zu behebende bekannte Fehler:

- kein korrektes Auswerten der Fehler und Setzen des Returncodes (erledigt)
- keine sehr intelligenten Fehlermeldungen
- manchmal ein fehlerhafter unexpected end of file error (erledigt)
- Zeilennummern bei Fehlern falsch (erledigt)
- bei Fehlern wird oft die darauffolgende Zeile angezeigt
- bei Fehlern waehrend der Codegeneration wird die letzte Zeile der
  Funktion, in der der Problem auftritt oder die erste Zeile danach
  angezeigt
- kein Praeprozessor (dadurch auch Einschraenkungen bei Formatierung des Src)
  man muss also erst einen externen (z.B. cpp vom gcc oder dcpp vom Dice)
  laufen lassen
- keine enums (erledigt)
- keine Bitfields (erledigt)
- keine FP-Konstanten (erledigt)
- FP nur mit FPU (erledigt)
- keine Div. und Modulo mit cpu<68020 (erledigt)
- keine erweiterten Adressierungsarten werden unterstuetzt (erledigt, aber noch Probleme)
- ungenuegendes typechecking bei Initialisierungen (erledigt)
- Codegenerator muss teilweise Funktionen zweimal generieren und benutzt dann
  ein Rueckwaerts-Seek=>keine Tapes/Pipes o.ae. als Ziel moeglich (erledigt)
- benutzt z.Z. noch gets(), dadurch Abstuerze bei zu langen Zeilen moeglich (erledigt)
- keine Abfrage bei Speichermangel (erledigt)
- noch ein paar einkompilierte Limits
- noch keine C-Library (teilweise erledigt)
- Teilweise unnoetig umstaendlich, lang, da ich oft mit Cut&Paste im Editor
  gearbeitet habe, statt etwas geschickter zu schreiben (geht halt schneller).
  Dadurch ist es auch sehr wichtig, mit einem gut optimierenden Compiler zu
  uebersetzen, da vbcc sonst 3-4 mal langsamer laeuft. (liegt mehr an der
  C-Library)
- Programm- und Lokale Datensektionen muessen <32(64?)KB sein
  bei cpu 68020 duerfte diese Beschraenkung wegfallen, glaube ich
- Initialisierungen von Arrays sind z.Z. noch ausserordentlich ineffizient
- noch diverse schlechte Codegenerierung, z.B. Zuweisungen oder Push, Pop
  von Elementen mit sizeof>4 (etwas verbessert)
- einige konstante Ausdruecke (z.B. casts von Adressen) werden nicht als
  solche erkannt (mehr oder weniger erledigt)
- evtl. ANSI-unzulaessige Vereinfachungen von arithmetischen Ausdruecken
- Fliesskommarechnungen mit FPU koennen wegen erhoehter Genauigkeit der
  FPU-Register nicht IEEE/ANSI-Konform sein
- Umwandlungen FP<->unsigned nicht korrekt (unsigned->FP erledigt)
- keine anstaendige Dokumentation
- manchmal wird zwischen push-regs und restore-regs ein Register frei und
  deshalb nicht vom Stack geholt (gibt sicherlich Probleme, wenn es nicht
  das einzige gerettete Register war) (erledigt?)
- Initialisierungen in Switch-Bloecken werden nicht ausgefuehrt (ist aber wohl ok)
- static Variablen werden exportiert (erledigt)
- casting nach void wird nicht erlaubt (erledigt)
- korrekte Definition von main() wird nicht geprueft (erledigt)
- Funktionen- und Datenzeigerkollisionen werden nicht erkannt (erledigt)
- Zuweisungen *Typ<->*(const Typ) werden erlaubt (erledigt?)
- Stringkonstanten sind vom Typ const char (erledigt)
- enum-Konstanten scheinen Speicher zu verbrauchen
- structure-expressions werden als lvalues akzeptiert
- der Spezialfall &Array wird noch bemaekelt (erledigt)
- bei shift mit einem long wird noch nach long gewandelt
- Adressierungsarten der Form (d,ax,dy),dy werden wegen Kollision von dy
  nicht benutzt
- Evtl. Probleme bei erweiterten Adressierungsarten und Umwandlungen in
  kleinere Typen (wegen zusaetlichem Offset) (behoben)
- evtl. koennten Adressierungsarten falsch benutzt werden; muss noch
  einiges getestet und ueberlegt werden (sieht inzwischen ganz gut aus)
- wenn fuer COMPARE ein Register auf den Stack muss, wird wohl falscher Code
  erzeugt
- gen_ds braucht eigentlich den Typ (erledigt)
- const Variablen werden auch als Arraygroessen akzeptiert (z.Z. ausgebaut)
- Initialisierungen noch sehr fehlerhaft (von unions, von gleichen Typen
  statt Konstanten und Enforcerhits etc.) (erledigt?)
- f() wird in Definitionen noch nicht durch f(void) ersetzt (erledigt)
- const Variablen sollen ins Code-Segment
- bei Funktionsprototypen werden storage-classes ignoriert (erledigt)
- Probleme beim Kopieren von auto-Array-Initialisierungen (erledigt)
- Was passiert, wenn bei einer Kopierschleife fuer PUSH ein Register auf
  den Stack muss? Koennte boese enden.
- noch Probleme bei Typkonversion bei Funktionsargumenten (bes. double);
  auch in Bezug auf Unterschied alte<->neue Deklarationen (erledigt?)
- irgendwo generiert er bei FPU-Benutzung "move.s" statt "move.l" (erledigt)
- Gueltigkeitsbereich bei Funktionsprototypen nicht ganz korrekt
- storage-classes/external-linkage noch nicht korrekt (erledigt?)
- free() muss auf 0 testen (erledigt)
- Zugriffe auf volatile Objekte zaehlen nicht als Seiteneffekte
- a%2^n darf bei a<0 nicht so optimiert werden

...to be continued...

Vermutlich habe ich da auch einige vergessen und es werden zahlreiche noch
unbekannte auftreten. Diese mir bitte mitteilen (besonders internal errors)

Volker (volker@vb.franken.de)

