A number of options, -mregparm=3 and -mrtd for example, change the calling convention in ways that would be incompatible with normal system header files. These options are thus useless outside of freestanding code. Distinct settings should be available for the app itself and for other stuff.
Ideally, "other stuff" would also be split with distinct settings for system headers and for the libgcc-like things that the compiler may itself generate calls to. This would require that gcc distinguish between memcpy used via system header and memcpy used to implement struct copy. For more direct control, perhaps this is reasonable: #include <stdlib.h> __attribute__((regparm(0))) An example showing this unawareness follows: //////////////////////////////////////////////////////// foo 0 $ cat atoi.c #include <stdlib.h> // a SYSTEM header int a2i(const char *s){ return atoi(s); } foo 0 $ gcc -W -Wall -std=gnu99 -m32 -Os -fomit-frame-pointer -S atoi.c foo 0 $ cat atoi.s .file "atoi.c" .text .globl a2i .type a2i, @function a2i: jmp atoi .size a2i, .-a2i .ident "GCC: (GNU) 4.1.1 20060828 (Red Hat 4.1.1-20)" .section .note.GNU-stack,"",@progbits foo 0 $ gcc -W -Wall -std=gnu99 -m32 -Os -fomit-frame-pointer -mregparm=3 -S atoi.c foo 0 $ cat atoi.s .file "atoi.c" .text .globl a2i .type a2i, @function a2i: jmp atoi .size a2i, .-a2i .ident "GCC: (GNU) 4.1.1 20060828 (Red Hat 4.1.1-20)" .section .note.GNU-stack,"",@progbits foo 0 $ gcc -W -Wall -std=gnu99 -m32 -Os -fomit-frame-pointer -mrtd -S atoi.c foo 0 $ cat atoi.s .file "atoi.c" .text .globl a2i .type a2i, @function a2i: jmp atoi .size a2i, .-a2i .ident "GCC: (GNU) 4.1.1 20060828 (Red Hat 4.1.1-20)" .section .note.GNU-stack,"",@progbits foo 0 $ -- Summary: system headers lack a distinct default calling convention Product: gcc Version: 4.1.1 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: acahalan at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29242