mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Isaac Dunham <idunham@lavabit.com>
To: musl@lists.openwall.com
Subject: [PATCH/RFC] inline cleanup/C89 support
Date: Thu, 30 Aug 2012 15:45:34 -0700	[thread overview]
Message-ID: <20120830154534.454e8d66@newbook> (raw)
In-Reply-To: <20120824075315.GF10731@port70.net>

[-- Attachment #1: Type: text/plain, Size: 1451 bytes --]

On Fri, 24 Aug 2012 09:53:16 +0200
Szabolcs Nagy <nsz@port70.net> wrote:

> * Rich Felker <dalias@aerifal.cx> [2012-08-23 22:34:25 -0400]:
..
> > #if __STDC_VERSION__ >= 199901L
> > #define __inline inline
> > #define __restrict restrict
> > #endif
> > 
> > added near the top of headers that need to use inline and/or
> > restrict.
(As previously stated, it appears-per a grep of glibc-that restrict is
not needed in these headers.) 
This patch is updated for C++:

#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
#define __inline inline
#endif

> this won't work with c++, nor old strict c compilers
> without __inline and __restrict and can break various
> c parsing tools (ctags, swig, various lints, ..)

1. Do any of these "old strict c compilers" exist on Linux? Are any of
them worth supporting? 
The Linux compilers I'm aware of are all nominally C99 capable (pcc,
tcc, gcc, clang, llvm-gcc, icc, OpenWatcom...), support __inline
(gcc-compatibles), or are hopelessly incomplete/outdated and buggy
(TenDRA, dev86 bcc). The latter ones probably wouldn't work properly
with musl, period.

2. Have you tested those C parsing tools? Have they been updated to
support C99?

3. Would OpenWatcom + musl be usable? Last I knew, OpenWatcom wasn't
compatible with the standard Linux ABI, and ISTR it had to use its own
libc.
If it is a realistic combination (can produce a working hello world),
then it *might* be worth supporting.

Isaac Dunham

[-- Attachment #2: inline.diff --]
[-- Type: text/x-patch, Size: 13468 bytes --]

diff --git a/arch/arm/bits/syscall.h b/arch/arm/bits/syscall.h
index 9932c9e..b84db9b 100644
--- a/arch/arm/bits/syscall.h
+++ b/arch/arm/bits/syscall.h
@@ -1,3 +1,7 @@
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __SYSCALL_LL_E(x) \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
@@ -7,37 +11,37 @@
 
 long (__syscall)(long, ...);
 
-static inline long __syscall0(long n)
+static __inline long __syscall0(long n)
 {
 	return (__syscall)(n);
 }
 
-static inline long __syscall1(long n, long a)
+static __inline long __syscall1(long n, long a)
 {
 	return (__syscall)(n, a);
 }
 
-static inline long __syscall2(long n, long a, long b)
+static __inline long __syscall2(long n, long a, long b)
 {
 	return (__syscall)(n, a, b);
 }
 
-static inline long __syscall3(long n, long a, long b, long c)
+static __inline long __syscall3(long n, long a, long b, long c)
 {
 	return (__syscall)(n, a, b, c);
 }
 
-static inline long __syscall4(long n, long a, long b, long c, long d)
+static __inline long __syscall4(long n, long a, long b, long c, long d)
 {
 	return (__syscall)(n, a, b, c, d);
 }
 
-static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+static __inline long __syscall5(long n, long a, long b, long c, long d, long e)
 {
 	return (__syscall)(n, a, b, c, d, e);
 }
 
-static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+static __inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
 {
 	return (__syscall)(n, a, b, c, d, e, f);
 }
diff --git a/arch/i386/bits/syscall.h b/arch/i386/bits/syscall.h
index 4b574e9..b9335b3 100644
--- a/arch/i386/bits/syscall.h
+++ b/arch/i386/bits/syscall.h
@@ -1,3 +1,7 @@
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __SYSCALL_LL_E(x) \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
@@ -5,7 +9,7 @@
 
 #define __SYSCALL_SSLEN 8
 
-static inline long __syscall0(long __n)
+static __inline long __syscall0(long __n)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n) : "memory");
@@ -14,42 +18,42 @@ static inline long __syscall0(long __n)
 
 #ifndef __PIC__
 
-static inline long __syscall1(long __n, long __a1)
+static __inline long __syscall1(long __n, long __a1)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n), "b"(__a1) : "memory");
 	return __ret;
 }
 
-static inline long __syscall2(long __n, long __a1, long __a2)
+static __inline long __syscall2(long __n, long __a1, long __a2)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n), "b"(__a1), "c"(__a2) : "memory");
 	return __ret;
 }
 
-static inline long __syscall3(long __n, long __a1, long __a2, long __a3)
+static __inline long __syscall3(long __n, long __a1, long __a2, long __a3)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n), "b"(__a1), "c"(__a2), "d"(__a3) : "memory");
 	return __ret;
 }
 
-static inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
+static __inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n), "b"(__a1), "c"(__a2), "d"(__a3), "S"(__a4) : "memory");
 	return __ret;
 }
 
-static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
+static __inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("int $128" : "=a"(__ret) : "a"(__n), "b"(__a1), "c"(__a2), "d"(__a3), "S"(__a4), "D"(__a5) : "memory");
 	return __ret;
 }
 
-static inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
+static __inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("pushl %7 ; pushl %%ebp ; mov 4(%%esp),%%ebp ; int $128 ; popl %%ebp ; popl %%ecx"
@@ -59,7 +63,7 @@ static inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __
 
 #else
 
-static inline long __syscall1(long __n, long __a1)
+static __inline long __syscall1(long __n, long __a1)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("xchg %2,%%ebx ; int $128 ; xchg %2,%%ebx"
@@ -67,7 +71,7 @@ static inline long __syscall1(long __n, long __a1)
 	return __ret;
 }
 
-static inline long __syscall2(long __n, long __a1, long __a2)
+static __inline long __syscall2(long __n, long __a1, long __a2)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("xchg %2,%%ebx ; int $128 ; xchg %2,%%ebx"
@@ -75,7 +79,7 @@ static inline long __syscall2(long __n, long __a1, long __a2)
 	return __ret;
 }
 
-static inline long __syscall3(long __n, long __a1, long __a2, long __a3)
+static __inline long __syscall3(long __n, long __a1, long __a2, long __a3)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("xchg %2,%%ebx ; int $128 ; xchg %2,%%ebx"
@@ -83,7 +87,7 @@ static inline long __syscall3(long __n, long __a1, long __a2, long __a3)
 	return __ret;
 }
 
-static inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
+static __inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("xchg %2,%%ebx ; int $128 ; xchg %2,%%ebx"
@@ -92,7 +96,7 @@ static inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __
 }
 
 #if 0
-static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
+static __inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("pushl %2 ; pushl %%ebx ; mov 4(%%esp),%%ebx ; int $128 ; popl %%ebx ; popl %%ecx"
@@ -100,13 +104,13 @@ static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __
 	return __ret;
 }
 #else
-static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
+static __inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
 {
 	return (__syscall)(__n, __a1, __a2, __a3, __a4, __a5);
 }
 #endif
 
-static inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
+static __inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
 {
 	return (__syscall)(__n, __a1, __a2, __a3, __a4, __a5, __a6);
 }
diff --git a/arch/mips/bits/syscall.h b/arch/mips/bits/syscall.h
index 6c51bab..795f432 100644
--- a/arch/mips/bits/syscall.h
+++ b/arch/mips/bits/syscall.h
@@ -1,3 +1,7 @@
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __SYSCALL_LL_E(x) \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
 ((union { long long ll; long l[2]; }){ .ll = x }).l[1]
@@ -7,37 +11,37 @@
 
 long (__syscall)(long, ...);
 
-static inline long __syscall0(long n)
+static __inline long __syscall0(long n)
 {
 	return (__syscall)(n);
 }
 
-static inline long __syscall1(long n, long a)
+static __inline long __syscall1(long n, long a)
 {
 	return (__syscall)(n, a);
 }
 
-static inline long __syscall2(long n, long a, long b)
+static __inline long __syscall2(long n, long a, long b)
 {
 	return (__syscall)(n, a, b);
 }
 
-static inline long __syscall3(long n, long a, long b, long c)
+static __inline long __syscall3(long n, long a, long b, long c)
 {
 	return (__syscall)(n, a, b, c);
 }
 
-static inline long __syscall4(long n, long a, long b, long c, long d)
+static __inline long __syscall4(long n, long a, long b, long c, long d)
 {
 	return (__syscall)(n, a, b, c, d);
 }
 
-static inline long __syscall5(long n, long a, long b, long c, long d, long e)
+static __inline long __syscall5(long n, long a, long b, long c, long d, long e)
 {
 	return (__syscall)(n, a, b, c, d, e);
 }
 
-static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
+static __inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
 {
 	return (__syscall)(n, a, b, c, d, e, f);
 }
diff --git a/arch/x86_64/bits/syscall.h b/arch/x86_64/bits/syscall.h
index 567cfcb..e19efb9 100644
--- a/arch/x86_64/bits/syscall.h
+++ b/arch/x86_64/bits/syscall.h
@@ -1,23 +1,27 @@
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __SYSCALL_LL_E(x) (x)
 #define __SYSCALL_LL_O(x) (x)
 
 #define __SYSCALL_SSLEN 8
 
-static inline long __syscall0(long __n)
+static __inline long __syscall0(long __n)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("syscall" : "=a"(__ret) : "a"(__n) : "rcx", "r11", "memory");
 	return __ret;
 }
 
-static inline long __syscall1(long __n, long __a1)
+static __inline long __syscall1(long __n, long __a1)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("syscall" : "=a"(__ret) : "a"(__n), "D"(__a1) : "rcx", "r11", "memory");
 	return __ret;
 }
 
-static inline long __syscall2(long __n, long __a1, long __a2)
+static __inline long __syscall2(long __n, long __a1, long __a2)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("syscall" : "=a"(__ret) : "a"(__n), "D"(__a1), "S"(__a2)
@@ -25,7 +29,7 @@ static inline long __syscall2(long __n, long __a1, long __a2)
 	return __ret;
 }
 
-static inline long __syscall3(long __n, long __a1, long __a2, long __a3)
+static __inline long __syscall3(long __n, long __a1, long __a2, long __a3)
 {
 	unsigned long __ret;
 	__asm__ __volatile__ ("syscall" : "=a"(__ret) : "a"(__n), "D"(__a1), "S"(__a2),
@@ -33,7 +37,7 @@ static inline long __syscall3(long __n, long __a1, long __a2, long __a3)
 	return __ret;
 }
 
-static inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
+static __inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __a4)
 {
 	unsigned long __ret;
 	register long __r10 __asm__("r10") = __a4;
@@ -42,7 +46,7 @@ static inline long __syscall4(long __n, long __a1, long __a2, long __a3, long __
 	return __ret;
 }
 
-static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
+static __inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __a4, long __a5)
 {
 	unsigned long __ret;
 	register long __r10 __asm__("r10") = __a4;
@@ -52,7 +56,7 @@ static inline long __syscall5(long __n, long __a1, long __a2, long __a3, long __
 	return __ret;
 }
 
-static inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
+static __inline long __syscall6(long __n, long __a1, long __a2, long __a3, long __a4, long __a5, long __a6)
 {
 	unsigned long __ret;
 	register long __r10 __asm__("r10") = __a4;
diff --git a/include/byteswap.h b/include/byteswap.h
index 8689cd5..347ceb4 100644
--- a/include/byteswap.h
+++ b/include/byteswap.h
@@ -3,26 +3,21 @@
 
 #include <stdint.h>
 
-#if __STDC_VERSION__ >= 199901L
-inline
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
 #endif
-static uint16_t __bswap_16(uint16_t __x)
+
+__inline static uint16_t __bswap_16(uint16_t __x)
 {
 	return __x<<8 | __x>>8;
 }
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static uint32_t __bswap_32(uint32_t __x)
+__inline static uint32_t __bswap_32(uint32_t __x)
 {
 	return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
 }
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static uint64_t __bswap_64(uint64_t __x)
+__inline static uint64_t __bswap_64(uint64_t __x)
 {
 	return __bswap_32(__x)+0ULL<<32 | __bswap_32(__x>>32);
 }
diff --git a/include/endian.h b/include/endian.h
index 41ca171..0f68b1f 100644
--- a/include/endian.h
+++ b/include/endian.h
@@ -1,6 +1,10 @@
 #ifndef _ENDIAN_H
 #define _ENDIAN_H
 
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __LITTLE_ENDIAN 1234
 #define __BIG_ENDIAN 4321
 #define __PDP_ENDIAN 3412
@@ -20,26 +24,17 @@
 
 #include <stdint.h>
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static uint16_t __bswap16(uint16_t __x)
+__inline static uint16_t __bswap16(uint16_t __x)
 {
 	return __x<<8 | __x>>8;
 }
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static uint32_t __bswap32(uint32_t __x)
+__inline static uint32_t __bswap32(uint32_t __x)
 {
 	return __x>>24 | __x>>8&0xff00 | __x<<8&0xff0000 | __x<<24;
 }
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static uint64_t __bswap64(uint64_t __x)
+__inline static uint64_t __bswap64(uint64_t __x)
 {
 	return __bswap32(__x)+0ULL<<32 | __bswap32(__x>>32);
 }
diff --git a/include/math.h b/include/math.h
index 2fdcb7b..f752a35 100644
--- a/include/math.h
+++ b/include/math.h
@@ -5,6 +5,10 @@
 extern "C" {
 #endif
 
+#if __STDC_VERSION__ >= 199901L || defined(__cplusplus)
+#define __inline inline
+#endif
+
 #define __NEED_float_t
 #define __NEED_double_t
 #define __NEED___uint16_t
@@ -83,10 +87,7 @@ int __signbitl(long double);
 
 #define isunordered(x,y) (isnan((x)) ? ((void)(y),1) : isnan((y)))
 
-#if __STDC_VERSION__ >= 199901L
-inline
-#endif
-static int __isrel(long double __x, long double __y, int __rel)
+__inline static int __isrel(long double __x, long double __y, int __rel)
 {
 	if (isunordered(__x, __y)) return 0;
 	if (__rel==-2) return __x < __y;

  reply	other threads:[~2012-08-30 22:45 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-23  5:07 compatability: bits/syscall.h requires C99 idunham
2012-08-23  6:11 ` [PATCH] Problem is static inline idunham
2012-08-23  6:20   ` [PATCH 2/1] " idunham
2012-08-23  6:43     ` Szabolcs Nagy
2012-08-23  6:51   ` [PATCH] " Szabolcs Nagy
2012-08-23 12:18   ` Rich Felker
2012-08-23 12:31 ` compatability: bits/syscall.h requires C99 John Spencer
2012-08-23 12:34   ` Rich Felker
2012-08-24  0:25     ` Isaac Dunham
2012-08-24  2:07       ` Rich Felker
2012-08-24  2:34         ` Rich Felker
2012-08-24  3:31           ` [PATCH/RFC] __inline for C89 compilers (take 3?) Isaac Dunham
2012-08-24  7:53           ` compatability: bits/syscall.h requires C99 Szabolcs Nagy
2012-08-30 22:45             ` Isaac Dunham [this message]
2012-08-31  8:34               ` [PATCH/RFC] inline cleanup/C89 support Szabolcs Nagy
2012-08-31 19:27                 ` Isaac Dunham
2012-09-02 16:51               ` Rich Felker
2012-09-04 15:49                 ` philomath
2012-09-04 17:44                   ` Rich Felker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120830154534.454e8d66@newbook \
    --to=idunham@lavabit.com \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).