david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[build] Fix __libgcc attribute for recent gcc versions

We observed some time ago (in commit 4ce8d61 "Import various libgcc
functions from syslinux") that gcc seems to treat calls to the
implicit arithmetic functions (e.g. __udivdi3()) as being affected by
-mregparm but unaffected by -mrtd.

This seems to be no longer the case with current gcc versions, which
treat calls to these functions as being affected by both -mregparm and
-mrtd, as expected.

There is nothing obvious in the gcc changelogs to indicate precisely
when this happened.  From experimentation with available gcc versions,
the change occurred sometime between v4.6.3 and v4.7.2.  We assume
that only versions up to v4.6.x require the special treatment.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2014-04-25 15:55:36 +01:00
parent ad7d5af5e1
commit 082cedb3c3
1 changed files with 11 additions and 0 deletions

View File

@ -19,8 +19,19 @@ FILE_LICENCE ( GPL2_OR_LATER );
* The implicit calls to memcpy() and memset() which gcc can generate
* do not seem to have this inconsistency; -mregparm and -mrtd affect
* them in the same way as any other function.
*
* Update (25/4/14): it appears that more recent gcc versions do allow
* -mrtd to affect calls to the implicit arithmetic functions. There
* is nothing obvious in the gcc changelogs to indicate precisely when
* this happened. From experimentation with available gcc versions,
* the change occurred sometime between v4.6.3 and v4.7.2. We assume
* that only versions up to v4.6.x require the special treatment.
*/
#if ( __GNUC__ < 4 ) || ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ <= 6 ) )
#define __libgcc __attribute__ (( cdecl ))
#else
#define __libgcc
#endif
#endif /* ASSEMBLY */