From 5d64001c3630162f5d28f7c2081218d85fae4e74 Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sun, 29 Apr 2012 12:09:30 -0400 Subject: [PATCH] 64bit signed/unsigned integer support from the compiler if LONG_MAX != 0x7FFFFFFF --- gmqcc.h | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/gmqcc.h b/gmqcc.h index fc92d13..e0ae695 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -119,9 +119,25 @@ typedef long int32_t; typedef unsigned long uint32_t; - /* bail on 64 bit type! */ - typedef char int64_t; - typedef char uint64_t; + /* + * It's nearly impossible to figure out a 64bit type at + * this point without making assumptions about the build + * enviroment. So if clang or gcc is detected use some + * compiler builtins to create a 64 signed and unsigned + * type. + */ +# if defined(__GNUC__) || defined (__CLANG__) + typedef int int64_t __attribute__((__mode__(__DI__))); + typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); +# else + /* + * Incoorectly size the types so static assertions below will + * fail. There is no valid way to get a 64bit type at this point + * without making assumptions of too many things. + */ + typedef char int64_t; + typedef char uint64_t; +# endif #endif #ifdef _LP64 /* long pointer == 64 */ typedef unsigned long uintptr_t;