jump was written off the end of binary code, fixed
This commit is contained in:
parent
1c09d4202f
commit
be1bc63ff2
@ -29,7 +29,7 @@ module Elf
|
|||||||
next unless label.is_a?(Risc::Label)
|
next unless label.is_a?(Risc::Label)
|
||||||
add_symbol "#{type.name}@#{meth.name}:Label=#{label.name}" , Risc::Position.get(label).at
|
add_symbol "#{type.name}@#{meth.name}:Label=#{label.name}" , Risc::Position.get(label).at
|
||||||
end
|
end
|
||||||
meth.binary.each do |code|
|
meth.binary.each_block do |code|
|
||||||
label = "BinaryCode@#{Risc::Position.get(code).method.name}"
|
label = "BinaryCode@#{Risc::Position.get(code).method.name}"
|
||||||
add_symbol label , Risc::Position.get(code).at
|
add_symbol label , Risc::Position.get(code).at
|
||||||
end
|
end
|
||||||
|
@ -12,6 +12,17 @@ module Parfait
|
|||||||
2 * 4 # size of type (2, type+next) * word_size (4)
|
2 * 4 # size of type (2, type+next) * word_size (4)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#16 - 2 -1 , two instance variables and one for the jump
|
||||||
|
def self.data_length
|
||||||
|
13
|
||||||
|
end
|
||||||
|
def data_length
|
||||||
|
self.class.data_length
|
||||||
|
end
|
||||||
|
def byte_length
|
||||||
|
4*data_length
|
||||||
|
end
|
||||||
|
|
||||||
def initialize(total_size)
|
def initialize(total_size)
|
||||||
super()
|
super()
|
||||||
extend_to(total_size )
|
extend_to(total_size )
|
||||||
@ -32,7 +43,7 @@ module Parfait
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def each( &block )
|
def each_block( &block )
|
||||||
block.call( self )
|
block.call( self )
|
||||||
@next.each( &block ) if @next
|
@next.each( &block ) if @next
|
||||||
end
|
end
|
||||||
@ -41,20 +52,16 @@ module Parfait
|
|||||||
"BinaryCode #{Risc::Position.set?(self) ? Risc::Position.get(self): self.object_id.to_s(16)}"
|
"BinaryCode #{Risc::Position.set?(self) ? Risc::Position.get(self): self.object_id.to_s(16)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def each_word
|
def each_word( all = true)
|
||||||
index = 0
|
index = 0
|
||||||
while( index < data_length)
|
length = data_length
|
||||||
|
length += 1 if all
|
||||||
|
while( index < length)
|
||||||
yield get_word(index)
|
yield get_word(index)
|
||||||
index += 1
|
index += 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
#16 - 2 -1 , two instance variables and one for the jump
|
|
||||||
def data_length
|
|
||||||
13
|
|
||||||
end
|
|
||||||
def byte_length
|
|
||||||
4*data_length
|
|
||||||
end
|
|
||||||
def set_word(index , word)
|
def set_word(index , word)
|
||||||
raise "invalid index #{index}" if index < 0
|
raise "invalid index #{index}" if index < 0
|
||||||
if index > data_length
|
if index > data_length
|
||||||
@ -64,6 +71,9 @@ module Parfait
|
|||||||
end
|
end
|
||||||
set_internal_word(index + 2 , word)
|
set_internal_word(index + 2 , word)
|
||||||
end
|
end
|
||||||
|
def set_last(word)
|
||||||
|
set_word( data_length , word)
|
||||||
|
end
|
||||||
def get_word(index)
|
def get_word(index)
|
||||||
raise "invalid index #{index}" if index < 0
|
raise "invalid index #{index}" if index < 0
|
||||||
if index > data_length + 1
|
if index > data_length + 1
|
||||||
|
@ -33,7 +33,7 @@ module Risc
|
|||||||
@code = code
|
@code = code
|
||||||
end
|
end
|
||||||
def write_unsigned_int_32( bin )
|
def write_unsigned_int_32( bin )
|
||||||
@code.set_word( 14 , bin )
|
@code.set_last( bin )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -108,7 +108,7 @@ module Risc
|
|||||||
Position.set( first_method.binary , at , first_method)
|
Position.set( first_method.binary , at , first_method)
|
||||||
Position.set( first_method.cpu_instructions, at + Parfait::BinaryCode.offset , first_method.binary)
|
Position.set( first_method.cpu_instructions, at + Parfait::BinaryCode.offset , first_method.binary)
|
||||||
log.debug "Method #{first_method.name}:#{before.to_s(16)} len: #{(at - before).to_s(16)}"
|
log.debug "Method #{first_method.name}:#{before.to_s(16)} len: #{(at - before).to_s(16)}"
|
||||||
log.debug "Instructions #{first_method.cpu_instructions.object_id.to_s(16)}:#{(before+12).to_s(16)}"
|
log.debug "Instructions #{first_method.cpu_instructions.object_id.to_s(16)}:#{(before+Parfait::BinaryCode.offset).to_s(16)}"
|
||||||
at
|
at
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -33,8 +33,8 @@ module Risc
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
def reset_to(pos , ignored)
|
def reset_to(pos , ignored)
|
||||||
super(pos, ignored)
|
|
||||||
init(pos , ignored)
|
init(pos , ignored)
|
||||||
|
super(pos, ignored)
|
||||||
Position.log.debug "ResetCode (#{pos.to_s(16)}) #{code}"
|
Position.log.debug "ResetCode (#{pos.to_s(16)}) #{code}"
|
||||||
end
|
end
|
||||||
# insert a jump to the next instruction, at the last instruction
|
# insert a jump to the next instruction, at the last instruction
|
||||||
|
@ -24,7 +24,7 @@ module Risc
|
|||||||
end
|
end
|
||||||
def init(at, binary)
|
def init(at, binary)
|
||||||
return if at == 0 and binary.nil?
|
return if at == 0 and binary.nil?
|
||||||
raise "faux pas" if Position.get(instruction).at < Position.get(binary).at
|
raise "faux pas" if at < Position.get(binary).at
|
||||||
return unless @instruction.next
|
return unless @instruction.next
|
||||||
@binary = binary
|
@binary = binary
|
||||||
nekst = at + @instruction.byte_length
|
nekst = at + @instruction.byte_length
|
||||||
@ -43,8 +43,8 @@ module Risc
|
|||||||
end
|
end
|
||||||
|
|
||||||
def reset_to(pos , binary)
|
def reset_to(pos , binary)
|
||||||
super(pos , binary)
|
|
||||||
init(pos , binary)
|
init(pos , binary)
|
||||||
|
super(pos , binary)
|
||||||
Position.log.debug "ResetInstruction (#{pos.to_s(16)}) #{instruction}"
|
Position.log.debug "ResetInstruction (#{pos.to_s(16)}) #{instruction}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -162,7 +162,6 @@ module Risc
|
|||||||
code.each_word do |word|
|
code.each_word do |word|
|
||||||
@stream.write_unsigned_int_32( word || 0 )
|
@stream.write_unsigned_int_32( word || 0 )
|
||||||
end
|
end
|
||||||
write_ref_for( code.get_type )
|
|
||||||
log.debug "Code16 witten stream 0x#{@stream.length.to_s(16)}"
|
log.debug "Code16 witten stream 0x#{@stream.length.to_s(16)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -180,7 +179,7 @@ module Risc
|
|||||||
write_ref_for( string.get_type ) #ref
|
write_ref_for( string.get_type ) #ref
|
||||||
@stream.write_signed_int_32( str.length ) #int
|
@stream.write_signed_int_32( str.length ) #int
|
||||||
@stream.write str
|
@stream.write str
|
||||||
pad_after(str.length + 8 ) # type , length *4 == 12
|
pad_after(str.length + 8 ) # type , length
|
||||||
log.debug "String (0x#{string.length.to_s(16)}) stream 0x#{@stream.length.to_s(16)}"
|
log.debug "String (0x#{string.length.to_s(16)}) stream 0x#{@stream.length.to_s(16)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -80,17 +80,23 @@ module Parfait
|
|||||||
assert @code.next.next
|
assert @code.next.next
|
||||||
assert_nil @code.next.next.next
|
assert_nil @code.next.next.next
|
||||||
end
|
end
|
||||||
def test_each
|
def test_each_word
|
||||||
|
len = 0
|
||||||
|
@code.each_word(false){ len += 1}
|
||||||
|
assert_equal 13 , len
|
||||||
|
end
|
||||||
|
def test_each_word_all
|
||||||
len = 0
|
len = 0
|
||||||
@code.each_word{ len += 1}
|
@code.each_word{ len += 1}
|
||||||
assert_equal 13 , len
|
assert_equal 14 , len
|
||||||
end
|
end
|
||||||
def test_each_set
|
def test_each_set
|
||||||
(0..12).each{|i| @code.set_word(i,i)}
|
(0..12).each{|i| @code.set_word(i,i)}
|
||||||
all = []
|
all = []
|
||||||
@code.each_word{ |w| all << w}
|
@code.each_word(false){ |w| all << w}
|
||||||
assert_equal 0 , all.first
|
assert_equal 0 , all.first
|
||||||
assert_equal 12 , all.last
|
assert_equal 12 , all.last
|
||||||
|
assert_nil @code.next
|
||||||
end
|
end
|
||||||
def test_set_word
|
def test_set_word
|
||||||
assert_equal 1 , @code.set_word(1 , 1)
|
assert_equal 1 , @code.set_word(1 , 1)
|
||||||
@ -103,9 +109,21 @@ module Parfait
|
|||||||
@code.set_word(1 , 1)
|
@code.set_word(1 , 1)
|
||||||
assert_equal 1, @code.get_internal_word(@code.data_start + 1)
|
assert_equal 1, @code.get_internal_word(@code.data_start + 1)
|
||||||
end
|
end
|
||||||
|
def test_set_13
|
||||||
|
@code.set_word(13 , 1)
|
||||||
|
assert_nil @code.next
|
||||||
|
end
|
||||||
|
def test_set_last_no_extend
|
||||||
|
@code.set_last(1)
|
||||||
|
assert_nil @code.next
|
||||||
|
end
|
||||||
|
def test_set_last_and_get
|
||||||
|
@code.set_last(1)
|
||||||
|
assert_equal 1, @code.get_word(BinaryCode.data_length)
|
||||||
|
end
|
||||||
def test_has_each
|
def test_has_each
|
||||||
sum = 0
|
sum = 0
|
||||||
@code.each{ sum += 1}
|
@code.each_block{ sum += 1}
|
||||||
assert_equal sum , 1
|
assert_equal sum , 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -37,5 +37,13 @@ module Risc
|
|||||||
def test_cpu_label
|
def test_cpu_label
|
||||||
assert_equal Position::InstructionPosition , Position.get(@machine.cpu_init.first).class
|
assert_equal Position::InstructionPosition , Position.get(@machine.cpu_init.first).class
|
||||||
end
|
end
|
||||||
|
def test_first_binary_jump
|
||||||
|
bin = Parfait.object_space.get_init.binary
|
||||||
|
assert 0 != bin.get_word(14) , "index 0 is 0 #{bin.inspect}"
|
||||||
|
end
|
||||||
|
def test_second_binary_first
|
||||||
|
bin = Parfait.object_space.get_init.binary.next
|
||||||
|
assert 0 != bin.get_word(0) , "index 0 is 0 #{bin.inspect}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -40,10 +40,6 @@ module Risc
|
|||||||
word = Parfait::Word.new(12)
|
word = Parfait::Word.new(12)
|
||||||
assert_equal 32 , word.padded_length
|
assert_equal 32 , word.padded_length
|
||||||
end
|
end
|
||||||
def test_pos_arm
|
|
||||||
mov = Arm::ArmMachine.mov :r1, 128
|
|
||||||
Risc::Position.set(0,0)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user