Forum: Compiler & IDEs SDCC ändert Aufrufkonvention


von Philipp Klaus K. (pkk)


Lesenswert?

Für viele Zielarchitekturen von SDCC hat sich die bisher verwendete 
Aufrufkonvention als nicht optimal erweisen.
Für stm8, z80, z80n, z180, gbz80, r2k, r2ka, r3ka, ez80_z80 und tlcs90 
haben Experimente ergeben, dass mit einer anderen Aufrufkonvention 
kleinerer und schnellerer Code generiert werden könnte.

Inzwischen wurde eine neue Konvention im Branch breaktheworld 
implementiert. Für stm8 und gbz80 findet sich die neue Konvention auch 
schon in trunk (dort aber noch nicht als Default).

Für einzelne Funktionen kann per __sdcccall(0) die alte, per 
__sdcccall(1) die neue ausgewählt werden. Wo diese Schlüsselwörter nicht 
stehen, wird der Wert des Kommandozeilenarguments --sdccall N verwendet. 
Wo auch dieses nicht verwendet wird, wird der Default verwendet (neue 
Konvention im Branch breaktheworld, alte Konvention in trunk). Die 
Standardbibliothek ist jeweils für den Default kompiliert.

Später soll die neue Konvention auch in trunk Default werden. Für stm8 
und gbz80 dürfte dies in den nächsten Wochen erfolgen, und somit im 
nächsten Release (vermutlich SDCC 4.2.0 Anfang 2022) enthalten sein.

Für die Nutzer ändert sich wenig (abgesehen davon, dass der code im 
Schnitt etwas schneller und kleiner werden sollte), aber in Assembler 
handgeschriebene Funktionen müssen entweder auf die neue 
Aufrufkonvention umgeschrieben werden, oder ihre Funktionsdeklarationen 
mit __sdcccall(0) versehen werden, falls sie weiterhin die alte 
Konvention verwenden sollen.

von Michael (Gast)


Lesenswert?

Danke für die Information. Gibt es Details was sich genau geändert hat 
(Vergleich alt/neu, eventuell mit Beispielen verschiedener Parameter)?

von auf dem Mond Lebender (Gast)


Lesenswert?

Hat man was verpasst ... da es SDCC nicht für AVR und nicht
für STM32 gibt?

von Philipp Klaus K. (pkk)


Lesenswert?

Michael schrieb:
> Danke für die Information. Gibt es Details was sich genau geändert hat
> (Vergleich alt/neu, eventuell mit Beispielen verschiedener Parameter)?

Für stm8 und gbz80 finden sich die Details bereits im Handbuch.

Grobe Zusammenfassung (für alle Ports):

1) Teils andere Register für Rückgagebwerte
2) Manche Argumente werden in Registern übergeben (bisher alle auf dem 
Stack)
3) Bei manchen Funktionen werden auf dem Stack übergebene Argumente von 
der aufgerufenen Funktion statt vom Aufrufer aufgeräumt

1) und 2) verbessern üblicherweise Codegröße und -geschwindigkeit. 3) 
macht den Code üblicherweise langsamer, aber kleiner.

von Thomas Z. (usbman)


Lesenswert?

wird das auch den mcs51 port betreffen. Dort ist es ja so dass der erste 
parm in Registern übergeben wird, die andern dann im Speicher.

Ich hab mich da gerade etwas eingelesen und ein paar Experimente mit 
Assembler gemacht. Die Doku ist in dem Bereich nicht sehr ausführlich. 
Ich baue mir da eine Lib zusammen.
Wie beinflusst das memory model die Parameter übergabe. (small verus 
larg)?

von Philipp Klaus K. (pkk)


Lesenswert?

Thomas Z. schrieb:
> wird das auch den mcs51 port betreffen.

Für mcs51 sind erstmal keine Änderungen vorgesehen.

P.S. Das "alle Ports" oben bezog sich auf alle im OP genannten Ports: 
stm8, z80, z180, z80n, gbz80, r2k, r2ka, r3ka, tlcs90, ez80_z80.

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Gibt es eine neue Major-Release, wenn die Geschichte fertig ist?
Es müssen ja doch ggf. ein paar Sachen angepasst werden.
Es ist sonst etwas schwierig zu vermitteln: Läuft mit Version 4.1.0x 
aber nicht mehr mit Version 4.1.0y...

Ansonsten ist die Sache prinzipiell zu begrüßen, jeder eingesparte Takt 
zählt :-)

von Philipp Klaus K. (pkk)


Lesenswert?

Bernd schrieb:
> Gibt es eine neue Major-Release, wenn die Geschichte fertig ist?
> Es müssen ja doch ggf. ein paar Sachen angepasst werden.
> Es ist sonst etwas schwierig zu vermitteln: Läuft mit Version 4.1.0x
> aber nicht mehr mit Version 4.1.0y...
>
> Ansonsten ist die Sache prinzipiell zu begrüßen, jeder eingesparte Takt
> zählt :-)

Das nächste Major Release 4.2.0 kann erst einige Zeit später kommen, 
wenn bereits genug Erfahrung mit der neuen ABI besteht. Vermutlich 
Anfang 2022.

Ansonsten:

* gbz80 unterstützt die neue ABI (mittels __sdcccall(1) und --sdcccall 
1) seit 4.1.7.
* stm8 unterstützt die neue ABI (mittels __sdcccall(1) und --sdcccall 1) 
seit 4.1.8.
* z80, z180, z80n, t2k, r2ka, r3ka unterstützen die neue ABI (mittels 
__sdcccall(1) und --sdcccall 1) seit 4.1.9.

Wenn die neue ABI für einen Port Default wird, wird dann nochmal die 
Versionsnummer angehoben.

Philipp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.