unable to find a register to spill in class ‘POINTER_REGS’

OP #2567069
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
Angehängte Dateien:
OP #2567987
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
OP #2569548
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
Persönliche Seite #2569607
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren