diff options
author | darylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-09-01 21:56:45 +0000 |
---|---|---|
committer | darylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-09-01 21:56:45 +0000 |
commit | 5244f47e46709b22ecefcee8e52b6dc6170ed6c9 (patch) | |
tree | bdc5e498097d72ee19390d8f6cdfebe91fcf8c64 /StdLib/Include/sys | |
parent | b2824a8e1362b89285663e1ab9b88e9fbb4bc572 (diff) | |
download | edk2-platforms-5244f47e46709b22ecefcee8e52b6dc6170ed6c9.tar.xz |
StdLib: Fix build errors caused by differences between the minGW 4.3 and GCC 4.4 compilers.
There are several significant differences between the mingw32 (gcc 4.3.0 based) compiler and the GCC 4.4 and later compilers.
Mingw32 requires that types int, long, long long, unsigned { int, long, long long}, float, and double be the only types passed to va_arg(). This requires the programmer to ensure that va_arg is called with type int for arguments of any type with a size less-than or equal-to int. GCC 4.4 and later does not require this and performs the appropriate promotions for you.
Mingw32 uses 32-bit long in both ia32 and x64 mode. GCC 4.4 makes long a 64-bit value when in x64 mode.
Signed-off-by: darylm503
Reviewed-by: jcarsey
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12258 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'StdLib/Include/sys')
-rw-r--r-- | StdLib/Include/sys/EfiCdefs.h | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/StdLib/Include/sys/EfiCdefs.h b/StdLib/Include/sys/EfiCdefs.h index c3a2772bfc..812a495d95 100644 --- a/StdLib/Include/sys/EfiCdefs.h +++ b/StdLib/Include/sys/EfiCdefs.h @@ -102,6 +102,7 @@ //#define _EFI_WINT_MIN (0)
//#define _EFI_WINT_MAX (0xFFFF)
#define _EFI_PTRDIFF_T_ __PTRDIFF_TYPE__ /* ptr1 - ptr2 --- Must be same size as size_t */
+
#else
#define _EFI_SIZE_T_ UINTN /* sizeof() */
#define _EFI_WCHAR_T UINT16
@@ -338,13 +339,29 @@ extern int _fltused; // VC++ requires this if you use floating point. KEEP f #define _DIAGASSERT(e)
// Types used to replace long so that it will have constant length regardless of compiler.
-typedef INT32 EFI_LONG_T; // Equivalent to long in VS200?
-typedef UINT32 EFI_ULONG_T; // Equivalent to unsigned long in VS200?
-typedef INTN LONGN;
-typedef UINTN ULONGN;
-typedef INT32 LONG32;
+typedef INT32 LONG32;
typedef UINT32 ULONG32;
typedef INT64 LONG64;
typedef UINT64 ULONG64;
+typedef INT32 EFI_LONG_T;
+typedef UINT32 EFI_ULONG_T;
+
+/* These types reflect the compiler's size for long */
+#if defined(__GNUC__)
+ #if __GNUC_PREREQ__(4,4)
+ /* GCC 4.4 or later */
+ typedef INT64 LONGN;
+ typedef UINT64 ULONGN;
+ #else
+ /* minGW gcc variant */
+ typedef INT32 LONGN;
+ typedef UINT32 ULONGN;
+ #endif /* __GNUC_PREREQ__(4,4) */
+#else /* NOT GCC */
+ /* Microsoft or Intel compilers */
+ typedef INT32 LONGN;
+ typedef UINT32 ULONGN;
+#endif /* defined(__GNUC__) */
+
#endif /* _EFI_CDEFS_H */
|