Resetting the builder arena. May be a bug or two here still.

This commit is contained in:
Ben Vanik 2013-12-29 23:43:36 -08:00
parent 63f11732a5
commit cd9172ed62
5 changed files with 32 additions and 1 deletions

View File

@ -35,6 +35,14 @@ void Arena::Reset() {
} }
} }
void Arena::DebugFill() {
auto chunk = head_chunk_;
while (chunk) {
memset(chunk->buffer, 0xCD, chunk->capacity);
chunk = chunk->next;
}
}
void* Arena::Alloc(size_t size) { void* Arena::Alloc(size_t size) {
if (active_chunk_) { if (active_chunk_) {
if (active_chunk_->capacity - active_chunk_->offset < size) { if (active_chunk_->capacity - active_chunk_->offset < size) {

View File

@ -22,6 +22,7 @@ public:
~Arena(); ~Arena();
void Reset(); void Reset();
void DebugFill();
void* Alloc(size_t size); void* Alloc(size_t size);
template<typename T> T* Alloc() { template<typename T> T* Alloc() {

View File

@ -69,9 +69,12 @@ int IVMAssembler::Assemble(
ctx.scratch_arena = &scratch_arena_; ctx.scratch_arena = &scratch_arena_;
ctx.label_ref_head = NULL; ctx.label_ref_head = NULL;
// Reset label tags as we use them.
builder->ResetLabelTags();
// Function prologue. // Function prologue.
Block* block = builder->first_block(); auto block = builder->first_block();
while (block) { while (block) {
Label* label = block->label_head; Label* label = block->label_head;
while (label) { while (label) {

View File

@ -42,6 +42,10 @@ void HIRBuilder::Reset() {
next_value_ordinal_ = 0; next_value_ordinal_ = 0;
block_head_ = block_tail_ = NULL; block_head_ = block_tail_ = NULL;
current_block_ = NULL; current_block_ = NULL;
#if XE_DEBUG
arena_->DebugFill();
#endif
arena_->Reset();
} }
int HIRBuilder::Finalize() { int HIRBuilder::Finalize() {
@ -319,6 +323,19 @@ void HIRBuilder::InsertLabel(Label* label, Instr* prev_instr) {
} }
} }
void HIRBuilder::ResetLabelTags() {
// TODO(benvanik): make this faster?
auto block = block_head_;
while (block) {
auto label = block->label_head;
while (label) {
label->tag = 0;
label = label->next;
}
block = block->next;
}
}
Block* HIRBuilder::AppendBlock() { Block* HIRBuilder::AppendBlock() {
Block* block = arena_->Alloc<Block>(); Block* block = arena_->Alloc<Block>();
block->arena = arena_; block->arena = arena_;

View File

@ -13,6 +13,7 @@
#include <alloy/core.h> #include <alloy/core.h>
#include <alloy/hir/block.h> #include <alloy/hir/block.h>
#include <alloy/hir/instr.h> #include <alloy/hir/instr.h>
#include <alloy/hir/label.h>
#include <alloy/hir/opcodes.h> #include <alloy/hir/opcodes.h>
#include <alloy/hir/value.h> #include <alloy/hir/value.h>
@ -47,6 +48,7 @@ public:
Label* NewLabel(); Label* NewLabel();
void MarkLabel(Label* label, Block* block = 0); void MarkLabel(Label* label, Block* block = 0);
void InsertLabel(Label* label, Instr* prev_instr); void InsertLabel(Label* label, Instr* prev_instr);
void ResetLabelTags();
// static allocations: // static allocations:
// Value* AllocStatic(size_t length); // Value* AllocStatic(size_t length);