Forum: Compiler & IDEs Bug im GCC ?


von Rangi J. (rangi)


Lesenswert?

Hallo Forum,

ich nutze den GCC aus Codesourcery Lite um meine Software für den STM32 
ARM-Prozessor zu übersetzen. Ich wollte jetzt auf die aktuelle Version 
umsteigen und diese wirft mir einem Fehler im Assembler vor.
Kennt jemand fogendes Verhalten und ist es mein Fehler oder ein Problem 
im GCC?
1
typedef union {
2
  unsigned long int D;   /*32Bit unsigned*/
3
  struct{
4
    unsigned short int _1; /*16Bit unsigned*/
5
    unsigned short int _0;  
6
  }W;
7
} tu_myVar; 
8
9
10
void MyFunction(void)
11
{
12
  tu_myVar my_StackVar;
13
  my_StackVar.W._0 = 0x8000;
14
  ...
15
  some code here
16
  ...
17
}
Der Assembler wirft mir an der Stelle "my_StackVar.W._0 = 0x8000;" 
folgendes vor:
C:\DOKUME~1\foo\LOKALE~1\Temp\ccbvl0ak.s: Assembler messages:
C:\DOKUME~1\foo\LOKALE~1\Temp\ccbvl0ak.s:574: Error: immediate value out 
of range -- `movt r4,-32768'
Ein Warning kommt nicht.

Das sieht für mich aus wie ein Vorzeichenproblem. Und das stimmt auch: 
mit 0x7FFFF funktioniert das ganze. Liegt die Variable nicht auf dem 
Stack funktioniert das auch.
Mache ich was falsch oder ist das wirklich in Bug im GCC?

hier noch die Parameter:
gcc version 4.5.1 (Sourcery G++ Lite 2010.09-51) (4.3.3 hat 
funktioniert)

Vielen Dank
Rangi

von Andreas B. (Gast)


Lesenswert?

Ich würde sagen, das ist ein Bug. Der Compiler sollte von sich aus 
nichts erzeugen, was im Assembler einen Fehler erzeugt.

Interessant wäre vielleicht noch was passiert, wenn man eine unsigned 
Konstante vorgibt (also "0x8000u"). Aber an sich ist das ein Bugreport 
wert.

von DerAlbi (Gast)


Lesenswert?

Was passiert, wenn du an die 0x8000 ein U ranhängst? also 0x8000U
alternativ fehler umgehen mit Const-Variable. wenns dann nicht klappt 
isses komisch.
andere möglichkeit:
"some code here" ist richtig viel code.. wenn JA, dann kann es sein, 
dass der prozessor nicht mehr PC-Relativ adressieren kann und dann kann 
es auch zu sonem scheiß kommen, da die konstanten ja gerne mal hinter 
dem Funktions Code liegen...
Ich kenne mich damit nicht konkret aus, wenn ich Grütze erzähle, nicht 
böse sein.

von (prx) A. K. (prx)


Lesenswert?

Völlig egal was man im Quellcode hinschreibt, ein solcher 
Assembler-Fehler darf nicht auftreten. Zumal der Quellcode ok ist. Sieht 
wirklich nach einem Compilerbug aus.

Such mal http://gcc.gnu.org/bugzilla ob der nicht schon drinsteht.

Wenn nicht: Bau einen minimalisierten Quellcode, der keine Zeile mehr 
enthält als für die Reproduktion des Fehler absolut notwendig ist. Dann 
ab damit nach Bugzilla.

von Rangi J. (rangi)


Lesenswert?

Vielen Dank schonmal,
das mit dem "u" hatte leider keinen Erfolg.
Ich werde mal ne Demo dafür schreiben und dann posten.

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.