VM: debug macros FACTOR_PRINT and FACTOR_PRINT_MARK to make better debug

printing messages than just using std::cout
db4
Björn Lindqvist 2015-05-03 14:13:28 +02:00 committed by John Benediktsson
parent a195e361df
commit 9bfc43144e
7 changed files with 42 additions and 13 deletions

View File

@ -68,6 +68,7 @@ ifdef CONFIG
MASTER_HEADERS = $(PLAF_MASTER_HEADERS) \ MASTER_HEADERS = $(PLAF_MASTER_HEADERS) \
vm/assert.hpp \ vm/assert.hpp \
vm/debug.hpp \
vm/layouts.hpp \ vm/layouts.hpp \
vm/platform.hpp \ vm/platform.hpp \
vm/primitives.hpp \ vm/primitives.hpp \

View File

@ -48,7 +48,6 @@ struct context {
void reset_context_objects(); void reset_context_objects();
void reset(); void reset();
void fix_stacks(); void fix_stacks();
void scrub_stacks(gc_info* info, cell index);
cell peek() { return *(cell*)datastack; } cell peek() { return *(cell*)datastack; }

View File

@ -4,6 +4,8 @@ using namespace std;
namespace factor { namespace factor {
bool factor_print_p = true;
ostream& operator<<(ostream& out, const string* str) { ostream& operator<<(ostream& out, const string* str) {
for (cell i = 0; i < string_capacity(str); i++) for (cell i = 0; i < string_capacity(str); i++)
out << (char)str->data()[i]; out << (char)str->data()[i];

25
vm/debug.hpp Normal file
View File

@ -0,0 +1,25 @@
namespace factor {
extern bool factor_print_p;
}
#ifdef FACTOR_DEBUG
#define FACTOR_PRINT(x) \
do { \
if (factor_print_p) { \
std::cerr \
<< std::setw(28) << std::left << __FILE__ \
<< " " << std::setw(4) << std::right << __LINE__ \
<< " " << std::setw(20) << std::left << __FUNCTION__ \
<< " " << x \
<< std::endl; \
} \
} while (0)
#define FACTOR_PRINT_MARK FACTOR_PRINT("")
#else
#define FACTOR_PRINT(fmt, ...) ((void)0)
#define FACTOR_PRINT_MARK ((void)0)
#endif

View File

@ -169,9 +169,10 @@ cell factor_vm::inline_cache_miss(cell return_address_) {
bool tail_call_site = tail_call_site_p(return_address.value); bool tail_call_site = tail_call_site_p(return_address.value);
#ifdef PIC_DEBUG #ifdef PIC_DEBUG
std::cout << "Inline cache miss at " << (tail_call_site ? "tail" : "non-tail") FACTOR_PRINT("Inline cache miss at "
<< " call site 0x" << std::hex << return_address.value << std::dec << (tail_call_site ? "tail" : "non-tail")
<< std::endl; << " call site 0x" << std::hex << return_address.value
<< std::dec);
print_callstack(); print_callstack();
#endif #endif
@ -210,9 +211,9 @@ cell factor_vm::inline_cache_miss(cell return_address_) {
set_call_target(return_address.value, xt); set_call_target(return_address.value, xt);
#ifdef PIC_DEBUG #ifdef PIC_DEBUG
std::cout << "Updated " << (tail_call_site ? "tail" : "non-tail") FACTOR_PRINT("Updated " << (tail_call_site ? "tail" : "non-tail")
<< " call site 0x" << std::hex << return_address.value << std::dec << " call site 0x" << std::hex << return_address.value << std::dec
<< " with 0x" << std::hex << (cell)xt << std::dec << std::endl; << " with 0x" << std::hex << (cell)xt << std::dec);
print_callstack(); print_callstack();
#endif #endif
} }

View File

@ -87,6 +87,7 @@ namespace factor { struct factor_vm; }
/* Factor headers */ /* Factor headers */
#include "assert.hpp" #include "assert.hpp"
#include "debug.hpp"
#include "layouts.hpp" #include "layouts.hpp"
#include "platform.hpp" #include "platform.hpp"
#include "utilities.hpp" #include "utilities.hpp"

View File

@ -279,7 +279,7 @@ template <typename Fixup> struct call_frame_slot_visitor {
for (cell loc = 0; loc < count; loc++) { for (cell loc = 0; loc < count; loc++) {
if (bitmap_p(bitmap, base + loc)) { if (bitmap_p(bitmap, base + loc)) {
#ifdef DEBUG_GC_MAPS #ifdef DEBUG_GC_MAPS
std::cout << "scrubbing stack location " << loc << std::endl; FACTOR_PRINT("scrubbing stack location " << loc);
#endif #endif
*((cell*)stack - loc) = 0; *((cell*)stack - loc) = 0;
} }
@ -310,8 +310,8 @@ template <typename Fixup> struct call_frame_slot_visitor {
return; return;
#ifdef DEBUG_GC_MAPS #ifdef DEBUG_GC_MAPS
std::cout << "call frame code block " << compiled << " with offset " FACTOR_PRINT("call frame code block " << compiled << " with offset "
<< return_address << std::endl; << return_address);
#endif #endif
cell* stack_pointer = (cell*)frame_top; cell* stack_pointer = (cell*)frame_top;
uint8_t* bitmap = info->gc_info_bitmap(); uint8_t* bitmap = info->gc_info_bitmap();
@ -334,8 +334,8 @@ template <typename Fixup> struct call_frame_slot_visitor {
uint32_t base_pointer = info->lookup_base_pointer(callsite, spill_slot); uint32_t base_pointer = info->lookup_base_pointer(callsite, spill_slot);
if (base_pointer != (uint32_t)-1) { if (base_pointer != (uint32_t)-1) {
#ifdef DEBUG_GC_MAPS #ifdef DEBUG_GC_MAPS
std::cout << "visiting derived root " << spill_slot FACTOR_PRINT("visiting derived root " << spill_slot
<< " with base pointer " << base_pointer << std::endl; << " with base pointer " << base_pointer);
#endif #endif
stack_pointer[spill_slot] -= stack_pointer[base_pointer]; stack_pointer[spill_slot] -= stack_pointer[base_pointer];
} }
@ -347,7 +347,7 @@ template <typename Fixup> struct call_frame_slot_visitor {
for (cell spill_slot = 0; spill_slot < info->gc_root_count; spill_slot++) { for (cell spill_slot = 0; spill_slot < info->gc_root_count; spill_slot++) {
if (bitmap_p(bitmap, callsite_gc_roots + spill_slot)) { if (bitmap_p(bitmap, callsite_gc_roots + spill_slot)) {
#ifdef DEBUG_GC_MAPS #ifdef DEBUG_GC_MAPS
std::cout << "visiting GC root " << spill_slot << std::endl; FACTOR_PRINT("visiting GC root " << spill_slot);
#endif #endif
visitor->visit_handle(stack_pointer + spill_slot); visitor->visit_handle(stack_pointer + spill_slot);
} }