[m-rev.] for review: separate gcc and clang specific code in the runtime
Julien Fischer
juliensf at csse.unimelb.edu.au
Mon Aug 1 14:18:27 AEST 2011
In the absence of any review comments I will commit this later today.
Julien.
On Wed, 27 Jul 2011, Julien Fischer wrote:
>
> For review by anyone.
>
> Branches: main, 11.07
>
> Avoid using the __GNUC__ macro in the runtime as a test for the presence of
> gcc, since clang also defines that macro. Since clang doesn't support all
> of the GNU C extensions, we can't actually use __GNUC__ without also checking
> whether we are actually using clang.
>
> runtime/mercury_conf_param.h:
> Add three new macros, MR_CLANG, MR_GNUC and MR_MSVC that are defined
> only when the C compiler is clang, gcc, or Visual C respectively.
> (In particular, MR_GNUC will _not_ be defined when the C compiler
> is clang.)
>
> runtime/mercury.c:
> runtime/mercury.h:
> runtime/mercury_atomic_ops.c:
> runtime/mercury_atomic_ops.h
> runtime/mercury_bitmap.h:
> runtime/mercury_float.h:
> runtime/mercury_getopt.c:
> runtime/mercury_goto.h:
> runtime/mercury_heap.h:
> runtime/mercury_std.h:
> Replace uses of the __GNUC__ and __clang__ macros with the above.
>
> runtime/mercury_regs.h:
> As above, also #include mercury_conf_param.h directly since
> this file is #included by some of the tests in the configure
> script.
>
> Julien.
>
> Index: runtime/mercury.c
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury.c,v
> retrieving revision 1.45
> diff -u -r1.45 mercury.c
> --- runtime/mercury.c 20 May 2011 04:16:53 -0000 1.45
> +++ runtime/mercury.c 27 Jul 2011 05:21:36 -0000
> @@ -83,7 +83,7 @@
> }
> )
>
> -#if defined(MR_AVOID_MACROS) || !defined(__GNUC__)
> +#if defined(MR_AVOID_MACROS) || !defined(MR_GNUC)
>
> MR_OUTLINE_DEFN(
> MR_Box
> @@ -100,7 +100,7 @@
> }
> )
>
> -#endif /* MR_AVOID_MACROS || !__GNUC__ */
> +#endif /* MR_AVOID_MACROS || !MR_GNUC */
>
> #if defined(MR_AVOID_MACROS)
>
> Index: runtime/mercury.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury.h,v
> retrieving revision 1.77
> diff -u -r1.77 mercury.h
> --- runtime/mercury.h 20 May 2011 04:16:54 -0000 1.77
> +++ runtime/mercury.h 27 Jul 2011 05:20:48 -0000
> @@ -85,7 +85,7 @@
> ** The jmp_buf type used by MR_builtin_setjmp()
> ** to save the stack context when implementing commits.
> */
> -#ifdef __GNUC__
> +#ifdef MR_GNUC
> /*
> ** For GCC, we use `__builtin_setjmp' and `__builtin_longjmp'.
> ** These are documented (in gcc/builtins.c in the GCC source code)
> @@ -160,7 +160,7 @@
> ** 2. The call to __builtin_longjmp() must not be in the same
> ** function as the call to __builtin_setjmp().
> */
> -#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
> +#if (MR_GNUC > 2 || (MR_GNUC == 2 && __GNUC_MINOR__ >= 8))
> #ifndef MR_DARWIN_SETJMP_WORKAROUND
> #define MR_builtin_setjmp(buf) __builtin_setjmp((buf))
> #define MR_builtin_longjmp(buf, val) __builtin_longjmp((buf),
> (val))
> @@ -178,7 +178,7 @@
>
> #ifdef MR_CONSERVATIVE_GC
> #ifdef MR_INLINE_ALLOC
> - #ifndef __GNUC__
> + #ifndef MR_GNUC
> #error "MR_INLINE_ALLOC requires GNU C"
> #endif
> /*
> @@ -229,7 +229,7 @@
>
> #else /* !MR_CONSERVATIVE_GC */
>
> - #ifndef __GNUC__
> + #ifndef MR_GNUC
> /*
> ** We need GNU C's `({...})' expressions.
> ** It's not worth worrying about compilers other than GNU C for
> @@ -266,7 +266,7 @@
> ** XXX we should optimize the case where sizeof(MR_Float) == sizeof(MR_Box)
> */
>
> -#if defined(__GNUC__) && !defined(MR_AVOID_MACROS)
> +#if defined(MR_GNUC) && !defined(MR_AVOID_MACROS)
> #define MR_box_float(f) ({ \
> MR_Float *MR_box_float_ptr; \
> \
> Index: runtime/mercury_atomic_ops.c
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_atomic_ops.c,v
> retrieving revision 1.12
> diff -u -r1.12 mercury_atomic_ops.c
> --- runtime/mercury_atomic_ops.c 20 May 2011 04:16:54 -0000 1.12
> +++ runtime/mercury_atomic_ops.c 27 Jul 2011 05:15:38 -0000
> @@ -142,7 +142,7 @@
> ** Profiling of the parallel runtime.
> */
>
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> /*
> ** True if the RDTSCP and RDTSC instructions are available respectively.
> */
> @@ -152,7 +152,7 @@
>
> MR_uint_least64_t MR_cpu_cycles_per_sec = 0;
>
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
>
> /* Set this to 1 to enable some printfs below */
> #define MR_DEBUG_CPU_FEATURE_DETECTION 0 @@ -177,12 +177,12 @@
> static MR_uint_least64_t
> parse_freq_from_x86_brand_string(char *string);
>
> -#endif /* __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* MR_GNUC && (__i386__ || __x86_64__) */
>
> void
> MR_do_cpu_feature_detection(void)
> {
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> MR_Unsigned a, b, c, d;
> MR_Unsigned eflags, old_eflags;
> MR_Unsigned maximum_extended_page;
> @@ -386,10 +386,10 @@
> }
> #endif
> }
> -#endif /* __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* MR_GNUC && (__i386__ || __x86_64__) */
> }
>
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> static MR_uint_least64_t
> parse_freq_from_x86_brand_string(char *string)
> {
> @@ -450,12 +450,12 @@
> */
> return (MR_uint_least64_t)(strtod(&string[freq_index], NULL) *
> multiplier);
> }
> -#endif /* __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* MR_GNUC && (__i386__ || __x86_64__) */
>
> void
> MR_profiling_start_timer(MR_Timer *timer)
> {
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> /*
> ** If we don't have enough data to fill in all the fields of this
> structure
> ** we leave them alone, we won't check them later without checking
> @@ -472,7 +472,7 @@
> void
> MR_profiling_stop_timer(MR_Timer *timer, MR_Stats *stats)
> {
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> MR_Timer now;
> MR_int_least64_t duration;
> MR_uint_least64_t duration_squared;
> @@ -510,16 +510,16 @@
> MR_US_UNLOCK(&(stats->MR_stat_sums_lock));
> #endif
> }
> -#else /* not __GNUC__ && (__i386__ || __x86_64__) */
> +#else /* not MR_GNUC && (__i386__ || __x86_64__) */
> /* No TSC support on this architecture or with this C compiler */
> MR_atomic_inc_int(&(stats->MR_stat_count_recorded));
> -#endif /* not __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* not MR_GNUC && (__i386__ || __x86_64__) */
> }
>
> MR_uint_least64_t
> MR_read_cpu_tsc(void)
> {
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
> MR_uint_least64_t tsc;
>
> if (MR_rdtsc_is_available) {
> @@ -528,15 +528,15 @@
> tsc = 0;
> }
> return tsc;
> -#else /* not __GNUC__ && (__i386__ || __x86_64__) */
> +#else /* not MR_GNUC && (__i386__ || __x86_64__) */
> return 0;
> -#endif /* not __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* not MR_GNUC && (__i386__ || __x86_64__) */
> }
>
> /*
> ** It's convenient that this instruction is the same on both i386 and x86_64
> */
> -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
> +#if defined(MR_GNUC) && (defined(__i386__) || defined(__x86_64__))
>
> static __inline__ void
> MR_cpuid(MR_Unsigned code, MR_Unsigned sub_code,
> @@ -596,7 +596,7 @@
> *tsc |= tsc_low;
> }
>
> -#endif /* __GNUC__ && (__i386__ || __x86_64__) */
> +#endif /* MR_GNUC && (__i386__ || __x86_64__) */
>
> #endif /* MR_PROFILE_PARALLEL_EXECUTION_SUPPORT */
>
> Index: runtime/mercury_atomic_ops.h
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_atomic_ops.h,v
> retrieving revision 1.17
> diff -u -r1.17 mercury_atomic_ops.h
> --- runtime/mercury_atomic_ops.h 5 Apr 2011 10:27:26 -0000 1.17
> +++ runtime/mercury_atomic_ops.h 27 Jul 2011 05:18:23 -0000
> @@ -52,7 +52,7 @@
> * References: Intel and AMD documentation for PAUSE, Intel optimisation
> * guide.
> */
> -#if defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) && \
> +#if defined(MR_GNUC) && ( defined(__i386__) || defined(__x86_64__) ) && \
> !defined(MR_DO_NOT_USE_CPU_RELAX)
>
> #define MR_ATOMIC_PAUSE
> \
> @@ -148,7 +148,7 @@
> /*---------------------------------------------------------------------------*/
> /*---------------------------------------------------------------------------*/
>
> -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && \
> +#if (MR_GNUC > 4 || (MR_GNUC == 4 && __GNUC_MINOR__ >= 1)) && \
> !defined(MR_AVOID_COMPILER_INTRINSICS)
>
> /*
> @@ -159,7 +159,7 @@
> return __sync_bool_compare_and_swap(addr, old, new_val);
> \
> } while (0)
>
> -#elif defined(__GNUC__) && defined(__x86_64__)
> +#elif defined(MR_GNUC) && defined(__x86_64__)
>
> #define MR_COMPARE_AND_SWAP_WORD_BODY
> \
> do {
> \
> @@ -173,7 +173,7 @@
> return (MR_bool) result;
> \
> } while (0)
>
> -#elif defined(__GNUC__) && defined(__i386__)
> +#elif defined(MR_GNUC) && defined(__i386__)
>
> /* Really 486 or better. */
> #define MR_COMPARE_AND_SWAP_WORD_BODY
> \
> @@ -208,7 +208,7 @@
>
> /*---------------------------------------------------------------------------*/
>
> -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && \
> +#if (MR_GNUC > 4 || (MR_GNUC == 4 && __GNUC_MINOR__ >= 1)) && \
> !defined(MR_AVOID_COMPILER_INTRINSICS)
>
> #define MR_ATOMIC_ADD_AND_FETCH_WORD_BODY
> \
> @@ -270,7 +270,7 @@
>
> /*---------------------------------------------------------------------------*/
>
> -#if defined(__GNUC__) && defined(__x86_64__) && \
> +#if defined(MR_GNUC) && defined(__x86_64__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> #define MR_ATOMIC_ADD_WORD_BODY
> \
> @@ -285,7 +285,7 @@
> #define MR_ATOMIC_ADD_INT_BODY MR_ATOMIC_ADD_WORD_BODY
> #define MR_ATOMIC_ADD_UINT_BODY MR_ATOMIC_ADD_WORD_BODY
>
> -#elif defined(__GNUC__) && defined(__i386__)
> +#elif defined(MR_GNUC) && defined(__i386__)
>
> #define MR_ATOMIC_ADD_WORD_BODY
> \
> do {
> \
> @@ -331,7 +331,7 @@
>
> /*---------------------------------------------------------------------------*/
>
> -#if defined(__GNUC__) && defined(__x86_64__) && \
> +#if defined(MR_GNUC) && defined(__x86_64__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> #define MR_ATOMIC_SUB_INT_BODY
> \
> @@ -343,7 +343,7 @@
> );
> \
> } while (0)
>
> -#elif defined(__GNUC__) && defined(__i386__)
> +#elif defined(MR_GNUC) && defined(__i386__)
>
> #define MR_ATOMIC_SUB_INT_BODY
> \
> do {
> \
> @@ -354,7 +354,7 @@
> );
> \
> } while (0)
>
> -#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
> +#elif MR_GNUC > 4 || (MR_GNUC == 4 && __GNUC_MINOR__ >= 1)
>
> #define MR_ATOMIC_SUB_INT_BODY
> \
> do {
> \
> @@ -373,7 +373,7 @@
>
> /*---------------------------------------------------------------------------*/
>
> -#if defined(__GNUC__) && defined(__x86_64__) && \
> +#if defined(MR_GNUC) && defined(__x86_64__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> #define MR_ATOMIC_INC_WORD_BODY
> \
> @@ -388,7 +388,7 @@
> #define MR_ATOMIC_INC_INT_BODY MR_ATOMIC_INC_WORD_BODY
> #define MR_ATOMIC_INC_UINT_BODY MR_ATOMIC_INC_WORD_BODY
>
> -#elif defined(__GNUC__) && defined(__i386__) && \
> +#elif defined(MR_GNUC) && defined(__i386__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> /* Really 486 or better. */
> @@ -438,7 +438,7 @@
>
> /*---------------------------------------------------------------------------*/
>
> -#if defined(__GNUC__) && defined(__x86_64__) && \
> +#if defined(MR_GNUC) && defined(__x86_64__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> #define MR_ATOMIC_DEC_INT_BODY
> \
> @@ -450,7 +450,7 @@
> );
> \
> } while (0)
>
> -#elif defined(__GNUC__) && defined(__i386__) && \
> +#elif defined(MR_GNUC) && defined(__i386__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> /* Really 486 or better. */
> @@ -486,7 +486,7 @@
> ** Note that on x86(_64) we have to use the sub instruction rather than the
> ** dec instruction because we need it to set the CPU flags.
> */
> -#if defined(__GNUC__) && defined(__x86_64__) && \
> +#if defined(MR_GNUC) && defined(__x86_64__) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> /*
> @@ -511,7 +511,7 @@
> #define MR_ATOMIC_DEC_AND_IS_ZERO_UINT_BODY \
> MR_ATOMIC_DEC_AND_IS_ZERO_WORD_BODY
>
> -#elif defined(__GNUC__) && defined(__i386__)
> +#elif defined(MR_GNUC) && defined(__i386__)
>
> #define MR_ATOMIC_DEC_AND_IS_ZERO_WORD_BODY
> \
> do {
> \
> @@ -529,7 +529,7 @@
> #define MR_ATOMIC_DEC_AND_IS_ZERO_UINT_BODY \
> MR_ATOMIC_DEC_AND_IS_ZERO_WORD_BODY
>
> -#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
> +#elif MR_GNUC > 4 || (MR_GNUC == 4 && __GNUC_MINOR__ >= 1)
>
> #define MR_ATOMIC_DEC_AND_IS_ZERO_WORD_BODY
> \
> do {
> \
> @@ -569,7 +569,7 @@
> /*
> ** Memory fence operations.
> */
> -#if defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) && \
> +#if defined(MR_GNUC) && ( defined(__i386__) || defined(__x86_64__) ) && \
> !defined(MR_AVOID_HANDWRITTEN_ASSEMBLER)
>
> /*
> @@ -598,7 +598,7 @@
> __asm__ __volatile__("mfence");
> \
> } while(0)
>
> -#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
> +#elif MR_GNUC > 4 || (MR_GNUC == 4 && __GNUC_MINOR__ >= 1)
>
> /*
> ** Our memory fences are better than GCC's. GCC only implements a full
> Index: runtime/mercury_bitmap.h
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_bitmap.h,v
> retrieving revision 1.4
> diff -u -r1.4 mercury_bitmap.h
> --- runtime/mercury_bitmap.h 20 May 2011 04:16:54 -0000 1.4
> +++ runtime/mercury_bitmap.h 27 Jul 2011 05:16:11 -0000
> @@ -55,7 +55,7 @@
>
> MR_Integer MR_bitmap_cmp(MR_ConstBitmapPtr, MR_ConstBitmapPtr);
>
> -#ifdef __GNUC__
> +#if defined(MR_GNUC)
> #define MR_bitmap_cmp(b1, b2) \
> ({ \
> MR_Integer bitmap_cmp_result; \
> @@ -111,7 +111,7 @@
>
> MR_Integer MR_hash_bitmap(MR_ConstBitmapPtr);
>
> -#ifdef __GNUC__
> +#if defined(MR_GNUC)
> #define MR_hash_bitmap(b) \
> ({ \
> MR_Integer hash_bitmap_result; \
> Index: runtime/mercury_conf_param.h
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_conf_param.h,v
> retrieving revision 1.118
> diff -u -r1.118 mercury_conf_param.h
> --- runtime/mercury_conf_param.h 20 May 2011 04:16:54 -0000 1.118
> +++ runtime/mercury_conf_param.h 27 Jul 2011 07:46:13 -0000
> @@ -1054,4 +1054,29 @@
>
> /*---------------------------------------------------------------------------*/
>
> +/*
> +** C compilers.
> +*/
> +
> +/*
> +** MR_CLANG -- The C compiler is clang.
> +**
> +** MR_GNUC -- The C compiler is GCC. We use this macro instead of __GNUC__
> +** since clang also defines __GNUC__.
> + The value of this macro gives the major version number.
> +**
> +** MR_MSVC -- The C compiler is Visual C.
> +** The value of this macro gives the version number.
> +*/
> +
> +#if defined(__clang__)
> + #define MR_CLANG __clang__
> +#elif defined(__GNUC__)
> + #define MR_GNUC __GNUC__
> +#elif defined(_MSC_VER)
> + #define MR_MSVC _MSC_VER
> +#endif
> +
> +/*---------------------------------------------------------------------------*/
> +
> #endif /* MERCURY_CONF_PARAM_H */
> Index: runtime/mercury_float.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_float.h,v
> retrieving revision 1.20
> diff -u -r1.20 mercury_float.h
> --- runtime/mercury_float.h 20 May 2011 04:16:54 -0000 1.20
> +++ runtime/mercury_float.h 27 Jul 2011 05:19:14 -0000
> @@ -65,7 +65,7 @@
> )
> #endif
>
> -#ifdef __GNUC__
> +#ifdef MR_GNUC
> #define MR_float_const(f) ({ static const MR_Float d = f; (MR_Word) &d; })
> #else
> #define MR_float_const(f) MR_float_to_word(f) /* inefficient */
> @@ -84,7 +84,7 @@
>
> #define MR_float_const(f) MR_float_to_word(f)
>
> - #ifdef __GNUC__
> + #ifdef MR_GNUC
>
> /* GNU C allows you to cast to a union type */
> #define MR_float_to_word(f) (__extension__ \
> @@ -92,14 +92,14 @@
> #define MR_word_to_float(w) (__extension__ \
> ((union MR_Float_Word)(MR_Word)(w)).f)
>
> - #else /* not __GNUC__ */
> + #else /* not MR_GNUC */
>
> static MR_Word MR_float_to_word(MR_Float f)
> { union MR_Float_Word tmp; tmp.f = f; return tmp.w; }
> static MR_Float MR_word_to_float(MR_Word w)
> { union MR_Float_Word tmp; tmp.w = w; return tmp.f; }
>
> - #endif /* not __GNUC__ */
> + #endif /* not MR_GNUC */
>
> #endif /* not MR_BOXED_FLOAT */
>
> Index: runtime/mercury_getopt.c
> ===================================================================
> RCS file:
> /home/mercury/mercury1/repository/mercury/runtime/mercury_getopt.c,v
> retrieving revision 1.3
> diff -u -r1.3 mercury_getopt.c
> --- runtime/mercury_getopt.c 5 Feb 2002 10:19:06 -0000 1.3
> +++ runtime/mercury_getopt.c 27 Jul 2011 05:19:46 -0000
> @@ -226,7 +226,7 @@
>
> /* If using GCC, we can safely declare strlen this way.
> If not using GCC, it is ok not to declare it. */
> -#ifdef __GNUC__
> +#ifdef MR_GNUC
> /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
> That was relevant to code that was here before. */
> #if !defined (__STDC__) || !__STDC__
> @@ -234,7 +234,7 @@
> and has done so at least since version 2.4.5. -- rms. */
> extern int strlen (const char *);
> #endif /* not __STDC__ */
> -#endif /* __GNUC__ */
> +#endif /* MR_GNUC */
>
> #endif /* not __GNU_LIBRARY__ */
>
> Index: runtime/mercury_goto.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_goto.h,v
> retrieving revision 1.56
> diff -u -r1.56 mercury_goto.h
> --- runtime/mercury_goto.h 8 Jul 2010 03:17:09 -0000 1.56
> +++ runtime/mercury_goto.h 27 Jul 2011 05:20:08 -0000
> @@ -770,7 +770,7 @@
>
> #if defined(MR_USE_GCC_NONLOCAL_GOTOS)
>
> - #ifndef __GNUC__
> + #ifndef MR_GNUC
> #error "You must use gcc if you define MR_USE_GCC_NONLOCAL_GOTOS"
> #endif
>
> @@ -845,7 +845,7 @@
> ** falls through. For older versions of gcc, we don't do this, since it
> ** adds significantly to the code size.
> */
> - #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 91)
> + #if MR_GNUC > 2 || (MR_GNUC == 2 && __GNUC_MINOR__ > 91)
> /* gcc version > egcs 1.1.2 */
> #define MR_BEGIN_MODULE(module_name) \
> MR_MODULE_STATIC_OR_EXTERN void module_name(void); \
> Index: runtime/mercury_heap.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_heap.h,v
> retrieving revision 1.43
> diff -u -r1.43 mercury_heap.h
> --- runtime/mercury_heap.h 20 May 2011 04:16:54 -0000 1.43
> +++ runtime/mercury_heap.h 27 Jul 2011 05:20:58 -0000
> @@ -139,7 +139,7 @@
> ** of words.
> */
>
> - #ifndef __GNUC__
> + #ifndef MR_GNUC
> /*
> ** Without the gcc extensions __builtin_constant_p() and ({...}),
> ** MR_INLINE_ALLOC would probably be a performance _loss_.
> Index: runtime/mercury_regs.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_regs.h,v
> retrieving revision 1.29
> diff -u -r1.29 mercury_regs.h
> --- runtime/mercury_regs.h 10 May 2007 05:24:16 -0000 1.29
> +++ runtime/mercury_regs.h 27 Jul 2011 07:38:28 -0000
> @@ -8,6 +8,13 @@
> #define MERCURY_REGS_H
>
> #include "mercury_conf.h"
> +/*
> +** NOTE: we need to include mercury_conf_param.h separately here since some
> +** of the tests in the configure script need MR_GNUC to be defined and
> +** mercury_conf.h might will not exist until *after* we have run the
> configure
> +** script has been run.
> +*/
> +#include "mercury_conf_param.h"
> #include "mercury_types.h"
>
> /*---------------------------------------------------------------------------*/
> @@ -19,7 +26,7 @@
> ** Similarly for comma expressions and conditional expressions.
> */
>
> -#ifdef __GNUC__
> +#ifdef MR_GNUC
> #define MR_LVALUE_CAST(type, lval) ((type)(lval))
> #define MR_LVALUE_SEQ(expr, lval) ((expr),(lval))
> #define MR_LVALUE_COND(expr, x, y) ((expr)?(x):(y))
> @@ -74,7 +81,7 @@
> ** The hardware description layer
> */
> #if defined(MR_USE_GCC_GLOBAL_REGISTERS)
> - #ifndef __GNUC__
> + #ifndef MR_GNUC
> #error "You must use gcc if you define MR_USE_GCC_GLOBAL_REGISTERS."
> #endif
>
> Index: runtime/mercury_std.h
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_std.h,v
> retrieving revision 1.32
> diff -u -r1.32 mercury_std.h
> --- runtime/mercury_std.h 12 Jul 2011 03:21:58 -0000 1.32
> +++ runtime/mercury_std.h 27 Jul 2011 05:22:10 -0000
> @@ -161,8 +161,8 @@
> #define MR_INLINE inline
> #define MR_EXTERN_INLINE inline
> #define MR_OUTLINE_DEFN(DECL,BODY)
> -#elif defined(__clang__)
> - /* clang: note that since clang also defines the macro __GNUC__
> +#elif defined(MR_CLANG)
> + /* clang: note that since clang also defines the macro MR_GNUC
> ** we must handle it before we handle the GCC case.
> ** XXX why don't the C99 definitions work for clang?
> */
> @@ -170,7 +170,7 @@
> #define MR_INLINE static
> #define MR_EXTERN_INLINE static
> #define MR_OUTLINE_DEFN(DECL,BODY)
> -#elif defined(__GNUC__) +#elif defined(MR_GNUC)
> /* GNU C */
> #define MR_STATIC_INLINE static __inline__
> #define MR_INLINE static __inline__
> @@ -194,7 +194,7 @@
>
> /* A macro for declaring functions that never return */
>
> -#if __GNUC__
> +#if MR_GNUC
> #define MR_NO_RETURN __attribute__((noreturn))
> #else
> #define MR_NO_RETURN
> @@ -229,7 +229,7 @@
> ** optimization is more likely to be important than squeezing the last 1%
> ** in performance.
> */
> -#if defined(MR_USE_REGPARM) && defined(__GNUC__) && defined(__i386__)
> +#if defined(MR_USE_REGPARM) && defined(MR_GNUC) && defined(__i386__)
> #define MR_CALL __attribute__((__stdcall__, __regparm__(2)))
> #else
> #define MR_CALL
>
> --------------------------------------------------------------------------
> mercury-reviews mailing list
> Post messages to: mercury-reviews at csse.unimelb.edu.au
> Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
> Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
> --------------------------------------------------------------------------
>
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to: mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions: mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the reviews
mailing list