diff --git a/include/grub/list.h b/include/grub/list.h index eba1237..6e03492 100644 --- a/include/grub/list.h +++ b/include/grub/list.h @@ -41,7 +41,18 @@ void EXPORT_FUNC(grub_list_insert) (grub_list_t *head, grub_list_t item, /* This function doesn't exist, so if assertion is false for some reason, the linker would fail. */ +#ifdef APPLE_CC +/* This approach fails with Apple's gcc. Use grub_abort. */ +#include +static inline void * +grub_assert_fail (void) +{ + grub_abort (); + return 0; +} +#else extern void* grub_assert_fail (void); +#endif #define GRUB_FIELD_MATCH(ptr, type, field) \ ((char *) &(ptr)->field == (char *) &((type) (ptr))->field) diff --git a/include/grub/misc.h b/include/grub/misc.h index 5c8baa1..23e0ce6 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -40,8 +40,10 @@ char *EXPORT_FUNC(grub_strcat) (char *dest, const char *src); char *EXPORT_FUNC(grub_strncat) (char *dest, const char *src, int c); /* Prototypes for aliases. */ +#if !defined (GRUB_UTIL) || !defined (APPLE_CC) void *EXPORT_FUNC(memmove) (void *dest, const void *src, grub_size_t n); void *EXPORT_FUNC(memcpy) (void *dest, const void *src, grub_size_t n); +#endif int EXPORT_FUNC(grub_memcmp) (const void *s1, const void *s2, grub_size_t n); int EXPORT_FUNC(grub_strcmp) (const char *s1, const char *s2); diff --git a/kern/misc.c b/kern/misc.c index 4c71ca8..4b46c67 100644 --- a/kern/misc.c +++ b/kern/misc.c @@ -44,11 +44,23 @@ grub_memmove (void *dest, const void *src, grub_size_t n) return dest; } + +#ifndef APPLE_CC void *memmove (void *dest, const void *src, grub_size_t n) __attribute__ ((alias ("grub_memmove"))); /* GCC emits references to memcpy() for struct copies etc. */ void *memcpy (void *dest, const void *src, grub_size_t n) __attribute__ ((alias ("grub_memmove"))); +#else +void *memcpy (void *dest, const void *src, grub_size_t n) +{ + return grub_memmove (dest, src, n); +} +void *memmove (void *dest, const void *src, grub_size_t n) +{ + return grub_memmove (dest, src, n); +} +#endif char * grub_strcpy (char *dest, const char *src) @@ -134,7 +146,22 @@ grub_printf (const char *fmt, ...) return ret; } -#ifndef GRUB_UTIL +#if defined (APPLE_CC) && ! defined (GRUB_UTIL) +int +grub_err_printf (const char *fmt, ...) +{ + va_list ap; + int ret; + + va_start (ap, fmt); + ret = grub_vprintf (fmt, ap); + va_end (ap); + + return ret; +} +#endif + +#if ! defined (APPLE_CC) && ! defined (GRUB_UTIL) int grub_err_printf (const char *fmt, ...) __attribute__ ((alias("grub_printf"))); #endif @@ -185,8 +212,10 @@ grub_memcmp (const void *s1, const void *s2, grub_size_t n) return 0; } +#ifndef APPLE_CC int memcmp (const void *s1, const void *s2, grub_size_t n) __attribute__ ((alias ("grub_memcmp"))); +#endif int grub_strcmp (const char *s1, const char *s2) @@ -534,8 +563,10 @@ grub_memset (void *s, int c, grub_size_t n) return s; } +#ifndef APPLE_CC void *memset (void *s, int c, grub_size_t n) __attribute__ ((alias ("grub_memset"))); +#endif grub_size_t grub_strlen (const char *s) @@ -1066,8 +1097,11 @@ grub_abort (void) grub_exit (); } + +#ifndef APPLE_CC /* GCC emits references to abort(). */ void abort (void) __attribute__ ((alias ("grub_abort"))); +#endif #ifdef NEED_ENABLE_EXECUTE_STACK /* Some gcc versions generate a call to this function