From f36b9b544dd16070813782e8c566a9b9fa2a8e77 Mon Sep 17 00:00:00 2001 From: nyanpasu64 Date: Mon, 21 Feb 2022 21:15:43 -0800 Subject: [PATCH 1/4] Fix segfault on 64-bit LLP64 Windows builds There are many occurrences of unsigned long in codegen.h's function arguments. Changing g_getimmed and g_defdata makes `make` succeed without segfaulting. I don't know if it makes cc65 behave correctly in all cases, or if there are more unsigned long that need to be changed. --- src/cc65/codegen.c | 4 ++-- src/cc65/codegen.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc65/codegen.c b/src/cc65/codegen.c index 3a98f5e63..59be677fd 100644 --- a/src/cc65/codegen.c +++ b/src/cc65/codegen.c @@ -689,7 +689,7 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes) -void g_getimmed (unsigned Flags, unsigned long Val, long Offs) +void g_getimmed (unsigned Flags, uintptr_t Val, long Offs) /* Load a constant into the primary register */ { unsigned char B1, B2, B3, B4; @@ -4394,7 +4394,7 @@ void g_res (unsigned n) -void g_defdata (unsigned flags, unsigned long val, long offs) +void g_defdata (unsigned flags, uintptr_t val, long offs) /* Define data with the size given in flags */ { if (flags & CF_CONST) { diff --git a/src/cc65/codegen.h b/src/cc65/codegen.h index b0cf9858d..0a5384578 100644 --- a/src/cc65/codegen.h +++ b/src/cc65/codegen.h @@ -271,7 +271,7 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes); -void g_getimmed (unsigned Flags, unsigned long Val, long Offs); +void g_getimmed (unsigned Flags, uintptr_t Val, long Offs); /* Load a constant into the primary register */ void g_getstatic (unsigned Flags, uintptr_t Label, long Offs); @@ -461,7 +461,7 @@ void g_ge (unsigned flags, unsigned long val); void g_res (unsigned n); /* Reserve static storage, n bytes */ -void g_defdata (unsigned flags, unsigned long val, long offs); +void g_defdata (unsigned flags, uintptr_t val, long offs); /* Define data with the size given in flags */ void g_defbytes (const void* bytes, unsigned count); From 2feba696223537371b5f8ac853a653fddcdf7a6d Mon Sep 17 00:00:00 2001 From: nyanpasu64 Date: Sat, 5 Mar 2022 03:23:51 -0800 Subject: [PATCH 2/4] Remove broken inttypes.h src/common/inttypes.h is a shim to fix building cc65 on non-C99-compliant compilers missing inttypes.h (like VS2012 and earlier). The shim is actually incomplete and does not define the PRI... macros supplied by the actual compiler headers. Since we're planning to use those macros, delete this header so cc65's source files instead use host-supplied inttypes.h containing macro definitions. --- src/common.vcxproj | 1 - src/common/inttypes.h | 123 ------------------------------------------ 2 files changed, 124 deletions(-) delete mode 100644 src/common/inttypes.h diff --git a/src/common.vcxproj b/src/common.vcxproj index f7929df2b..df99fc4a9 100644 --- a/src/common.vcxproj +++ b/src/common.vcxproj @@ -74,7 +74,6 @@ - diff --git a/src/common/inttypes.h b/src/common/inttypes.h deleted file mode 100644 index 28ffb2cc5..000000000 --- a/src/common/inttypes.h +++ /dev/null @@ -1,123 +0,0 @@ -/*****************************************************************************/ -/* */ -/* inttypes.h */ -/* */ -/* Define integer types */ -/* */ -/* */ -/* */ -/* (C) 2004 Ullrich von Bassewitz */ -/* Roemerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ -/* */ -/* */ -/* This software is provided 'as-is', without any expressed or implied */ -/* warranty. In no event will the authors be held liable for any damages */ -/* arising from the use of this software. */ -/* */ -/* Permission is granted to anyone to use this software for any purpose, */ -/* including commercial applications, and to alter it and redistribute it */ -/* freely, subject to the following restrictions: */ -/* */ -/* 1. The origin of this software must not be misrepresented; you must not */ -/* claim that you wrote the original software. If you use this software */ -/* in a product, an acknowledgment in the product documentation would be */ -/* appreciated but is not required. */ -/* 2. Altered source versions must be plainly marked as such, and must not */ -/* be misrepresented as being the original software. */ -/* 3. This notice may not be removed or altered from any source */ -/* distribution. */ -/* */ -/*****************************************************************************/ - - - -#ifndef INTTYPES_H -#define INTTYPES_H - - - -/* If we have , include it; otherwise, adapt types from -** and define integer boundary constants. -** gcc and msvc don't define __STDC_VERSION__ without special flags, so check -** for them explicitly. Undefined symbols are replaced by zero; so, checks for -** defined(__GNUC__) and defined(_MSC_VER) aren't necessary. -*/ -#if (__STDC_VERSION__ >= 199901) || (__GNUC__ >= 3) || (_MSC_VER >= 1600) -#include -#else - -/* Assume that ptrdiff_t and size_t are wide enough to hold pointers. -** Assume that they are the widest type. -*/ -#include -#include - -typedef ptrdiff_t intptr_t; -typedef size_t uintptr_t; -typedef ptrdiff_t intmax_t; -typedef size_t uintmax_t; - -#define INT8_MAX (0x7F) -#define INT16_MAX (0x7FFF) -#define INT32_MAX (0x7FFFFFFF) - -#define INT8_MIN (-INT8_MAX - 1) -#define INT16_MIN (-INT16_MAX - 1) -#define INT32_MIN (-INT32_MAX - 1) - -#define UINT8_MAX (0xFF) -#define UINT16_MAX (0xFFFF) -#define UINT32_MAX (0xFFFFFFFF) - -#if UCHAR_MAX == UINT8_MAX -typedef unsigned char uint8_t; -#else -#error "No suitable type for uint8_t found." -#endif - -#if SCHAR_MIN == INT8_MIN && SCHAR_MAX == INT8_MAX -typedef signed char int8_t; -#else -#error "No suitable type for int8_t found." -#endif - -#if UINT_MAX == UINT16_MAX -typedef unsigned int uint16_t; -#elif USHRT_MAX == UINT16_MAX -typedef unsigned short uint16_t; -#else -#error "No suitable type for uint16_t found." -#endif - -#if INT_MIN == INT16_MIN && INT_MAX == INT16_MAX -typedef int int16_t; -#elif SHRT_MIN == INT16_MIN && SHRT_MAX == INT16_MAX -typedef short int16_t; -#else -#error "No suitable type for int16_t found." -#endif - -#if UINT_MAX == UINT32_MAX -typedef unsigned int uint32_t; -#elif ULONG_MAX == UINT32_MAX -typedef unsigned long uint32_t; -#else -#error "No suitable type for uint32_t found." -#endif - -#if INT_MIN == INT32_MIN && INT_MAX == INT32_MAX -typedef int int32_t; -#elif LONG_MIN == INT32_MIN && LONG_MAX == INT32_MAX -typedef long int32_t; -#else -#error "No suitable type for int32_t found." -#endif - -#endif - - - -/* End of inttypes.h */ -#endif From 3466abc60cb768db4b46444255e45fd5ea69faa8 Mon Sep 17 00:00:00 2001 From: nyanpasu64 Date: Sat, 5 Mar 2022 03:30:14 -0800 Subject: [PATCH 3/4] Fix format strings to properly format uintptr_t --- src/cc65/codegen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc65/codegen.c b/src/cc65/codegen.c index 59be677fd..4f737555c 100644 --- a/src/cc65/codegen.c +++ b/src/cc65/codegen.c @@ -4403,15 +4403,15 @@ void g_defdata (unsigned flags, uintptr_t val, long offs) switch (flags & CF_TYPEMASK) { case CF_CHAR: - AddDataLine ("\t.byte\t$%02lX", val & 0xFF); + AddDataLine ("\t.byte\t$%02"PRIXPTR, val & 0xFF); break; case CF_INT: - AddDataLine ("\t.word\t$%04lX", val & 0xFFFF); + AddDataLine ("\t.word\t$%04"PRIXPTR, val & 0xFFFF); break; case CF_LONG: - AddDataLine ("\t.dword\t$%08lX", val & 0xFFFFFFFF); + AddDataLine ("\t.dword\t$%08"PRIXPTR, val & 0xFFFFFFFF); break; default: From 9cb81f1410c768562c56c75e665b31bed4bdc055 Mon Sep 17 00:00:00 2001 From: nyanpasu64 Date: Sun, 6 Mar 2022 14:46:56 -0800 Subject: [PATCH 4/4] Replace #include "inttypes.h" with --- src/cc65/codegen.c | 2 +- src/cc65/codegen.h | 2 +- src/cc65/exprdesc.h | 2 +- src/common/xsprintf.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc65/codegen.c b/src/cc65/codegen.c index 4f737555c..5bfc6696b 100644 --- a/src/cc65/codegen.c +++ b/src/cc65/codegen.c @@ -33,6 +33,7 @@ +#include #include #include #include @@ -42,7 +43,6 @@ #include "addrsize.h" #include "check.h" #include "cpu.h" -#include "inttypes.h" #include "strbuf.h" #include "xmalloc.h" #include "xsprintf.h" diff --git a/src/cc65/codegen.h b/src/cc65/codegen.h index 0a5384578..1de71e7d3 100644 --- a/src/cc65/codegen.h +++ b/src/cc65/codegen.h @@ -37,10 +37,10 @@ #define CODEGEN_H +#include /* common */ #include "coll.h" -#include "inttypes.h" /* cc65 */ #include "segments.h" diff --git a/src/cc65/exprdesc.h b/src/cc65/exprdesc.h index a1487a0bd..13eb36e5e 100644 --- a/src/cc65/exprdesc.h +++ b/src/cc65/exprdesc.h @@ -38,12 +38,12 @@ +#include #include /* common */ #include "fp.h" #include "inline.h" -#include "inttypes.h" /* cc65 */ #include "asmcode.h" diff --git a/src/common/xsprintf.c b/src/common/xsprintf.c index a7d26d5ef..5994bb604 100644 --- a/src/common/xsprintf.c +++ b/src/common/xsprintf.c @@ -33,6 +33,7 @@ +#include #include #include #include @@ -41,7 +42,6 @@ /* common */ #include "chartype.h" #include "check.h" -#include "inttypes.h" #include "strbuf.h" #include "va_copy.h" #include "xsprintf.h"