void operator()(instruction_operand op) { code_block *compiled = op.parent_code_block(); cell old_offset = op.rel_offset() + (cell)compiled->entry_point() - code_offset; switch(op.rel_type()) { case RT_LITERAL: op.store_value(data_visitor.visit_pointer(op.load_value(old_offset))); break; case RT_ENTRY_POINT: case RT_ENTRY_POINT_PIC: case RT_ENTRY_POINT_PIC_TAIL: op.store_code_block(code_visitor(op.load_code_block(old_offset))); break; case RT_HERE: op.store_value(op.load_value(old_offset) + code_offset); break; case RT_UNTAGGED: break; default: parent->store_external_address(op); break; } }
void operator()(instruction_operand op) { switch(op.rel_type()) { case RT_LITERAL: op.store_value(next_literal()); break; case RT_XT: op.store_value(parent->compute_xt_address(next_literal())); break; case RT_XT_PIC: op.store_value(parent->compute_xt_pic_address(next_literal())); break; case RT_XT_PIC_TAIL: op.store_value(parent->compute_xt_pic_tail_address(next_literal())); break; case RT_HERE: op.store_value(parent->compute_here_address(next_literal(),op.rel_offset(),op.parent_code_block())); break; case RT_UNTAGGED: op.store_value(untag_fixnum(next_literal())); break; default: parent->store_external_address(op); break; } }
void operator()(instruction_operand op) { cell old_offset = op.rel_offset() + (cell)old_address->entry_point(); switch(op.rel_type()) { case RT_LITERAL: { cell value = op.load_value(old_offset); if(immediate_p(value)) op.store_value(value); else op.store_value(RETAG(fixup.fixup_data(untag<object>(value)),TAG(value))); break; } case RT_ENTRY_POINT: case RT_ENTRY_POINT_PIC: case RT_ENTRY_POINT_PIC_TAIL: case RT_HERE: { cell value = op.load_value(old_offset); cell offset = TAG(value); code_block *compiled = (code_block *)UNTAG(value); op.store_value((cell)fixup.fixup_code(compiled) + offset); break; } case RT_THIS: case RT_CARDS_OFFSET: case RT_DECKS_OFFSET: parent->store_external_address(op); break; default: op.store_value(op.load_value(old_offset)); break; } }