Fix handling of printf format specifiers on MinGW

See: #446
pull/451/head
Jonathan G Rennison 2 years ago
parent aba8e88d8c
commit 60ed858707

@ -36,11 +36,11 @@
/* printf format specification for 32/64-bit addresses. */
#ifdef _M_AMD64
#define PRINTF_PTR "0x%016IX"
#define PRINTF_LOC "%.16IX"
#define PRINTF_PTR "0x%016" PRINTF_SIZEX_SUFFIX
#define PRINTF_LOC "%.16" PRINTF_SIZEX_SUFFIX
#else
#define PRINTF_PTR "0x%08X"
#define PRINTF_LOC "%.8IX"
#define PRINTF_PTR "0x%08" PRINTF_SIZEX_SUFFIX
#define PRINTF_LOC "%.8" PRINTF_SIZEX_SUFFIX
#endif
/**
@ -145,14 +145,14 @@ static const char *GetAccessViolationTypeString(uint type)
" Fault addr: " PRINTF_LOC "\n",
(uint) record->ExceptionInformation[0],
GetAccessViolationTypeString(record->ExceptionInformation[0]),
record->ExceptionInformation[1]
(size_t)record->ExceptionInformation[1]
);
} else {
for (uint i = 0; i < (uint) record->NumberParameters; i++) {
buffer += seprintf(buffer, last,
" Info %u: " PRINTF_LOC "\n",
i,
record->ExceptionInformation[i]
(size_t)record->ExceptionInformation[i]
);
}
}
@ -275,11 +275,11 @@ static char *PrintModuleInfo(char *output, const char *last, HMODULE mod)
buffer += seprintf(buffer, last, "Registers:\n");
#ifdef _M_AMD64
buffer += seprintf(buffer, last,
" RAX: %.16I64X RBX: %.16I64X RCX: %.16I64X RDX: %.16I64X\n"
" RSI: %.16I64X RDI: %.16I64X RBP: %.16I64X RSP: %.16I64X\n"
" R8: %.16I64X R9: %.16I64X R10: %.16I64X R11: %.16I64X\n"
" R12: %.16I64X R13: %.16I64X R14: %.16I64X R15: %.16I64X\n"
" RIP: %.16I64X EFLAGS: %.8lX\n",
" RAX: " PRINTF_LOC " RBX: " PRINTF_LOC " RCX: " PRINTF_LOC " RDX: " PRINTF_LOC "\n"
" RSI: " PRINTF_LOC " RDI: " PRINTF_LOC " RBP: " PRINTF_LOC " RSP: " PRINTF_LOC "\n"
" R8: " PRINTF_LOC " R9: " PRINTF_LOC " R10: " PRINTF_LOC " R11: " PRINTF_LOC "\n"
" R12: " PRINTF_LOC " R13: " PRINTF_LOC " R14: " PRINTF_LOC " R15: " PRINTF_LOC "\n"
" RIP: " PRINTF_LOC " EFLAGS: %.8lX\n",
ep->ContextRecord->Rax,
ep->ContextRecord->Rbx,
ep->ContextRecord->Rcx,
@ -317,14 +317,14 @@ static char *PrintModuleInfo(char *output, const char *last, HMODULE mod)
);
#elif defined(_M_ARM64)
buffer += seprintf(buffer, last,
" X0: %.16I64X X1: %.16I64X X2: %.16I64X X3: %.16I64X\n"
" X4: %.16I64X X5: %.16I64X X6: %.16I64X X7: %.16I64X\n"
" X8: %.16I64X X9: %.16I64X X10: %.16I64X X11: %.16I64X\n"
" X12: %.16I64X X13: %.16I64X X14: %.16I64X X15: %.16I64X\n"
" X16: %.16I64X X17: %.16I64X X18: %.16I64X X19: %.16I64X\n"
" X20: %.16I64X X21: %.16I64X X22: %.16I64X X23: %.16I64X\n"
" X24: %.16I64X X25: %.16I64X X26: %.16I64X X27: %.16I64X\n"
" X28: %.16I64X Fp: %.16I64X Lr: %.16I64X\n",
" X0: " PRINTF_LOC " X1: " PRINTF_LOC " X2: " PRINTF_LOC " X3: " PRINTF_LOC "\n"
" X4: " PRINTF_LOC " X5: " PRINTF_LOC " X6: " PRINTF_LOC " X7: " PRINTF_LOC "\n"
" X8: " PRINTF_LOC " X9: " PRINTF_LOC " X10: " PRINTF_LOC " X11: " PRINTF_LOC "\n"
" X12: " PRINTF_LOC " X13: " PRINTF_LOC " X14: " PRINTF_LOC " X15: " PRINTF_LOC "\n"
" X16: " PRINTF_LOC " X17: " PRINTF_LOC " X18: " PRINTF_LOC " X19: " PRINTF_LOC "\n"
" X20: " PRINTF_LOC " X21: " PRINTF_LOC " X22: " PRINTF_LOC " X23: " PRINTF_LOC "\n"
" X24: " PRINTF_LOC " X25: " PRINTF_LOC " X26: " PRINTF_LOC " X27: " PRINTF_LOC "\n"
" X28: " PRINTF_LOC " Fp: " PRINTF_LOC " Lr: " PRINTF_LOC "\n",
ep->ContextRecord->X0,
ep->ContextRecord->X1,
ep->ContextRecord->X2,
@ -514,7 +514,7 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c
/* Get symbol name and line info if possible. */
DWORD64 offset;
if (proc.pSymGetSymFromAddr64(hCur, frame.AddrPC.Offset, &offset, sym_info)) {
buffer += seprintf(buffer, last, " %s + %I64u", sym_info->Name, offset);
buffer += seprintf(buffer, last, " %s + " OTTD_PRINTF64U, sym_info->Name, offset);
DWORD line_offs;
IMAGEHLP_LINE64 line;
@ -544,7 +544,7 @@ char *CrashLogWindows::AppendDecodedStacktrace(char *buffer, const char *last) c
free(demangled);
#endif
if (symbol_ok && bfd_info.function_addr) {
buffer += seprintf(buffer, last, " + %I64u", frame.AddrPC.Offset - static_cast<DWORD64>(bfd_info.function_addr));
buffer += seprintf(buffer, last, " + " OTTD_PRINTF64U, frame.AddrPC.Offset - static_cast<DWORD64>(bfd_info.function_addr));
}
}
if (bfd_info.file_name != nullptr) {

@ -130,7 +130,11 @@
# define __int64 long long
/* Warn about functions using 'printf' format syntax. First argument determines which parameter
* is the format string, second argument is start of values passed to printf. */
#define WARN_FORMAT(string, args) __attribute__ ((format (printf, string, args)))
# if defined(__MINGW32__) && defined(__USE_MINGW_ANSI_STDIO)
# define WARN_FORMAT(string, args) __attribute__ ((format (__MINGW_PRINTF_FORMAT, string, args)))
# else
# define WARN_FORMAT(string, args) __attribute__ ((format (printf, string, args)))
# endif
#define WARN_TIME_FORMAT(string) __attribute__ ((format (strftime, string, 0)))
#define FINAL final
@ -300,13 +304,13 @@
#define PACK(type_dec) PACK_N(type_dec, 1)
/* MSVCRT of course has to have a different syntax for long long *sigh* */
#if defined(_MSC_VER) || defined(__MINGW32__)
#if defined(_MSC_VER) || (defined(__MINGW32__) && !defined(__USE_MINGW_ANSI_STDIO))
# define OTTD_PRINTF64 "%I64d"
# define OTTD_PRINTF64U "%I64u"
# define OTTD_PRINTFHEX64 "%I64X"
# define OTTD_PRINTFHEX64PAD "%016I64X"
# define OTTD_PRINTFHEX64_SUFFIX "I64X"
# define PRINTF_SIZE "%Iu"
# define PRINTF_SIZEX "%IX"
# define PRINTF_SIZEX_SUFFIX "IX"
#else
#if defined(PRId64)
# define OTTD_PRINTF64 "%" PRId64
@ -319,15 +323,16 @@
# define OTTD_PRINTF64U "%llu"
#endif
#if defined(PRIX64)
# define OTTD_PRINTFHEX64 "%" PRIX64
# define OTTD_PRINTFHEX64PAD "%016" PRIX64
# define OTTD_PRINTFHEX64_SUFFIX PRIX64
#else
# define OTTD_PRINTFHEX64 "%llX"
# define OTTD_PRINTFHEX64PAD "%016llX"
# define OTTD_PRINTFHEX64_SUFFIX "llX"
#endif
# define PRINTF_SIZE "%zu"
# define PRINTF_SIZEX "%zX"
# define PRINTF_SIZEX_SUFFIX "zX"
#endif
#define OTTD_PRINTFHEX64 "%" OTTD_PRINTFHEX64_SUFFIX
#define OTTD_PRINTFHEX64PAD "%016" OTTD_PRINTFHEX64_SUFFIX
typedef unsigned char byte;

Loading…
Cancel
Save