Browse Source

[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>
tags/v1.20.1
Michael Brown 10 years ago
parent
commit
082cedb3c3
1 changed files with 11 additions and 0 deletions
  1. 11
    0
      src/arch/i386/include/bits/compiler.h

+ 11
- 0
src/arch/i386/include/bits/compiler.h View File

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

Loading…
Cancel
Save