home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
mac
/
1000
/
CCE_1024.ZIP
/
CCE_1024
/
SOZBIN07.LZH
/
SOZDISTR
/
DOC
/
HCC.CHG
< prev
next >
Wrap
Text File
|
1994-10-23
|
31KB
|
717 lines
hcc 2.00 eXtended Version
known bugs not fixed:
----------------------------------
char chr;
...
test(chr = 1)
compiles to:
(move.w #1, <chr>)
what maybe will overwrite another variable or cause an exception:
address error (if <chr> is not even)
----------------------------------
a function pointer out of a structure
...
void (*fun)(int argument);
...
is to call by
(*struct_p->fun)(argument);
cause
struct_p->fun(argument);
will not work.
----------------------------------
last modifications - by Volker Seebode -
version/patchlevel x23
Sun Sep 25 1994
bitfields:
- changed code generation
- long bitfields implemented ( unsigned long foo : 25; )
- default order reversed (first bit = MSB)
last modifications - by jerry g geiger -
version/patchlevel x22
Thu Sep 22 1994
adding something to a void * pointer will generate an error message
now - better than causing an exception during runtime ;-)
comparing an unsigned to a signed value will cause a warning
unless switched off by -W-CUS
adding something to a void * pointer will cause a warning, cause
actually nothing is added (void has length 0!)
version/patchlevel x21
Sep 15 1994
bug with mixing up 'lsr' and 'asr' instructions and unsigned
shorts and shorts fixed.
version/patchlevel x20
Sep 09 1994
longs in switch/case should be handled correctly now.
$ACE environment variable forces hcc to use handle -1 for stderr
(cause ACE can't handle such things)
__GDATE__ and __SDATE__ macros fixed.
a bug occuring with pointer addition/sub sometimes fixed
(resulting in a 'asr.w' instruction instead of 'asr.l')
version x19
Jul 29 1994
especially for Holger :
you can switch off the bad return value/type warnings now
-W-BRV / #pragma -BRV
the commandline syntax changed a little bit
(see man file or 'hcc -h')
version x17
Jul 04 1994
bug fixed:
auto cast of negative short constants to long
Jun 13 1994
the meaning of $INCLUDEDIR changed a little bit:
it replaces now the built in pathes with
'${INCLUDEDIR}\sozobonx' and $INCLUDEDIR
&array is allowed for type checking now
calling a function via pointer (*func)() should work with
func(); now, too
buildin macros changed according to standard
accepts '/' in include pathes
ipc'ed files' timestamps are tested now, the newer one is included
diagnostic output is always written to stderr now
a man file exists now
some minor bugs fixed
$SOZOBONCNF isn't recognized/supported any longer
version x15
Apr 19 1994
#pragma option 'echo' built in:
'#pragma echo ...' will echo the rest of the line to stderr
bug fixes:
local enum declarations work now (no more bus errors)
missing #endif's are errors for TRUE #if's now, too
comparing to 0 should work under all circumstances now
(there was an error in cast routines)
version x14
Mar 15 1994 file date: March 23 1994
integer constants:
should now handled as provided by ANSI:
Constants are never negativ (except ones prefixed by a '-')
Hex and octal constants are always unsigned.
Constants are of the smallest type they fit in.
version x13
Mon Mar 7 1994
integer constants:
cause stil some problems; a hexadecimal one with leading '0's as
'0x0000FFFF' is of type long now.
The handling of constants is still not as provided by ANSI standard.
Hex and octal constants are not unsigned by default.
Any constants may become negative, if they don't have a suffix 'U'!
This is an error, of course. I'll try to fix it.
new #pragma option:
#pragma [+|-]PMR
switch on/off warning 'probably missing return'
changed macro:
SOZOBON
It has the value of 0x200, as the originals' version number;
new macros:
__SOZOBONX__
Is defined for our eXtended version of Sozobon C compiler, it
will keep the version number of eXtended SOZOBON version as:
0x200 + our revision number (0x213 for current version).
__MSHORT__
Is TRUE if int is a 16 Bit value. (Undefined with -L option).
version x12
Mon Feb 28 1994
integer constants:
hex and octal constants tend to be unsigned now, a hexadecimal one,
with leading '0's as '0x0000FFFF' is of type long now.
There is still an error in handling of constants - sorry - comparing
of two constants can produce wrong code.
Arrays larger than 32K should be handled correctly now.
Environment:
SOZOBONCNF=
"standard": DATE in __DATE__ macro will be of format MM/DD/YY
else it it will be DD.MM.YY
"devconout": diagnostic output will not be written to STDERR/Gemdos
console handle but to BIOS console device
function handling:
A non void declarated function now will cause a warning, if there is
no return value specified; this works of course the other way round,
too.
A warning will be generated, if hcc cannot decide wether the
specified return statements will return always some correct value.
Bugs fixed:
A 'switch' without a case-block now won't force hcc to an exception
any more. I hope so.
version x11
Sun Dec 19 1993
Environment:
SOZOBONCNF=
List of comma seperated strings:
"standard" diagnostic output will not go to BIOS console device
handle but to STDERR/Gemdos console
STDERR=
If this variable exists diaginstic output will go to Gemdos handle 2
and not to Gemdos console handle.
Macros:
new macro __CDATE__ implemented; it represents a date-string of the
format "Mon DD YYYY"
commandline Options:
-v: be verbose
-V: print complete Version info
Bugs fixed:
The error when reading a function declaration like
'int main( int argc, char *argv[])' is fixed. (The error was mixing up
the type of array with the pointer's type.)
Bugs kept:
A 'const' statement may still cause some trouble, so better '#undef const'
in your source code.
----
Änderungen an HCC V2.0, modifizierte Version 2.00x10
von Holger Weets (Atari(/Amiga)), Christian Wempe (Amiga(/Atari))
und Detlef Wuerkner (Amiga(/Atari))
Stand: 20.04.93
Erstmal die schlechten Nachrichten:
An der Original Version 2.0 des Compilers hat sich praktisch kaum etwas ver-
ändert, somit sind wir verantwortlich für alle Fehler, die mit der neuen
Version auftreten, und mit der alten nicht. Natürlich können wir dafür aber
nicht haftbar gemacht werden, die Benutzung erfolgt auf eigene Gefahr.
Jeder Benutzer erkennt dies mit dem ersten Starten des Programmes an.
Folgende Fehler sind aktuell bekannt:
-------------------------------------
- funktion(char_variable = integer_konstante)
führt zu einer Zuweisung an <char_variable> auf Wortbreite (!),
was entweder in einem Adress-Fehler endet (3 Bomben) oder zu
einem (teilweisen) Überschreiben der nächsten Variablen
Und jetzt all die guten Nachrichten:
Updates:
- x1 -> x2:
Option '-Q' eingebaut. Bewirkt, daß der Compiler schnelleren Code
erzeugt, auch wenn dieser das Programm länger macht.
Code-Erzeugung bei Struktur-Zuweisungen geändert:
- bei '-Q' erzeugt XCC max. 15 move's, ohne max. 3
- Erzeugung von move-Listen bei Strukturen, deren Länge nicht durch
4 teilbar ist, verbessert. Code ist hier jetzt schneller UND kürzer.
- x2 -> x3:
Erzeugung von 'switches' wesentlich verbessert; der erzeugte Code ist
jetzt i.A. sowohl schneller als auch kürzer.
- x3 -> x4:
- der Compiler teilt dem TOP jetzt mit, dass er die erweiterte Version
ist, und somit laeuft TOP jetzt auch mit anderen (alten) Versionen
des Compilers anstandslos zusammen
- neues 'pragma' Argument 'FST' schaltet die '-q' Option ein/aus
- neues 'pragma' Argument 'TOP' schaltet den TOP Funktionenweise ein/aus
- neues 'pragma' Argument 'OPT' uebergibt den nachfolgenden String an
TOP als neue Optionen
- Pointer-Vergleiche, bei denen ein 'viod *' beteiligt ist, liefern
jetzt keine Warnung des Compilers mehr
- Fehler beim scannen der CPP-Tokens behoben
- trap's werden nur noch generiert, wenn die Option '-L' nicht angegeben
wurde
- x4 -> x5:
- es werden jetzt spezielle Sprungtabellen erzeugt, die nur halb so
lang sind, wie die alten; allerdings lassen sich so erzeugte
Assemblerfiles auch nur noch mit dem von mir modifizierten JAS V2.00x1
uebersetzen...
- x5 -> x6:
- Float-Fehler aus V2.00x5 wieder ausgebaut...
- noch weiter optimiert
- mit der neusten Version des TOP übersetzt
- die includierten Files werden jetzt mit ausgegeben
- das String-Merging funktioniert jetzt auch im Zusammenhang mit
CPP-Konstanten, ist somit jetzt endlich vollständig implementiert
- C++ - Kommentarzeichen implementiert ('//', Kommentar bis Zeilen-
ende)
- wieder in HCC umbenannt, weil die veränderte Versionsnummer und
die Info-Zeile bereits eindeutig zeigt, daß es sich um eine
modifizierte Version des Compilers handelt (schliesslich haben wir
den Optimizer ja auch nicht umbenannt, obwohl wir den quasi neu-
geschrieben haben)
- x6 -> x7:
- Option '-X' für Debugging implementiert (s.u.)
- aeusserst aergerlichen Fehler entfernt, der falsche movem - Anweisungen
bewirkte; solange mit TOP uebersetzt wurde, machte er sich nicht
bemerkbar, und auch ansonsten trat er nur in einem Spezialfall auf,
aber dann....
- hcc kann jetzt auch float's und double's wieder in Registern halten;
V1.21 konnte dies bereits, aber aus V2.00 scheint es ausgebaut
worden zu sein, ohne das es hierfuer einen Grund gibt...
- x7 -> x8:
- optimiert
- es werden jetzt auch short's registert...
- "__TOS__" ist jetzt WIRKLICH vordefiniert
- bessere TOP-Unterstützung
- Fehler-Erholung bei CPP-Errors verbessert
- ST-Version: Stack groesser gemacht; fuer 'normale' Quelltexte
reichte der alte auch (ich habe damit noch nie Probleme gehabt),
aber es scheint auch Texte zu geben, die den hcc zu sehr tiefer
Rekursion zwingen und bei solchen ist er schon mal abgestuerzt.
- ST-Version: falls die Fehlermeldungen des Compilers auf den
Bildschirm ausgegeben werden, erscheinen sie jetzt auch wieder
untereinander (vorher wurde nur ein NL ausgegeben, was für
Dateien und C-Desk's Console Fenster auch reicht)
- es gibt ein neues Programm fuer das SOZOBON-System, den IPC
(Includefile PreCompiler), geschrieben von mir (Holger) und
portiert auf den Amiga von Christian (wem sonst ?) und mir
Dieses Programm wird von hcc jetzt unterstützt, d.h. beim
Laden von Includefiles wird zunächst das precompilierte gesucht,
und erst wenn dieses nicht gefunden wird, das "normale" File
gelesen. Der Vorteil dieser Methode ist natürlich, daß das
uebersetzen schneller geht, da precompilierte Dateien wesentlich
kuerzer sind und ausserdem "vorgekaut". Fuer Details siehe Datei
"IPC.TXT"
- beim Übersetzen der MiNT-Sources bemerkt: hcc brachte bei
"test(&main);"
eine Fehlermeldung. Das '&' vor dem Funktionsnamen ist völlig
überflüssig, aber nicht verboten. Jetzt kommt nur noch die
Warnung "& ignored".
- x8 -> x9:
- der Compiler hat nicht bemerkt, wenn 'break' oder 'continue' an
illegalen Stellen verwendet wurden, stattdessen wurde dafür
'bra L-1' erzeugt, was weder top noch jas sehr witzig fanden
(06.11.92)
- die Anzahl der Fehler wird jetzt nur noch auf dem Bildschirm
ausgegeben, wenn -V angegeben wurde
- wenn die Fehlermeldungen in eine Datei geschrieben werden, und
-V angegeben wurde, dann werden sie zusätzlich auch noch auf den
Bildschirm ausgegeben; dies wurde vor allem deshalb implementiert,
weil sonst bei Erzeugung einer Fehlerdatei die Warnungen des
Compilers verlorengehen, da dieser richtigerweise nur dann einen
Exitcode != 0 liefert, wenn Fehler aufgetreten sind; wenn nur
Warnungen kamen, war/ist der Exitcode == 0 und niemand merkte
etwas vom Inhalt der Fehlerdatei
(19.03.93)
- falls -V nicht angegeben war und der hcc Fehler gefunden hat, so
wurde trotzdem 0 als ExitCode zurückgegeben, was natürlich nicht
im Sinne des Erfinders war.
- x9 -> x10:
- Fehlermeldungen '? member ID' & 'select non struct' so um-
konstruiert, daß der nicht gefundene Identifier ausgegeben wird
- hcc kann jetzt ANSI-Funktionsköpfe lesen, d.h.
extern char *malloc(int size);
ist erlaubt, und
void main(int argc, char **argv, char *envp)
{
...
}
auch (!!!).
Natürlich ist die K&R Schreibweise auch weiterhin erlaubt und wird
nicht (wie bei anderen Compilern) mit einer Warnung oder gar
Fehlermeldung bedacht.
Ebenfalls implementiert wurde der spezielle Bezeichner '...' als
(letzter) Funktionsparameter. Bedeutung: "hier können wahlweise
noch mehr Parameter kommen, müssen aber nicht, und eine Typüber-
prüfung soll ab hier auch nicht mehr stattfinden". Benutzt wird
soetwas etwa bei "fprintf(FILE *fp, char *fmt, ...)", also dort,
wo variabel viele Parameter kommen können.
- Schlüsselworte 'signed', 'cdecl', 'volatile', 'const' und 'pascal'
implementiert (wegen ANSI-Kompatibilität)
signed: Speicherklasse; da alle Typen defaultmäßig signed
sind, ist dieses Schlüsselwort nur für Casting
und für den zukünftigen Typechecker interessant,
ansonsten ist er mit 'int' gleichbedeutend.
cdecl: Speicherklasse für Funktionen; Soll bedeuten, daß
die Parameter auf dem Stack übergeben werden, und
nicht in Registern (oder sonstwie); der hcc kann
Parameter nur auf dem Stack übergeben, deshalb hat
dieses Schlüsselwort aktuell keinen anderen Zweck,
als die Übersetzbarkeit von ANSI-Sourcen zu gewähr-
leisten.
pascal: Speicherklasse für Funktionen; Soll bedeuten, daß
die Parameter "falsch herum" auf dem Stack liegen
und das diese Funktion den Stack selber aufräumt;
Beides geschieht aktuell nicht, das noch kein
Prototyping implementiert wurde. Aktuell hat dieses
Schlüsselwort nur den Zweck, die Übersetzbakeit von
ANSI-Sources zu gewährleisten.
volatile: Speicherklasse für lokale Variablen;
Soll bedeuten, daß diese Variable nicht in ein
Register gelegt werden darf;
der hcc legt nur Variablen in Register, die auch
mit "register" gekennzeichnet sind, dieses
Schlüsselwort hat also aktuell keinen anderen
Zweck, als die Übersetzbarkeit von ANSI-Sourcen
zu gewährleisten.
const: Speicherklasse für Variablen; bedeutet, das die
so gekennzeichneten Variablen nur gelesen, jedoch
niemals überschrieben werden;
wird ignoriert, bis ich die unübersichtliche NODE
Struktur vollständig verstanden habe und sie auch
ganz überblicken kann, dieses Schlüsselwort hat
also aktuell keinen anderen Zweck, als die Über-
setzbarkeit von ANSI-Sourcen zu gewährleisten.
ACHTUNG: weil sich hierdurch die Menge der Schlüsselwörter geändert
hat, ist es notwendig, daß alle precompilierten Header-
Files mit der neuen Version des IPC übersetzt werden!
Geschwindigkeits-Vergleich:
---------------------------
Compiler Computer Dhrystones (V1.1/REGS) Prg.-Länge
====================================================================
DR-C Mega-ST, TOS 1.04 862 12905 Bytes (*)
SOZOBON-C Amiga AMIGADOS 1428 5200 Bytes (##)
TC (2.0) Mega-ST, TOS 1.04 1562 10648 Bytes (**)
PC Mega-ST, TOS 1.04 1562 12332 Bytes (x)
SOZOBON-C Mega-ST, TOS 1.04 1612 4121 Bytes (#)
PC Mega-ST, TOS 1.04 1724 12234 Bytes (**)
(#) : es wurden XCC V2.00x6 & TOP V2.00x6 & XDLibs verwendet
(##) : gleicher Compiler & Optimizer, bloß auf dem Amiga (Länge ungefähr)
(*) : lag als ausführbare Datei dem Quelltext bei, ist also nicht nachprüfbar
(wir haben den Compiler nicht)
(**) : von einem Bekannten (Carsten) gemacht (-> Ergebnis sicher)
(x) : mit 'cdecl' gemacht, also "wirklicher" Code-Erzeugungs-Vergleich...
Der Dhrystone-Quelltext kann bei uns bezogen werden (lief auch schon
auf 'ner Cray...).
Diese Werte sind nur dazu gedacht, um daß weitverbreitete Vorurteil abzubauen,
daß PD-Compiler langsam und schlecht sind, und außerdem viel zu langen Code
erzeugen (man beachte die Programm-Längen...)
Noch ein Beispiel dazu:
Der Frank hat kürzlich (mal wieder) ein Apfelmännchen-Programm geschrieben,
natürlich mit SOZOBON-C. Die getestete Version brauchte 2 min. 14 sec für
die komplette Grafik und war 23 KB lang. Bei einem Bekannten (Carsten)
ließen wir das gleiche Programm unter TC compilieren. Das Ergebnis war, daß
die Version 7 KB länger wurde, und trotz Mathe-Coprozessor 3 min 34 sec für
die gleiche Berechnung benötigte, also über eine Minute länger rechnete ...
Da die Leute von SOZOBON endlich mit der Version 2.0 des Compilers heraus-
gekommen sind, mußten wir unsere Erweiterungen/Fehlerbereinigungen natürlich
sofort in diese Version einbauen.
Anscheinend ist der Support für den Amiga inzwischen besser, als der für den
Atari, denn obwohl SOZOBON-C für den ST geschrieben ist, haben wir diese
Version vom Amiga bekommen und auf den ST zurück-angepasst, weil anscheinend
keiner was von einer ATARI-Version 2.00 weiß ...
(falls Herr Würkner (alias TETISOFT) jetzt diese Zeilen liest:
^!$%§%#??
... und beim nächsten Mal benutzen wir dann '#ifdef FOR_AMIGA' an ALLEN
Stellen, die nur für den Amiga geändert wurden!...)
Die von uns modifizierte Version des Compilers trägt den Namen XCC
(eXtended C-Compiler) und die Versions-Nummer 2.00x6 (nur 'x6' hinzugefügt)
DIVERSES:
---------
- Es wurde einiges optimiert, ent-rekursioniert und entwanzt
- Wenn das Datei-Ende innerhalb eines Kommentars lag, so endete dies in einer
Endlosschleife des Compilers - behoben
- Wenn das Datei-Ende innerhalb eines #if/#ifdef/#ifndef lag, so führte
dies ebenfalls zu einer Endlosschleife, falls die Bedingung falsch war
bzw. der #else - Zweig erreicht war. Dies wird jetzt mit einer Fehler-
meldung quittiert.
- die Meldung 'lost X nodes' kommt jetzt seltener (gar nicht mehr ?)
- Die Hex-Notation in String-Konstanten funktioniert jetzt auch richtig...
- so etwas wie 'printf("Umlaut-Test: äöüÖÄÜß\n")' funktioniert jetzt endlich
Umlaute im Quelltext werden jedoch auch weiterhin als White-Space
interpretiert.
- der Compiler stürzt nicht mehr ab, wenn jemand lokale Arrays bei der
Deklaration gleich initialisieren wollte.
- wenn der Compiler auf ein Statement der Form 'if ()' (also ohne was in den
Klammern) traf, dann stuerzte er ab -- behoben
- wenn die geschweifte Klammerung bei 'do {....} while();' fehlerhaft ist,
dann stuerzte der Compiler manchmal ab -- behoben
- bisher pasierte es manchmal, daß HCC/XCC falscherweise die Fehlermeldung
'struct redefined ...' ausgab. Dies lag daran, daß bei unbenannten
Strukturen/Union's intern eigene Namen vergeben werden, und diese
auffrund eines Denkfehlers nicht immer eindeutig waren, der Compiler
also den selben Namen an zwei Strukturen vergeben hat. Dieser Fehler
wurde behoben.
- Zusammenarbeit mit TOP verbessert:
1. XCC generiert Zeilen der Form ';loop Lx', mithilfe derer der TOP dann
(endlich) Loop-rotations machen kann.
2. XCC generiert Zeilen der Form ';ret [a|d]0', welche dem TOP dazu dienen,
mehr Optimierungen zu machen.
3. XCC generiert Zeilen der Form ';sstart' & ';send', welche dem TOP
anzeigen, daß hier Code für 'switches' steht, welcher umsortiert werden
soll
4. XCC generiert ';longs', wenn die '-L' Option angegeben wurde, dies ist
wichtig fuer die Register Parameter
5. XCC generiert ';notop' fuer alle Funktionen, die zwischen einem
'#pragma -TOP' und '#pragma +TOP'
stehen; das bedeutet, das TOP diese Funktionen nicht optimieren soll
(praktisch zum debuggen)
6. XCC generiert ';opt "<optionen-string>"', wenn eine Zeile
'#pragma OPT "<optionen-string>"
gefunden wird. Dies dient (aktuell nur) dazu, die Optionen fuer TOP
funktionenweise veraendern zu koennen
7. XCC generiert ';xhcc', um dem TOP anzuzeigen, das mit dem erweiterten
Compiler gearbeitet wird. TOP verwendet dies fuer die Behandlung der
';ret' Direktive, um auch mit alten Versionendes Compilers lauffaehig
zu sein
PREPROZESSOR:
-------------
- Das Macro __DATE__ wurde neu implementiert.
- Das Macro __TIME__ wurde neu implementiert.
- Dem Macro TOS wurde das Macro __TOS__ ergänzt, weil es anscheinend keine
einheitliche Schreibweise gibt, und ich dieses auch schon irgendwo gesehen
habe
- Es wurde ein Macro Namens __BASE_FILE__ implementiert, welches dem Benutzer
auch innerhalb von Include-Files die Möglichkeit gibt, auf den Namen der
Haupt-Datei zuzugreifen
- Das CPP-Kommando '#assert' wurde implementiert.
Syntax : #assert <ausdruck>
Wirkung: Falls <ausdruck> FALSE ist, erfolgt eine Fehlermeldung seitens des
Compilers und die Compilierung wird abgebrochen
- Das CPP-Kommando '#pragma' wurde implementiert.
Syntax : #pragma [+|-<NAME> ...] [irgendwas]
oder #pragma OPT "<string>"
Wirkung: dient zum Umschalten einiger Optionen;
#pragma +<name> schaltet die Option ein, durch '-<name>' wird sie
ausgeschaltet. Folgende Namen sind implementiert:
- PRO: Profiling ein/aus
- PTR: 'pointer types mismatch' ein/aus
- CMP: 'cmp of diff ptrs' ein/aus
- DIF: 'diff ptrs' ein/aus
- RDF: 'redefined: SYM' ein/aus
- STR: String-Optimierung ein/aus
- FST: Quick-Flag (Option '-q') ein/aus
- TOP: Optimizer (funktionsweise) ein/aus
(wird nur einmal pro Funktion ausgegeben)
#pragma OPT "<string>" schreibt <string> in die Ausgabe-Datei.
Dies kann zum umschalten der Optionen des Optimizers je nach
zu optimierender Funktion verwendet werden.
Der String wird max. einmal pro Funktion ausgegeben!
Bisher gab es eine Fehlermeldung bei #pragma, was nicht Standard-Gemäß ist
- Das CPP-Kommando '#error' wurde implementiert.
Syntax : #error ["Meldung"]
Wirkung: Falls "Meldung" angegeben wird, so erfolgt die Ausgabe dieses
Strings als Fehlermeldung, ansonsten gibt es eine Standard-
Meldung und die Compilierung wird abgebrochen
Praktisch z.B., um auf Portierungs-Probleme hinzuweisen...
- Das CPP-Kommando #asm wird implementiert (noch in Arbeit...).
Syntax : #asm assembler-code
Wirkung: Funktioniert wie asm(), ist aber weniger Schreibkrams...
Funktioniert bedingt auch außerhalb von Funktionen.
Dieses ist zum gegenwärtigen Zeitpunkt nicht errreichbar, da die Implemen-
tierung noch nicht ganz abgeschlossen ist.
OPTIONEN:
---------
- Die neue Option '-Oname' bewirkt, daß die Assembler-Ausgaben in die Datei
<name> geschrieben wird, was insbesondere die Möglichkeit zur Laufwerks-
übergreifenden Compilierung bietet
- Die neue Option '-Ename' bewirkt, daß alle Meldungen des Compilers nicht
auf dem Bildschirm, sondern in die Datei <name> geschrieben werden
- Die neue Option -N bewirkt, daß Kommentare geschachtelt werden dürfen
- Die neue Option -Mzahl bewirkt, daß die Compilierung nach maximal <zahl>
Meldungen (errors, warnings) abgebrochen wird.
- Die neue Option -S bewirkt, daß mehrfach vorhandene Strings nicht mehr
zu einem zusammengefasst werden.
- Mit der neuen Option -T kann die Generierung der TRAP-Befehle abgeschaltet
werden (falls sich jemand eigene Funktionen gemdos(), bios() oder xbios()
schreiben will...). Siehe unten
- Die neue, von Detlev Würkner implementierte, und von uns korrigierte
Option -L bewirkt, daß alle als 'int' deklarierten Variablen 32Bits
groß sind (also int = long). Diese Option ist nur sehr wenig getestet,
also mit Vorsicht zu geniessen. Um sie nutzen zu können, müßten alle
Bibliotheken ebenfalls mit dieser Option neu übersetzt werden, wozu
ich natürlich keine Lust habe. Außerdem wird es Probleme mit den
direkten traps geben, da das Betriebs-System natürlich nach wie
vor auf 16Bit-Werten besteht.
- Mit der Option -X kann er Debug-Modus eingeschaltet werden. In diesem
Fall generiert der Compiler zusätzlichen Code, und im Falle eines Absturzes
meldet das Programm die Zeile und die Datei, in der der Fehler auftrat.
Dazu muß das Programm allerdings mit dem Startup-Code 'DEBUG_S.O' gelinkt
werden.
Die Syntax ist -X[N][function], wobei
N den Debug-Level angibt, und
function den Namen einer Benutzer-Definierten Debug-Funktion
Aktuell sind die Levels 1 und 2 implementiert, bei Level 1 werden
die Zeilennummern generiert, sowie Aufrufe der angegebenen Funktion
am Anfang, am Ende und in jeder Schleife einer Funktion. In Level 2
wird pro Sourcecode-Zeile ein Aufruf der angegebenen Funktion generiert,
so daß im Prinzip ein Source-Level-Debugging moeglich ist. Eine dafür
geeignete Funktion liegt in einer ersten, unvollstaendigen Version bereits
bei: Sie heisst "_debug" und liegt in den Dateien DEBUG_A.O und DEBUG_C.O
vor, diese Dateien muessen beim Linken VOR den XDLibs angegeben werden.
Beim selberschreiben einer solchen Funktion ist auf jeden Fall zu beachten,
daß alle Register gerettet werden müssen, da dies beim Aufruf (natuerlich)
nicht geschieht.
Wenn die Angabe einer Debug-Funktion fehlt, sind Level 1 und 2 identisch.
- Die Kommandozeile hat somit folgendes Aussehen:
hcc [-DUIPNVMSLT] [-X[N][function]] [-OSFILE1] [-EERRFILE1] CFILE1 [...]
d.h. für jede Datei koennen eine eigene Fehlerdateien und (natürlich)
Ausgabedateien angegeben werden
SONSTIGE ERWEITERUNGEN:
-----------------------
- Variablen vom Typ 'void *' sind jetzt zu allen anderen Zeigern kompatibel,
d.h. bei Zuweisungen erfolgt keine Warnung mehr vom Compiler
- Bei Meldungen des Compilers, die sich auf ein Include-File beziehen, wird
jetzt der Zugriffs-Pfad mit ausgegeben
- In String-Konstanten können jetzt alle Umlaute und sonstigen Sonderzeichen
direkt angegeben werden. Bisher konnten diese Zeichen nur über die
Oktal-Notation '\XXX' ausgegeben werden.
- Die Multi-Byte-Characters wurden implementiert. Bisher wurden sie zwar ge-
duldet, d.h. nicht angemeckert, aber NICHT behandelt. Folgendes funktioniert
jetzt:
int i = 'ab';
long j = 'abc';
long k = 'abcd';
Folgendes hingegen funktioniert (logischerweise) nicht:
short i = 'abc';
führt jedoch auch zu keiner Meldung vom Compiler ...
- Die String-Konkatenation wurde implementiert. Beispiel:
printf("Hello " /* hier KEIN Komma */
"world");
führt zu keinem Fehler, sondern zur gewünschten Ausgabe "Hello world".
Diese Erweiterung kommt insbesondere der Lesbarkeit des Quelltextes
zugute, wenn lange Strings ausgegeben werden sollen. Außerdem spart sie
Arbeit beim portieren von ANSI-Quelltexten...
- Die Funktion asm() wurde dahingehend erweitert, daß jetzt ein einfacher
Zugriff auf alle Variablen möglich ist.
Beispiel: asm(" move.l #1, <i>");
wird zu: move.l #1, REGISTER falls i register-Variable ist
oder : move.l #1, OFFSET(a6) falls i lokale Var oder Parameter ist
oder : move.l #1, _i falls i externe & globale Var ist
oder : move.l #1, Lnummer falls i statisch ist
oder : move.l #1, <i> falls i unbekannt ist
- Das Profiling wurde (endlich) implementiert, es tut sich jetzt also wirklich
etwas, wenn die Option '-P' in der Kommando-Zeile angegeben wird.
Am Anfang jeder Funktion wird der Aufruf einer Funktion Namens '_prolog'
eingefügt, welche in C folgendes Aussehen hat:
void _prolog(char *name)
<name> ist hierbei ein Zeiger auf den Namen der gerade ausgeführten Funktion
(z.B. "main")
Am Ende jeder Funktion wird der Aufruf einer Funktion Namens '_epilog'
eingefügt, welche in C folgendes Aussehen hat:
void _epilog(char *name)
wobei <name> wieder ein Zeiger auf den Namen der aktuellen Funktion ist.
Der Parameter wurde absichtlich über den Stack übergeben, damit auch alle
nicht-Assembler-Programmierer sich ihre eigenen Profiling-Funktionen
schreiben können. Damit die so erzeugte Tabelle auch ausgegeben wird, muß
beim Linken ein spezieller Startup-Code verwendet werden: 'prof_s.o'. Dieser
ruft direkt vor der Terminierung des Programmes eine Funktion Namens
'_saveprof' auf (in C: void _saveprof() ), welche die Tabelle in formatierter
Form in eine ASCII-Datei Namens 'prof.out' im aktuellen Verzeichnis schreibt.
Das ganze funktioniert somit natürlich nicht 100%ig, wenn in verschiedenen
Dateien statische Funktionen gleichen Namens verwendet werden...
Die zugehörigen Standard-Funktionen finden sich in der von uns modifizierten
Version der DLibs (sollte beiliegen, kann ansonsten bei uns bezogen werden).
Sollte das mit profiling übersetzte Programm abstürzen, dann nochmal über-
setzen, und zwar OHNE Optimizer...
- alle Aufrufe von gemdos(), bios() und xbios() werden jetzt direkt als
trap - Befehl erzeugt; aus einem 'jsr _gemdos' wird z.B. 'trap #1';
Die Vorteile:
- der trap - Befehl ist 2 Bytes lang, jsr dagegen 6
- der jsr-Befehl benötigt 20 Taktzyklen,
der rts-Befehl 16
der trap-Befehl 34
--
70 Taktzyklen plus dem, was da noch gemacht
wird (Stack-Test, Rücksprung-Adresse vom
und auf den Stack)
-> der direkte trap-Befehl ist somit mehr als doppelt so schnell in
der Ausführung und auch noch kürzer
(C-Desk ist z.B. mehr als 300 Bytes kürzer geworden)
Der Nachteil:
- kein Stack-overflow-Test mehr (tritt sowieso nie auf, es sei denn
durch einen Programmier-Fehler)
Abschaltbar durch '-T'.
- die Code-Erzeugung für 'switch' wurde wesentlich verbessert. Bisher konnte
es z.B. passieren, daß bei unglücklicher Wahl der 'case' - Werte aus einem
'switch' 4 gemacht wurden, was natürlich langsameren und längeren Code er-
zeugt, als ein 'switch'
Sonstiges
---------
- Erweiterungen/Änderungen gegenüber der Version 1.21 sind den übrigen Texten
zu entnehmen
- alle von TETISOFT vogenommenen Änderungen sind ebenfalls in einem anderen
Text aufgeführt, jedoch größtenteils in der vorliegenden Version nicht oder
in modifizierter From enthalten.