Hallo zusammen, gestern abend (spät) viel mir auf, dass sich die Outputgrößen irgendwie nicht so verhalten wie ich es erwartet hätte, nämlich so: - Ohne Optimierung: Output: 7,05kB - mit -O/-O1 : 7,15kB - mit -O2 : 7,64kB - mit -O3: 7,75kB - mit -Os: 7,63kB Was ich nicht verstehe, ist, dass -Os so einen großen Output liefert, gerade im Vergleich zum nicht auf Größe optimierten Code. Zum Anderen frag ich mich natürlich, schreib ich so miesen Code, dass er sich nicht optimieren lässt, oder mach ich was beim Kompilieren falsch? Als Optionen hab ich nur das Target, -Wall und eine Optimierungsstufe. Und im Debug-Modus noch -g (erzeugt Debugger Symbole). Grüße Tobi
Gerade gemerkt, dass ich im Debug-Modus kompiliert habe. Im Releasemodus ändern sich aber nur die Zahlen um rund 3kB und die Reihenfolge der Outputgrößen wäre dann -O/O1 (4,11kB) -O2 (4,15kB) -Os (4,16kB) -O3 (4,22kB) -ohne (4,37kB) Immerhin ist der unoptimierte Output jetzt der Größte. Aber ich versteh immer noch nicht, warum die Größenoptimierung größeren Output erzeugt als die Geschwindigkeitsoptimierung. Das läuft doch dem Ziel zu wieder und macht -Os doch eigentlich (zumindest in dem Fall hier) überflüssig.
Danke schön für den Tipp, jetzt mach die Option -Os auch Sinn, in menem Verständnis.
Peter Dannegger schrieb: > Versuch mal zusätzlich: > > -fno-inline-small-functions hmmm, ich dachte das wäre längst in gcc? Sind nur ein paar Zeilen das. FYI:
1 | Index: avr-protos.h
|
2 | ===================================================================
|
3 | --- avr-protos.h (Revision 160067)
|
4 | +++ avr-protos.h (Arbeitskopie)
|
5 | @@ -23,6 +23,8 @@
|
6 | |
7 | extern int function_arg_regno_p (int r); |
8 | extern void avr_override_options (void); |
9 | +extern void avr_optimization_options (int,int);
|
10 | extern void avr_cpu_cpp_builtins (struct cpp_reader * pfile); |
11 | extern int avr_ret_register (void); |
12 | extern bool class_likely_spilled_p (int c); |
13 | Index: avr.c
|
14 | ===================================================================
|
15 | --- avr.c (Revision 160067)
|
16 | +++ avr.c (Arbeitskopie)
|
17 | @@ -223,6 +223,20 @@ avr_override_options (void)
|
18 | init_machine_status = avr_init_machine_status; |
19 | } |
20 | |
21 | +/* Implement `OPTIMIZATION_OPTIONS' */
|
22 | +/* Give some reasonable optimization defaults for AVR.
|
23 | + These can still be overwritten by command line arguments */
|
24 | +
|
25 | +void
|
26 | +avr_optimization_options (int level ATTRIBUTE_UNUSED, int size)
|
27 | +{
|
28 | + if (size)
|
29 | + {
|
30 | + set_param_value ("max-inline-insns-single", 3);
|
31 | + set_param_value ("max-inline-insns-auto", 3);
|
32 | + }
|
33 | +}
|
34 | +
|
35 | /* return register class from register number. */ |
36 | |
37 | static const enum reg_class reg_class_tab[]={ |
38 | Index: avr.h
|
39 | ===================================================================
|
40 | --- avr.h (Revision 160067)
|
41 | +++ avr.h (Arbeitskopie)
|
42 | @@ -125,6 +125,7 @@ extern GTY(()) section *progmem_section;
|
43 | #define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)"); |
44 | |
45 | #define OVERRIDE_OPTIONS avr_override_options () |
46 | +#define OPTIMIZATION_OPTIONS(OPTIMIZE,OPTIMIZE_SIZE) avr_optimization_options (OPTIMIZE,OPTIMIZE_SIZE)
|
47 | |
48 | #define CAN_DEBUG_WITHOUT_FP |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.