Forum: Compiler & IDEs Frage zur Parameterübergabe im Stack


von Detlef _A (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich rufe folgende Routine

long long bla(long long eins,long long zwei,long long drei)
{
return drei ;
}


so auf:
rerere=bla( (long long)(1ll),(long long)(2ll),(long long)(3ll));

Das "1ll" ist "eins Ell Ell", Suffix für long long, also richtiger Typ 
mit nem Sicherheits-cast.
Das funzt auch, die zwei kommt zurück, die eins auch, die drei aber 
nicht !?
D.h. return(3); liefert Schrott zurück.

Die funktionierende Variante macht das handling der Daten nur über die 
Register, die nicht-funktionierende Variante holt sich die Daten vom 
Stack und liefert sie in den Registern zurück. Die Stackzugriffe gehen 
wohl schief. Im angehängten File Auszüge des listings. Zu geringe 
Stackgröße ist ausgeschlossen.

Atmega128 ist Zielhardware, natürlich GCC.

Wo liegt der Fehler, gibts Infos oder Optionen dazu, die mir unbekannt 
sind?

Danke
Cheers
Detlef

von Detlef _A (Gast)


Lesenswert?

Ähm, so muß es heißen:

D.h. return drei; liefert Schrott zurück.

Gute Nacht
Detlef

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27386

:-(

Auch wenn es nicht offensichtlich ist: der Bug hat gar nichts mit
dem AVR zu tun, sondern ist im generischen Teil von GCC.  Leider
(zu unserem Leidwesen) stört er GCCs wichtige Architekturen eben
überhaupt nicht, weil diese dafür ihre eigenen Pattern für die
Parameterübergabe liefern.

von Detlef _. (detlef_a)


Lesenswert?

Danke.

Den nächsten verregneten Sonntagnachmittag lese ich mal bugreports.

Cheers
Detlef

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.