Forum: Compiler & IDEs unable to find a register to spill in class ‘POINTER_REGS’


von Thomas K. (muetze1)


Angehängte Dateien:

Lesenswert?

Hi!

Da hier ja ein paar Leute vom avr-gcc Team aktiv sind, hoffe ich hier 
Hilfe zu bekommen. Ich bastel gerade an einem Projekt, wo mich derzeit 
der o.g. Fehler aufhält. Ich habe nach dem Fehler gesucht und einen Bug 
Eintrag gefunden (#39212, 
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39212). Dieser sollte mit 
AVR-GCC 4.5.2 und 4.6.1 behoben sein, bzw. nicht mehr nachvollziehbar 
sein. Da ich unter Windows nicht weiter kam, habe ich nun mir Ubuntu 
genommen und darauf weiter gemacht. Leider stoße ich dort mit der 
Version 4.5.3 auf genau den gleichen Fehler. Nun bin ich etwas ratlos 
(vor allem da der Fehler nicht nachvollzogen werden kann).

Ich habe den gesamten Stand mal angehangen, aus dem Grund, wenn ich den 
Code irgendwo anpasse oder ändere ist der Fehler weg, tritt aber dann 
über kurz oder lang an anderer Stelle wieder auf. Somit ist es schwierig 
den Code einzukürzen, weil damit läuft der desto eher fehlerfrei durch. 
Somit ist ein kurzes prägnantes Beispiel nicht möglich. Das ist auch mit 
ein Grund, dass ich dieses große Projekt nicht bei GCC anhängen möchte.

Zu den Development/Toolchains:

Windows:

AVR Studio 4.19 (build 730)
AVR Toolchain 3.3.0 (AVR-GCC: 4.5.1, AVR-LIBC: 1.7.1)

Linux:

Eclipse
CDT Plugin 6.0.2
AVR Plugin 2.3.4 (AVR-GCC: 4.5.3, AVR-LIBC: 1.7.1)
1
Building file: ../menu.c
2
Invoking: AVR Compiler
3
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=16000000UL -MMD -MP -MF"menu.d" -MT"menu.d" -c -o"menu.o" "../menu.c"
4
../menu.c: In function ‘menu_cycle’:
5
../menu.c:492:1: error: unable to find a register to spill in class ‘POINTER_REGS’
6
../menu.c:492:1: error: this is the insn:
7
(insn 669 493 494 71 ../menu.c:479 (set (reg:QI 18 r18)
8
        (mem/c:QI (plus:HI (reg/f:HI 28 r28)
9
                (const_int 1 [0x1])) [6 S1 A8])) 858 {*movqi} (nil))
10
../menu.c:492: confused by earlier errors, bailing out
11
make: *** [menu.o] Error 1

Ich werde mich nebenbei mal hinsetzen und versuchen einen neuen Stand 
vom avr-gcc und der avr-libc aus den Repositories zu holen und zu 
übersetzen.

Grüße,
Muetze1

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bei manchen spill fails hilft ein -fno-caller-saves, vielleicht ja auch 
hier. Ein Allheilmittel ist's allerdings nicht.

von Thomas K. (muetze1)


Lesenswert?

Hallo Johann,

ja, das hilft mir über den Fehler. Damit kann ich dann zumindest erst 
einmal weiter arbeiten. Danke für die schnelle Hilfe.

Falls ich neue Erkenntnisse habe oder der Fehler trotzdem wieder 
auftritt, dann melde ich mir hier nochmals.

Danke,
Thomas

von Thomas K. (muetze1)


Lesenswert?

Hallo,

so, ich habe nun den Rest des Tages damit zugebracht die folgenden 
Pakete zu bauen und zu installieren:

avr-gcc 4.6.2
avr-libc 1.8.0
binutils 2.22
avrdude 5.11 svn 20111019
gdb 7.4
simulavr 1.0
avarice 2.12

Nebenbei dann nochmal Eclipse 3.6 RC 2 und das AVR Plugin neu da mit 
rein.

Der Fehler bei den oben angehängten Sourcen bleibt bestehen:
1
GNU C (GCC) version 4.6.2 (avr)
2
  compiled by GNU C version 4.6.1, GMP version 5.0.1, MPFR version 3.0.1-p3, MPC version 0.9
3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
4
Compiler executable checksum: 5597ab2a6a433c5f3ad032ba6eddff9d
5
../menu.c: In function ‘menu_cycle’:
6
../menu.c:492:1: error: unable to find a register to spill in class ‘POINTER_REGS’
7
../menu.c:492:1: error: this is the insn:
8
(insn 672 496 497 71 (set (reg:QI 18 r18)
9
        (mem/c:QI (plus:HI (reg/f:HI 28 r28)
10
                (const_int 1 [0x1])) [4 S1 A8])) ../menu.c:479 4 {*movqi}
11
     (nil))
12
../menu.c:492: confused by earlier errors, bailing out

Aber dafür klappt nun die Integration in Eclipse einwandfrei. Nun habe 
ich zumindest eine ordentliche Umgebung ;-)

Mit der genannten Option -fno-caller-saves klappt es dann auch mit dem 
4.6.2 wieder. Vielleicht hilft der obige Projektstand ja das Problem im 
GCC zu beheben.

Danke,
Muetze1

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas K. schrieb:

> Vielleicht hilft der obige Projektstand ja das Problem im
> GCC zu beheben.

Die Aussage allein hilft leider nicht viel.

Könntest du das mit -save-temps und ohne caller-saves erzeugen und das 
Modul.i, das den ICE erzeugt, anhängen?

von Thomas K. (muetze1)


Lesenswert?

Klar, kein Problem. Setze ich mich heute Abend nach der Arbeit mal ran.

von Thomas K. (muetze1)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe es wie gewünscht erstellt und dann gleich mal nochmal alles 
eingepackt. Damit hast du somit auch die .s Dateien und weiteres. Ich 
hoffe das so dann hilfreicher.

Grüße,
Thomas

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

hoioi, du gehtst ja nicht gerade zimperlich mit dem Speicherplatz um ;-)

Der Testfall war ziemlich komplex, konnte aber deutlich vereinfacht 
werden:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50925#c19

von Thomas K. (muetze1)


Lesenswert?

Och naja, Debug Build hat so eine gewisse kleine Überbelegung, aber im 
Release passt doch noch alles rein. Und viel fehlt ja auch nicht mehr an 
Code. Ich komme aus der App Entwickler Ecke und von daher: Speicher ist 
genügend vorhanden. Beim AVR muss ich das wohl nochmal selbst lernen, 
wenn es eng wird. Aber der ATMega16 sollte derzeit noch genug Reserven 
haben - glaube ich zumindest.

Ansonsten prägnant kurzes Beispiel. Hätte nicht gedacht, dass man es so 
klein bekommt. Aber ich denke mal, da fehlt auch das Wissen, was zu dem 
Fehler führt. Ich hätte das wohl nie so kurz bekommen.

Danke für deine Hilfe und ich hoffe, dass man den Bug vllt. mal weiter 
ausmerzen kann. Sofern es überhaupt ein Bug ist...

Grüße,
Thomas

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Thomas K. schrieb:

> Ansonsten prägnant kurzes Beispiel. Hätte nicht gedacht, dass man es so
> klein bekommt. Aber ich denke mal, da fehlt auch das Wissen, was zu dem
> Fehler führt. Ich hätte das wohl nie so kurz bekommen.

Ich hab's auch nur durch Hin- und Herprobieren rausgefunden; mit 
Delta-Debugging kenne ich mich leider nicht aus.

> Danke für deine Hilfe und ich hoffe, dass man den Bug vllt. mal weiter
> ausmerzen kann. Sofern es überhaupt ein Bug ist...

Ja klar ist es ein Bug. Egal was man in GCC reinstopft — auf einen ICE 
sollte er nie laufen.

Der Fehler ist im komplexesten Part von GCC überhaupt: dem 
Register-Allokator, der eine beliebige Anzahl von s.g. Pseudo-Registern 
auf den konkreten Registersatz der Hardware abzubilden hat, den 
Stackframe verwaltet, Spill-Code erzeugt, usw.

Über diesen Teil von GCC schreibt ein Artikel im GCC-Wiki:

>> Reload is the GCC equivalent of Satan.

und ein anderer:

>> [...] which means reload changes. Do not go there;
>> it cannot be done by mortals.

von Thomas K. (muetze1)


Lesenswert?

Ich sollte mir wohl endlich mal Buch über Compilerbau durchlesen fg

Aber alles in allem vielen Dank für deine Hilfe. Ich konnte ja schon 
sehen, wie du auch auf der mailing List recht beschäftigt bist. Und auch 
danke für die Erklärungen.

Grüße,
Thomas

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.