Moin!
Ich habe ein Problem eine inline-Funktion aufzurufen und dabei das
Inlining zu erzwingen. Folgendes Beispiel sollte das Problem
reproduzieren:
1 | // header.h
|
2 |
|
3 | inline void bar(void) __attribute__((always_inline));
|
4 |
|
5 | // ...
|
1 | // A.c
|
2 |
|
3 | #include "header.h"
|
4 |
|
5 | void
|
6 | foo()
|
7 | {
|
8 | bar();
|
9 | }
|
1 | // B.c
|
2 |
|
3 | #include "header.h"
|
4 |
|
5 | inline void
|
6 | bar(void)
|
7 | {
|
8 | // Do something.
|
9 | }
|
10 |
|
11 | // ...
|
Der GCC bricht das Kompilieren mit
1 | bfin-elf-gcc -I./include/ -g -mcpu=bf537 -std=gnu99 -Wall -pedantic -Os -save-temps -Winline -c -o A.o A.c
|
2 | events.c: In Funktion »foo«:
|
3 | ./include/header.h:129: nicht implementiert: »inline« beim Aufruf von »bar« gescheitert: function body not available
|
4 | A.c:90: nicht implementiert: von hier aufgerufen
|
Scheint also als ob inline nicht geht weil er das Objekt nicht greifen
kann?! Also Kontrolle indem alles in eine Quelldatei kommt:
1 | // header.h
|
2 |
|
3 | inline void bar(void) __attribute__((always_inline));
|
4 |
|
5 | // ...
|
1 | // A.c
|
2 |
|
3 | #include "header.h"
|
4 |
|
5 | void
|
6 | foo()
|
7 | {
|
8 | bar();
|
9 | }
|
10 |
|
11 | inline void
|
12 | bar(void)
|
13 | {
|
14 | // Do something.
|
15 | }
|
Et voila, er kompiliert durch, ein Blick ins ASM-Listing bestätigt das
ordnungsgemäße Inlinen (BTW: Jedoch nicht bei abgeschalteter
Optimierung, was imho nicht zur Aussage in der Doku passt).
Nochwas am Rande. Wenn ich das __attribute__((always_inline)) entferne
meckert er:
1 | bfin-elf-gcc -I./include/ -g -mcpu=bf537 -std=gnu99 -Wall -pedantic -Os -save-temps -Winline -c -o events.o events.c
|
2 | A.c: In Funktion »foo«:
|
3 | A.c:147: Warnung: »inline« beim Aufruf von »bar« gescheitert: --param max-inline-insns-single limit reached
|
4 | A.c:90: Warnung: von hier aufgerufen
|
Wie bekomme ich aber den GCC dazu das über Quelldateigrenzen hinweg zu
realisieren? Liegt es vllt am gnu99-Schalter - die Doku ist etwas knapp?
Cheers
TH
Edit: gcc-Version 4.1.2 (ADI svn)