mikrocontroller.net

Forum: Compiler & IDEs Bug im GCC ?


Autor: Rangi Jones (rangi)
Datum:

Bewertung
0 lesenswert
nicht 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?
typedef union {
  unsigned long int D;   /*32Bit unsigned*/
  struct{
    unsigned short int _1; /*16Bit unsigned*/
    unsigned short int _0;  
  }W;
} tu_myVar; 


void MyFunction(void)
{
  tu_myVar my_StackVar;
  my_StackVar.W._0 = 0x8000;
  ...
  some code here
  ...
}
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

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rangi Jones (rangi)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.