vm: don't flush instruction cache twice per code block on a major GC on PowerPC
							parent
							
								
									f212549a5f
								
							
						
					
					
						commit
						70dcecf61a
					
				| 
						 | 
				
			
			@ -38,7 +38,7 @@ void factor_vm::collect_aging()
 | 
			
		|||
		collector.trace_contexts();
 | 
			
		||||
		collector.trace_code_heap_roots(&code->points_to_aging);
 | 
			
		||||
		collector.cheneys_algorithm();
 | 
			
		||||
		update_dirty_code_blocks(&code->points_to_aging);
 | 
			
		||||
		update_code_heap_for_minor_gc(&code->points_to_aging);
 | 
			
		||||
 | 
			
		||||
		nursery.here = nursery.start;
 | 
			
		||||
		code->points_to_nursery.clear();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -356,6 +356,41 @@ void factor_vm::update_word_references(code_block *compiled)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* This runs after a full collection */
 | 
			
		||||
struct literal_and_word_references_updater {
 | 
			
		||||
	factor_vm *myvm;
 | 
			
		||||
 | 
			
		||||
	explicit literal_and_word_references_updater(factor_vm *myvm_) : myvm(myvm_) {}
 | 
			
		||||
 | 
			
		||||
	void operator()(relocation_entry rel, cell index, code_block *compiled)
 | 
			
		||||
	{
 | 
			
		||||
		relocation_type type = myvm->relocation_type_of(rel);
 | 
			
		||||
		switch(type)
 | 
			
		||||
		{
 | 
			
		||||
		case RT_IMMEDIATE:
 | 
			
		||||
		case RT_XT:
 | 
			
		||||
		case RT_XT_PIC:
 | 
			
		||||
		case RT_XT_PIC_TAIL:
 | 
			
		||||
			myvm->relocate_code_block_step(rel,index,compiled);
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void factor_vm::update_code_block_for_full_gc(code_block *compiled)
 | 
			
		||||
{
 | 
			
		||||
	if(code->needs_fixup_p(compiled))
 | 
			
		||||
		relocate_code_block(compiled);
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		literal_and_word_references_updater updater(this);
 | 
			
		||||
		iterate_relocations(compiled,updater);
 | 
			
		||||
		flush_icache_for(compiled);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void factor_vm::check_code_address(cell address)
 | 
			
		||||
{
 | 
			
		||||
#ifdef FACTOR_DEBUG
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,10 +97,12 @@ void full_collector::cheneys_algorithm()
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct full_updater {
 | 
			
		||||
/* After growing the heap, we have to perform a full relocation to update
 | 
			
		||||
references to card and deck arrays. */
 | 
			
		||||
struct after_growing_heap_updater {
 | 
			
		||||
	factor_vm *myvm;
 | 
			
		||||
 | 
			
		||||
	full_updater(factor_vm *myvm_) : myvm(myvm_) {}
 | 
			
		||||
	after_growing_heap_updater(factor_vm *myvm_) : myvm(myvm_) {}
 | 
			
		||||
 | 
			
		||||
	void operator()(heap_block *block)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -108,29 +110,29 @@ struct full_updater {
 | 
			
		|||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct literal_and_word_reference_updater {
 | 
			
		||||
/* After a full GC that did not grow the heap, we have to update references
 | 
			
		||||
to literals and other words. */
 | 
			
		||||
struct after_full_updater {
 | 
			
		||||
	factor_vm *myvm;
 | 
			
		||||
 | 
			
		||||
	literal_and_word_reference_updater(factor_vm *myvm_) : myvm(myvm_) {}
 | 
			
		||||
	after_full_updater(factor_vm *myvm_) : myvm(myvm_) {}
 | 
			
		||||
 | 
			
		||||
	void operator()(heap_block *block)
 | 
			
		||||
	{
 | 
			
		||||
		code_block *compiled = (code_block *)block;
 | 
			
		||||
		myvm->update_literal_references(compiled);
 | 
			
		||||
		myvm->update_word_references(compiled);
 | 
			
		||||
		myvm->update_code_block_for_full_gc((code_block *)block);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void factor_vm::free_unmarked_code_blocks(bool growing_data_heap)
 | 
			
		||||
void factor_vm::update_code_heap_for_full_gc(bool growing_data_heap)
 | 
			
		||||
{
 | 
			
		||||
	if(growing_data_heap)
 | 
			
		||||
	{
 | 
			
		||||
		full_updater updater(this);
 | 
			
		||||
		after_growing_heap_updater updater(this);
 | 
			
		||||
		code->free_unmarked(updater);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		literal_and_word_reference_updater updater(this);
 | 
			
		||||
		after_full_updater updater(this);
 | 
			
		||||
		code->free_unmarked(updater);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +162,7 @@ void factor_vm::collect_growing_heap(cell requested_bytes, bool trace_contexts_p
 | 
			
		|||
	data_heap *old = data;
 | 
			
		||||
	set_data_heap(data->grow(requested_bytes));
 | 
			
		||||
	collect_full_impl(trace_contexts_p);
 | 
			
		||||
	free_unmarked_code_blocks(true);
 | 
			
		||||
	update_code_heap_for_full_gc(true);
 | 
			
		||||
	delete old;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +171,7 @@ void factor_vm::collect_full(bool trace_contexts_p)
 | 
			
		|||
	std::swap(data->tenured,data->tenured_semispace);
 | 
			
		||||
	reset_generation(data->tenured);
 | 
			
		||||
	collect_full_impl(trace_contexts_p);
 | 
			
		||||
	free_unmarked_code_blocks(false);
 | 
			
		||||
	update_code_heap_for_full_gc(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ gc_state::gc_state(gc_op op_) : op(op_), start_time(current_micros()) {}
 | 
			
		|||
 | 
			
		||||
gc_state::~gc_state() {}
 | 
			
		||||
 | 
			
		||||
void factor_vm::update_dirty_code_blocks(std::set<code_block *> *remembered_set)
 | 
			
		||||
void factor_vm::update_code_heap_for_minor_gc(std::set<code_block *> *remembered_set)
 | 
			
		||||
{
 | 
			
		||||
	/* The youngest generation that any code block can now reference */
 | 
			
		||||
	std::set<code_block *>::const_iterator iter = remembered_set->begin();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ void factor_vm::collect_nursery()
 | 
			
		|||
		simple_unmarker(card_mark_mask));
 | 
			
		||||
	collector.trace_code_heap_roots(&code->points_to_nursery);
 | 
			
		||||
	collector.cheneys_algorithm();
 | 
			
		||||
	update_dirty_code_blocks(&code->points_to_nursery);
 | 
			
		||||
	update_code_heap_for_minor_gc(&code->points_to_nursery);
 | 
			
		||||
 | 
			
		||||
	nursery.here = nursery.start;
 | 
			
		||||
	code->points_to_nursery.clear();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ void factor_vm::collect_to_tenured()
 | 
			
		|||
		dummy_unmarker());
 | 
			
		||||
	collector.trace_code_heap_roots(&code->points_to_aging);
 | 
			
		||||
	collector.cheneys_algorithm();
 | 
			
		||||
	update_dirty_code_blocks(&code->points_to_aging);
 | 
			
		||||
	update_code_heap_for_minor_gc(&code->points_to_aging);
 | 
			
		||||
 | 
			
		||||
	nursery.here = nursery.start;
 | 
			
		||||
	reset_generation(data->aging);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,11 +234,11 @@ struct factor_vm
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// gc
 | 
			
		||||
	void update_dirty_code_blocks(std::set<code_block *> *remembered_set);
 | 
			
		||||
	void update_code_heap_for_minor_gc(std::set<code_block *> *remembered_set);
 | 
			
		||||
	void collect_nursery();
 | 
			
		||||
	void collect_aging();
 | 
			
		||||
	void collect_to_tenured();
 | 
			
		||||
	void free_unmarked_code_blocks(bool growing_data_heap);
 | 
			
		||||
	void update_code_heap_for_full_gc(bool growing_data_heap);
 | 
			
		||||
	void collect_full_impl(bool trace_contexts_p);
 | 
			
		||||
	void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
 | 
			
		||||
	void collect_full(bool trace_contexts_p);
 | 
			
		||||
| 
						 | 
				
			
			@ -479,6 +479,7 @@ struct factor_vm
 | 
			
		|||
	void update_literal_references(code_block *compiled);
 | 
			
		||||
	void relocate_code_block_step(relocation_entry rel, cell index, code_block *compiled);
 | 
			
		||||
	void update_word_references(code_block *compiled);
 | 
			
		||||
	void update_code_block_for_full_gc(code_block *compiled);
 | 
			
		||||
	void check_code_address(cell address);
 | 
			
		||||
	void relocate_code_block(code_block *compiled);
 | 
			
		||||
	void fixup_labels(array *labels, code_block *compiled);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue