Probleme beim Bau einer Toolchain mit gcc-3.3.3

OP #2324494
Lesenswert?

Hallo allerseits,
seit geraumer Zeit versuche ich verzweifelt eine vorgegebene Toolchain 
(u.a. mit gcc-3.3.3) ans Laufen zu bekommen. Es handelt sich hierbei um 
einen Cross-Compiler für einen PowerPC (Motorola MPC8250).
Das Entwicklungssystem ist ein schickes Debian Squeeze: kernel 2.6.32-5, 
gcc-4.4.5 und einem etwas älteren gcc-3.4.

Beim Kompilieren bricht er an einer Stelle ab und bringt jede Menge 
Fehlermeldungen:
1
verzeichnis/gcc-3.3.3/gcc/cp/decl.c -o cp/decl.o
2
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘push_binding_level’:
3
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:727: error: lvalue required as left operand of assignment
4
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘pop_binding_level’:
5
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:783: error: lvalue required as left operand of assignment
6
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘suspend_binding_level’:
7
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:800: error: lvalue required as left operand of assignment
8
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:819: error: lvalue required as left operand of assignment
9
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘resume_binding_level’:
10
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:832: error: lvalue required as left operand of assignment
11
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘pushdecl_with_scope’:
12
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:4559: error: lvalue required as left operand of assignment
13
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:4561: error: lvalue required as left operand of assignment
14
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘cxx_init_decl_processing’:
15
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:6964: error: lvalue required as left operand of assignment
16
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘grokdeclarator’:
17
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:10816: error: lvalue required as left operand of assignment
18
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:10819: error: lvalue required as left operand of assignment
19
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c: In function ‘start_function’:
20
/verzeichnis/gcc-3.3.3/gcc/cp/decl.c:14465: error: lvalue required as left operand of assignment
21
In file included from /verzeichnis/gcc-3.3.3/gcc/cp/decl.c:15472:
22
./gtype-cp.h: In function ‘gt_ggc_mx_lang_decl’:
23
./gtype-cp.h:354: warning: case label value exceeds maximum value for type
24
./gtype-cp.h: In function ‘gt_ggc_mx_lang_type’:
25
./gtype-cp.h:396: warning: case label value exceeds maximum value for type
26
make[2]: *** [cp/decl.o] Fehler 1
27
make[2]: Leaving directory `/verzeichnis/gcc-3.3-final/gcc'
28
make[1]: *** [all-gcc] Fehler 2
29
make[1]: Leaving directory `/verzeichnis/gcc-3.3-final'
30
make: *** [/verzeichnis/gcc-3.3-final/.compiled] Fehler 2

Jetzt habe ich mich in der besagten Datei decl.c ein wenig umgeschaut.
Um Zeile 680 herum wird current_binding_level definiert:
1
#define current_binding_level      \
2
  (cfun && cp_function_chain->bindings    \
3
   ? cp_function_chain->bindings    \
4
   : scope_chain->bindings)
In allen Zeilen, die die Fehlermeldungen verursachen, wird in 
current_binding_level irgendetwas reingeschrieben. Jetzt wird in 
current_binding_level natürlich selbst nichts reingeschrieben, sondern 
in eine der beiden Strukturen, die im #define erwähnt werden. Das 
scheint aber irgendwie nicht zu funktionieren...

Hat jemand eine Idee woran es liegt? Es kann doch nicht sein, dass ein 
frisch heruntergeladenes gcc-3.3.3 sich nicht kompilieren lässt.
Moderator Persönliche Seite #2324501
Lesenswert?

J. Krämer schrieb:
> Es kann doch nicht sein, dass ein
> frisch heruntergeladenes gcc-3.3.3 sich nicht kompilieren lässt.

Doch, offenbar schon. ;-)  Da war wohl der Parser in älteren
Versionen etwas laxer in dem, was er an nicht standardgemäßer
Syntax noch durchgehen lassen hat.

Entweder beschaffst du dir einen hinreichend alten Hostcompiler
dafür (vermutlich wird jede 3.x-Version noch gehen), oder du
dröselst diese Bugs wirklich auf, indem du aus jeder der
angemoserten Zuweisungen eine if-Anweisung machst.  Das lässt
sich eventuell ja trotzdem noch über ein #define vereinfachen,
so in der Art
1
#define set_current_binding_level(lev) \
2
  do { \
3
    if (cfun && cp_function_chain->bindings)    \
4
       cp_function_chain->bindings = (lev);   \
5
    else \
6
       scope_chain->bindings = (lev); \
7
  } while(0)

und dann alle Statements der Art

current_binding_level = \(.*\);

durch

set_current_binding_level(\1);

ersetzen.  Den alten Makro current_binding_level wirst du sicher
trotzdem noch lassen müssen, denn ich vermute ganz stark, dass der
auch auf der rechten Seite in Ausdrücken benutzt wird.
OP #2324544
Lesenswert?

Ich habe den "Fehler" vermutlich beheben können.
In der initialen Makefile hatte ich gcc-3.4 angegeben, aber es werden 
anscheinend weitere aufgerufen, die einfach nur gcc verwenden.
Daraufhin habe ich in /usr/bin den Softlink gcc geändert. Jetzt zeigt 
gcc nicht mehr auf gcc-4.4, sondern auf gcc-3.4 und es läuft momentan 
sehr gut durch.
Nun heißt's abwarten und Tee trinken :-)

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