summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vittorio Romeo <vittorio.romeo@outlook.com>2015-12-21 18:29:08 +0100
committer Vittorio Romeo <vittorio.romeo@outlook.com>2015-12-21 18:29:08 +0100
commitd5909d54de2bd5ffb8283fd1bfd4f211a843d9ce (patch)
tree60cb2d244f49ab1d879e51da16ee036a28b236f1
parentaa6d4d0b882c86dc5e55e0dcf68884c6a588797b (diff)
Modernize x86log.h and x86log.cpp:
* Use variadic template functions instead of `va_list` * In `x86log_mark_as_data` and `x86log_printf` * Add `noexcept` where appropriate/safe * Use `constexpr std::size_t` instead of macros for constants * Nest `nullptr` check to prevent useless check, add assertion * In `x86log_printf` * Move definitions of `log_comment`, `data_range_t`, `x86log_context` to `x86_log.h` from `x86_log.cpp` * Adapt usages of `x86log_printf` in `drcbex64.cpp` and `drcbex86.cpp`
-rw-r--r--src/devices/cpu/drcbex64.cpp2
-rw-r--r--src/devices/cpu/drcbex86.cpp2
-rw-r--r--src/devices/cpu/x86log.cpp120
-rw-r--r--src/devices/cpu/x86log.h126
4 files changed, 126 insertions, 124 deletions
diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp
index b14e4cd189d..5b2b2cb2eb5 100644
--- a/src/devices/cpu/drcbex64.cpp
+++ b/src/devices/cpu/drcbex64.cpp
@@ -680,7 +680,7 @@ void drcbe_x64::reset()
{
// output a note to the log
if (m_log != nullptr)
- x86log_printf(m_log, "\n\n===========\nCACHE RESET\n===========\n\n");
+ x86log_printf(m_log, "%s", "\n\n===========\nCACHE RESET\n===========\n\n");
// generate a little bit of glue code to set up the environment
drccodeptr *cachetop = m_cache.begin_codegen(500);
diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp
index 846d054bf14..625f702160f 100644
--- a/src/devices/cpu/drcbex86.cpp
+++ b/src/devices/cpu/drcbex86.cpp
@@ -594,7 +594,7 @@ void drcbe_x86::reset()
{
// output a note to the log
if (m_log != nullptr)
- x86log_printf(m_log, "\n\n===========\nCACHE RESET\n===========\n\n");
+ x86log_printf(m_log, "%s", "\n\n===========\nCACHE RESET\n===========\n\n");
// generate a little bit of glue code to set up the environment
drccodeptr *cachetop = m_cache.begin_codegen(500);
diff --git a/src/devices/cpu/x86log.cpp b/src/devices/cpu/x86log.cpp
index d709af981f3..19f5287283d 100644
--- a/src/devices/cpu/x86log.cpp
+++ b/src/devices/cpu/x86log.cpp
@@ -8,66 +8,18 @@
***************************************************************************/
+#include <cstdint>
+#include <cassert>
#include "emu.h"
#include "x86log.h"
/***************************************************************************
- CONSTANTS
-***************************************************************************/
-
-/* comment parameters */
-#define MAX_COMMENTS 4000
-#define MAX_DATA_RANGES 1000
-#define COMMENT_POOL_SIZE (MAX_COMMENTS * 40)
-
-
-
-/***************************************************************************
- TYPE DEFINITIONS
-***************************************************************************/
-
-/* code logging info */
-struct log_comment
-{
- x86code * base;
- const char * string;
-};
-
-
-/* data ranges */
-struct data_range_t
-{
- x86code * base;
- x86code * end;
- int size;
-};
-
-
-/* the code logging context */
-struct x86log_context
-{
- std::string filename; /* name of the file */
- FILE * file; /* file we are logging to */
-
- data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */
- int data_range_count; /* number of data ranges */
-
- log_comment comment_list[MAX_COMMENTS]; /* list of comments */
- int comment_count; /* number of live comments */
-
- char comment_pool[COMMENT_POOL_SIZE];/* string pool to hold comments */
- char * comment_pool_next; /* pointer to next string pool location */
-};
-
-
-
-/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
-static void reset_log(x86log_context *log);
+static void reset_log(x86log_context *log) noexcept;
extern int i386_dasm_one_ex(char *buffer, UINT64 eip, const UINT8 *oprom, int mode);
@@ -100,7 +52,7 @@ x86log_context *x86log_create_context(const char *filename)
x86log_free_context - release a context
-------------------------------------------------*/
-void x86log_free_context(x86log_context *log)
+void x86log_free_context(x86log_context *log) noexcept
{
/* close any open files */
if (log->file != nullptr)
@@ -112,46 +64,11 @@ void x86log_free_context(x86log_context *log)
/*-------------------------------------------------
- x86log_add_comment - add a comment associated
- with a given code pointer
--------------------------------------------------*/
-
-void x86log_add_comment(x86log_context *log, x86code *base, const char *format, ...)
-{
- char *string = log->comment_pool_next;
- log_comment *comment;
- va_list va;
-
- assert(log->comment_count < MAX_COMMENTS);
- assert(log->comment_pool_next + strlen(format) + 256 < log->comment_pool + COMMENT_POOL_SIZE);
-
- /* we assume comments are registered in order; enforce this */
- assert(log->comment_count == 0 || base >= log->comment_list[log->comment_count - 1].base);
-
- /* if we exceed the maxima, skip it */
- if (log->comment_count >= MAX_COMMENTS)
- return;
- if (log->comment_pool_next + strlen(format) + 256 >= log->comment_pool + COMMENT_POOL_SIZE)
- return;
-
- /* do the printf to the string pool */
- va_start(va, format);
- log->comment_pool_next += vsprintf(log->comment_pool_next, format, va) + 1;
- va_end(va);
-
- /* fill in the new comment */
- comment = &log->comment_list[log->comment_count++];
- comment->base = base;
- comment->string = string;
-}
-
-
-/*-------------------------------------------------
x86log_mark_as_data - mark a given range as
data for logging purposes
-------------------------------------------------*/
-void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size)
+void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size) noexcept
{
data_range_t *data;
@@ -258,31 +175,6 @@ void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *s
}
-/*-------------------------------------------------
- x86log_printf - manually printf information to
- the log file
--------------------------------------------------*/
-
-void x86log_printf(x86log_context *log, const char *format, ...)
-{
- va_list va;
-
- /* open the file, creating it if necessary */
- if (log->file == nullptr)
- log->file = fopen(log->filename.c_str(), "w");
- if (log->file == nullptr)
- return;
-
- /* do the printf */
- va_start(va, format);
- vfprintf(log->file, format, va);
- va_end(va);
-
- /* flush the file */
- fflush(log->file);
-}
-
-
/***************************************************************************
LOCAL FUNCTIONS
@@ -292,7 +184,7 @@ void x86log_printf(x86log_context *log, const char *format, ...)
reset_log - reset the state of the log
-------------------------------------------------*/
-static void reset_log(x86log_context *log)
+static void reset_log(x86log_context *log) noexcept
{
log->data_range_count = 0;
log->comment_count = 0;
diff --git a/src/devices/cpu/x86log.h b/src/devices/cpu/x86log.h
index 68ca2ec5257..82a8990b59e 100644
--- a/src/devices/cpu/x86log.h
+++ b/src/devices/cpu/x86log.h
@@ -13,14 +13,57 @@
#ifndef __X86LOG_H__
#define __X86LOG_H__
+#include <cstdint>
+#include <cassert>
#include "x86emit.h"
/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+/* comment parameters */
+constexpr int MAX_COMMENTS{4000};
+constexpr int MAX_DATA_RANGES{1000};
+constexpr int COMMENT_POOL_SIZE{MAX_COMMENTS * 40};
+
+
+/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
-struct x86log_context;
+/* code logging info */
+struct log_comment
+{
+ x86code* base;
+ const char* string;
+};
+
+
+/* data ranges */
+struct data_range_t
+{
+ x86code* base;
+ x86code* end;
+ int size;
+};
+
+
+/* the code logging context */
+struct x86log_context
+{
+ std::string filename; /* name of the file */
+ FILE* file; /* file we are logging to */
+
+ data_range_t data_range[MAX_DATA_RANGES]; /* list of data ranges */
+ int data_range_count; /* number of data ranges */
+
+ log_comment comment_list[MAX_COMMENTS]; /* list of comments */
+ int comment_count; /* number of live comments */
+
+ char comment_pool[COMMENT_POOL_SIZE]; /* string pool to hold comments */
+ char* comment_pool_next; /* pointer to next string pool location */
+};
@@ -29,22 +72,89 @@ struct x86log_context;
***************************************************************************/
/* create a new context */
-x86log_context *x86log_create_context(const char *filename);
+x86log_context* x86log_create_context(const char* filename);
/* release a context */
-void x86log_free_context(x86log_context *log);
+void x86log_free_context(x86log_context* log) noexcept;
/* add a comment associated with a given code pointer */
-void x86log_add_comment(x86log_context *log, x86code *base, const char *format, ...) ATTR_PRINTF(3,4);
+template <typename... Ts>
+inline void x86log_add_comment(
+ x86log_context* log, x86code* base, const char* format, Ts&&... xs);
/* mark a given range as data for logging purposes */
-void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int size);
+void x86log_mark_as_data(
+ x86log_context* log, x86code* base, x86code* end, int size) noexcept;
/* disassemble a range of code and reset accumulated information */
-void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *start, x86code *stop);
+void x86log_disasm_code_range(
+ x86log_context* log, const char* label, x86code* start, x86code* stop);
/* manually printf information to the log file */
-void x86log_printf(x86log_context *log, const char *format, ...) ATTR_PRINTF(2,3);
+template <typename... Ts>
+inline void x86log_printf(x86log_context* log, const char* format, Ts&&... xs);
+
+
+/*-------------------------------------------------
+ x86log_add_comment - add a comment associated
+ with a given code pointer
+-------------------------------------------------*/
+
+template <typename... Ts>
+inline void x86log_add_comment(
+ x86log_context* log, x86code* base, const char* format, Ts&&... xs)
+{
+ char* string = log->comment_pool_next;
+ log_comment* comment;
+
+ assert(log->comment_count < MAX_COMMENTS);
+ assert(log->comment_pool_next + strlen(format) + 256 <
+ log->comment_pool + COMMENT_POOL_SIZE);
+
+ /* we assume comments are registered in order; enforce this */
+ assert(log->comment_count == 0 ||
+ base >= log->comment_list[log->comment_count - 1].base);
+
+ /* if we exceed the maxima, skip it */
+ if(log->comment_count >= MAX_COMMENTS) return;
+ if(log->comment_pool_next + strlen(format) + 256 >=
+ log->comment_pool + COMMENT_POOL_SIZE)
+ return;
+
+ /* do the printf to the string pool */
+ log->comment_pool_next +=
+ sprintf(log->comment_pool_next, format, std::forward<Ts>(xs)...) + 1;
+
+ /* fill in the new comment */
+ comment = &log->comment_list[log->comment_count++];
+ comment->base = base;
+ comment->string = string;
+}
+
+
+/*-------------------------------------------------
+ x86log_printf - manually printf information to
+ the log file
+-------------------------------------------------*/
+
+template <typename... Ts>
+inline void x86log_printf(x86log_context* log, const char* format, Ts&&... xs)
+{
+ /* open the file, creating it if necessary */
+ if(log->file == nullptr)
+ {
+ log->file = fopen(log->filename.c_str(), "w");
+
+ if(log->file == nullptr) return;
+ }
+
+ assert(log->file != nullptr);
+
+ /* do the printf */
+ fprintf(log->file, format, std::forward<Ts>(xs)...);
+ /* flush the file */
+ fflush(log->file);
+}
-#endif /* __X86LOG_H__ */
+#endif /* __X86LOG_H__ */