X-Authentication-Warning: delorie.com: mail set sender to djgpp-workers-bounces using -f X-Recipient: djgpp-workers AT delorie DOT com X-Authenticated: #27081556 X-Provags-ID: V01U2FsdGVkX1/sdIw7ApTsvCMDZkvYrVSh192JrO6ZCaXGNfdoLE Gu+3XujebULxnr From: Juan Manuel Guerrero To: djgpp-workers AT delorie DOT com Subject: Re: Multiple definition of rdtsc. Date: Tue, 4 Jan 2011 19:19:02 +0100 User-Agent: KMail/1.9.10 References: <201101040113 DOT 25277 DOT juan DOT guerrero AT gmx DOT de> In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <201101041919.02681.juan.guerrero@gmx.de> X-Y-GMX-Trusted: 0 Reply-To: djgpp-workers AT delorie DOT com Am Dienstag, 4. Januar 2011 schrieben Sie: > > Yeah, we definitely should put the definition of EXTERN_INLINE somewhere > common. I have put the _EXTERN_INLINE definition into sys/cdefs.h. The only reason for this choice is that it is the same place where this is defined in GNU C lib and I had no better idea. Of course this is arbitrary and can be changed if you prefer. There are other header that also needs to be treated like time.h. All these headers now include sys/cdefs.h to get the _EXTERN_INLINE definition. In farptr.c I define __dj_include_sys_cdefs_h_ to avoid sys/cdefs.h inclusion so that those functions are explicitly created instead of being inlined. I am aware the gcc offers __OPTIMIZE__ to determinate if optimized code is generated but I was not sure if all gcc versions support this macro. If the use of __OPTIMIZE__ is prefered, please let me know. Regards, Juan M. Guerrero *include/sys/cdefs.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). New macro _EXTERN_INLINE. * include/time.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Use _EXTERN_INLINE. * include/inlines/pc.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Use _EXTERN_INLINE. * include/libc/farptrgs.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Use _EXTERN_INLINE. * include/netinet/in.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Use _EXTERN_INLINE. * include/sys/farptr.h: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Use _EXTERN_INLINE. * src/libc/pc_hw/farptr/farptr.c: Ensure that old GNU extern inline semantics is used (aka -fgnu89-inline). Do not include sys/cdefs.h. diff -aprNU3 djgpp.orig/include/inlines/pc.h djgpp/include/inlines/pc.h --- djgpp.orig/include/inlines/pc.h 1998-06-28 22:00:48 +0000 +++ djgpp/include/inlines/pc.h 2011-01-04 17:18:54 +0000 @@ -1,13 +1,16 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ -#ifndef __dj_include_Inline_pc_h_ -#define __dj_include_Inline_pc_h_ +#ifndef __dj_include_inline_pc_h_ +#define __dj_include_inline_pc_h_ #ifdef __cplusplus extern "C" { #endif -extern __inline__ unsigned char +#include + +_EXTERN_INLINE unsigned char inportb (unsigned short _port) { unsigned char rv; @@ -17,7 +20,7 @@ inportb (unsigned short _port) return rv; } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short inportw (unsigned short _port) { unsigned short rv; @@ -27,7 +30,7 @@ inportw (unsigned short _port) return rv; } -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long inportl (unsigned short _port) { unsigned long rv; @@ -37,7 +40,7 @@ inportl (unsigned short _port) return rv; } -extern __inline__ void +_EXTERN_INLINE void outportb (unsigned short _port, unsigned char _data) { __asm__ __volatile__ ("outb %1, %0" @@ -46,7 +49,7 @@ outportb (unsigned short _port, unsigned "a" (_data)); } -extern __inline__ void +_EXTERN_INLINE void outportw (unsigned short _port, unsigned short _data) { __asm__ __volatile__ ("outw %1, %0" @@ -55,7 +58,7 @@ outportw (unsigned short _port, unsigned "a" (_data)); } -extern __inline__ void +_EXTERN_INLINE void outportl (unsigned short _port, unsigned long _data) { __asm__ __volatile__ ("outl %1, %0" @@ -68,4 +71,4 @@ outportl (unsigned short _port, unsigned } #endif -#endif +#endif /* !__dj_include_inline_pc_h_ */ diff -aprNU3 djgpp.orig/include/libc/farptrgs.h djgpp/include/libc/farptrgs.h --- djgpp.orig/include/libc/farptrgs.h 2003-02-04 20:24:52 +0000 +++ djgpp/include/libc/farptrgs.h 2011-01-04 17:06:44 +0000 @@ -1,5 +1,6 @@ /* special version for libc - uses %gs instead of %fs. Ignore comments */ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ /* Copyright (c) 1995 DJ Delorie. Permission granted to use for any @@ -70,6 +71,8 @@ extern "C" { #ifndef _POSIX_SOURCE +#include + void _farpokeb(unsigned short, unsigned long, unsigned char); void _farpokew(unsigned short, unsigned long, unsigned short); void _farpokel(unsigned short, unsigned long, unsigned long); @@ -85,7 +88,7 @@ unsigned char _farnspeekb(unsigned long) unsigned short _farnspeekw(unsigned long); unsigned long _farnspeekl(unsigned long); -extern __inline__ void +_EXTERN_INLINE void _farpokeb(unsigned short selector, unsigned long offset, unsigned char value) @@ -97,7 +100,7 @@ _farpokeb(unsigned short selector, : "rm" (selector), "qi" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farpokew(unsigned short selector, unsigned long offset, unsigned short value) @@ -109,7 +112,7 @@ _farpokew(unsigned short selector, : "rm" (selector), "ri" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farpokel(unsigned short selector, unsigned long offset, unsigned long value) @@ -121,7 +124,7 @@ _farpokel(unsigned short selector, : "rm" (selector), "ri" (value), "r" (offset)); } -extern __inline__ unsigned char +_EXTERN_INLINE unsigned char _farpeekb(unsigned short selector, unsigned long offset) { @@ -134,7 +137,7 @@ _farpeekb(unsigned short selector, return result; } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _farpeekw(unsigned short selector, unsigned long offset) { @@ -147,7 +150,7 @@ _farpeekw(unsigned short selector, return result; } -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long _farpeekl(unsigned short selector, unsigned long offset) { @@ -160,7 +163,7 @@ _farpeekl(unsigned short selector, return result; } -extern __inline__ void +_EXTERN_INLINE void _farsetsel(unsigned short selector) { __asm__ __volatile__ ("movw %w0,%%gs" @@ -168,7 +171,7 @@ _farsetsel(unsigned short selector) : "rm" (selector)); } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _fargetsel(void) { unsigned short selector; @@ -178,7 +181,7 @@ _fargetsel(void) return selector; } -extern __inline__ void +_EXTERN_INLINE void _farnspokeb(unsigned long offset, unsigned char value) { @@ -188,7 +191,7 @@ _farnspokeb(unsigned long offset, : "qi" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farnspokew(unsigned long offset, unsigned short value) { @@ -198,7 +201,7 @@ _farnspokew(unsigned long offset, : "ri" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farnspokel(unsigned long offset, unsigned long value) { @@ -208,7 +211,7 @@ _farnspokel(unsigned long offset, : "ri" (value), "r" (offset)); } -extern __inline__ unsigned char +_EXTERN_INLINE unsigned char _farnspeekb(unsigned long offset) { unsigned char result; @@ -219,7 +222,7 @@ _farnspeekb(unsigned long offset) return result; } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _farnspeekw(unsigned long offset) { unsigned short result; @@ -230,7 +233,7 @@ _farnspeekw(unsigned long offset) return result; } -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long _farnspeekl(unsigned long offset) { unsigned long result; diff -aprNU3 djgpp.orig/include/netinet/in.h djgpp/include/netinet/in.h --- djgpp.orig/include/netinet/in.h 2003-02-04 20:25:20 +0000 +++ djgpp/include/netinet/in.h 2011-01-04 17:06:44 +0000 @@ -1,3 +1,4 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ @@ -29,15 +30,16 @@ unsigned short ntohs(unsigned short _val #endif /* !__dj_ENFORCE_ANSI_FREESTANDING */ #ifndef __dj_ENFORCE_FUNCTION_CALLS +#include -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long htonl(unsigned long _val) { return (_val << 24) | ((_val&0xff00) << 8) | ((_val&0xff0000) >> 8) | (_val >> 24); } #define ntohl(x) htonl(x) -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short htons(unsigned short _val) { return (_val << 8) | (_val >> 8); diff -aprNU3 djgpp.orig/include/sys/cdefs.h djgpp/include/sys/cdefs.h --- djgpp.orig/include/sys/cdefs.h 2003-10-30 20:45:06 +0000 +++ djgpp/include/sys/cdefs.h 2011-01-04 16:45:58 +0000 @@ -1,6 +1,10 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ +#ifndef __dj_include_sys_cdefs_h_ +#define __dj_include_sys_cdefs_h_ + #undef __P #if defined(__STDC__) || defined(__cplusplus) #define __P(p) p @@ -30,6 +34,15 @@ #define _ATTRIBUTE(attrs) __attribute__ ((attrs)) + +/* Ensure that always traditional GNU extern inline semantics is used + (aka -fgnu89-inline) even if ISO C99 semantics has been specified. */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) +# define _EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__)) +#else +# define _EXTERN_INLINE extern __inline__ +#endif + #if defined(__cplusplus) #define __BEGIN_DECLS extern "C" { #define __END_DECLS } @@ -37,3 +50,5 @@ #define __BEGIN_DECLS #define __END_DECLS #endif + +#endif /* !__dj_include_sys_cdefs_h_ */ diff -aprNU3 djgpp.orig/include/sys/farptr.h djgpp/include/sys/farptr.h --- djgpp.orig/include/sys/farptr.h 2003-02-04 20:25:24 +0000 +++ djgpp/include/sys/farptr.h 2011-01-04 17:06:46 +0000 @@ -1,3 +1,4 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ /* Copyright (c) 1995 DJ Delorie. Permission granted to use for any @@ -68,6 +69,8 @@ extern "C" { #ifndef _POSIX_SOURCE +#include + void _farpokeb(unsigned short, unsigned long, unsigned char); void _farpokew(unsigned short, unsigned long, unsigned short); void _farpokel(unsigned short, unsigned long, unsigned long); @@ -83,7 +86,7 @@ unsigned char _farnspeekb(unsigned long) unsigned short _farnspeekw(unsigned long); unsigned long _farnspeekl(unsigned long); -extern __inline__ void +_EXTERN_INLINE void _farpokeb(unsigned short selector, unsigned long offset, unsigned char value) @@ -95,7 +98,7 @@ _farpokeb(unsigned short selector, : "rm" (selector), "qi" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farpokew(unsigned short selector, unsigned long offset, unsigned short value) @@ -107,7 +110,7 @@ _farpokew(unsigned short selector, : "rm" (selector), "ri" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farpokel(unsigned short selector, unsigned long offset, unsigned long value) @@ -119,7 +122,7 @@ _farpokel(unsigned short selector, : "rm" (selector), "ri" (value), "r" (offset)); } -extern __inline__ unsigned char +_EXTERN_INLINE unsigned char _farpeekb(unsigned short selector, unsigned long offset) { @@ -132,7 +135,7 @@ _farpeekb(unsigned short selector, return result; } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _farpeekw(unsigned short selector, unsigned long offset) { @@ -145,7 +148,7 @@ _farpeekw(unsigned short selector, return result; } -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long _farpeekl(unsigned short selector, unsigned long offset) { @@ -158,7 +161,7 @@ _farpeekl(unsigned short selector, return result; } -extern __inline__ void +_EXTERN_INLINE void _farsetsel(unsigned short selector) { __asm__ __volatile__ ("movw %w0,%%fs" @@ -166,7 +169,7 @@ _farsetsel(unsigned short selector) : "rm" (selector)); } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _fargetsel(void) { unsigned short selector; @@ -176,7 +179,7 @@ _fargetsel(void) return selector; } -extern __inline__ void +_EXTERN_INLINE void _farnspokeb(unsigned long offset, unsigned char value) { @@ -186,7 +189,7 @@ _farnspokeb(unsigned long offset, : "qi" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farnspokew(unsigned long offset, unsigned short value) { @@ -196,7 +199,7 @@ _farnspokew(unsigned long offset, : "ri" (value), "r" (offset)); } -extern __inline__ void +_EXTERN_INLINE void _farnspokel(unsigned long offset, unsigned long value) { @@ -206,7 +209,7 @@ _farnspokel(unsigned long offset, : "ri" (value), "r" (offset)); } -extern __inline__ unsigned char +_EXTERN_INLINE unsigned char _farnspeekb(unsigned long offset) { unsigned char result; @@ -217,7 +220,7 @@ _farnspeekb(unsigned long offset) return result; } -extern __inline__ unsigned short +_EXTERN_INLINE unsigned short _farnspeekw(unsigned long offset) { unsigned short result; @@ -228,7 +231,7 @@ _farnspeekw(unsigned long offset) return result; } -extern __inline__ unsigned long +_EXTERN_INLINE unsigned long _farnspeekl(unsigned long offset) { unsigned long result; diff -aprNU3 djgpp.orig/include/time.h djgpp/include/time.h --- djgpp.orig/include/time.h 2009-08-01 04:56:16 +0000 +++ djgpp/include/time.h 2011-01-04 17:06:46 +0000 @@ -1,3 +1,4 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2003 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2000 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */ @@ -110,9 +111,11 @@ int settimeofday(struct timeval *_tp, . void tzsetwall(void); uclock_t uclock(void); -static unsigned long long _rdtsc(void); +#include -static __inline__ unsigned long long +unsigned long long _rdtsc(void); + +_EXTERN_INLINE unsigned long long _rdtsc(void) { unsigned long long result; diff -aprNU3 djgpp.orig/src/libc/pc_hw/farptr/farptr.c djgpp/src/libc/pc_hw/farptr/farptr.c --- djgpp.orig/src/libc/pc_hw/farptr/farptr.c 1995-08-23 05:55:20 +0000 +++ djgpp/src/libc/pc_hw/farptr/farptr.c 2011-01-04 17:13:56 +0000 @@ -1,4 +1,5 @@ +/* Copyright (C) 2011 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ -#define extern -#define __inline__ +#define __dj_include_sys_cdefs_h_ /* Do not include sys/cdefs.h. */ +#define _EXTERN_INLINE #include