]> sourceware.org Git - glibc.git/commitdiff
Make __extern_always_inline usable on clang++ again
authorSiddhesh Poyarekar <siddhesh@redhat.com>
Tue, 16 Sep 2014 16:46:01 +0000 (22:16 +0530)
committerSiddhesh Poyarekar <siddhesh@redhat.com>
Tue, 16 Sep 2014 16:46:01 +0000 (22:16 +0530)
The fix for BZ #17266 (884ddc5081278f488ef8cd49951f41cfdbb480ce)
removed changes that had gone into cdefs.h to make
__extern_always_inline usable with clang++.  This patch adds back
support for clang to detect if GNU inlining semantics are available,
this time without breaking the gcc use case.  The check put here is
based on the earlier patch and assertion[1] that checking if
__GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ is defined is sufficient
to determine that clang++ suports GNU inlining semantics.

Tested with a simple program that builds with __extern_always_inline
with the patch and fails compilation without it.

 #include <stdio.h>
 #include <sys/cdefs.h>

extern void foo_alias (void) __asm ("foo");

__extern_always_inline void
foo (void)
{
  puts ("hi oh world!");
  return foo_alias ();
}

void
foo_alias (void)
{
  puts ("hell oh world");
}

int
main ()
{
  foo ();
}

[1] https://sourceware.org/ml/libc-alpha/2012-12/msg00306.html

[BZ #17266]
* misc/sys/cdefs.h: Define __extern_always_inline for clang
4.2 and newer.

ChangeLog
misc/sys/cdefs.h

index d5fd959e0d1252f0758f9c5276748269373c169a..436b3df201b029727929c8f64caf0e8831c1b691 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2014-09-16  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
+       [BZ #17266]
+       * misc/sys/cdefs.h: Define __extern_always_inline for clang
+       4.2 and newer.
+
        [BZ #17370]
        * libio/wfileops.c (do_ftell_wide): Free OUT on error path.
 
index 01e81ba9f1776fcd468f74ce9cffbb9b711dacbd..711ac1d912cd66f3d36305f2f011221ad613ee6c 100644 (file)
    inline semantics, unless -fgnu89-inline is used.  Using __GNUC_STDC_INLINE__
    or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
    older than 4.3 may define these macros and still not guarantee GNU inlining
-   semantics.  */
-#if !defined __cplusplus || __GNUC_PREREQ (4,3)
+   semantics.
+
+   clang++ identifies itself as gcc-4.2, but has support for GNU inlining
+   semantics, that can be checked fot by using the __GNUC_STDC_INLINE_ and
+   __GNUC_GNU_INLINE__ macro definitions.  */
+#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
+     || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
+                              || defined __GNUC_GNU_INLINE__)))
 # if defined __GNUC_STDC_INLINE__ || defined __cplusplus
 #  define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
 #  define __extern_always_inline \
This page took 0.123916 seconds and 5 git commands to generate.