remove link exception class

This commit is contained in:
Torsten Ruger
2018-05-08 20:22:04 +03:00
parent cf06642768
commit 7ca7e92dda
6 changed files with 5 additions and 44 deletions

View File

@ -67,7 +67,7 @@ module Arm
end
raise "Negatives not implemented #{right} " if right < 0
unless @extra
puts "RELINK M at #{Risc::Position.get(self)}"
#puts "RELINK M at #{Risc::Position.get(self)}"
@extra = 1
insert ArmMachine.add( to , to , 0 ) #noop that we change below
end

View File

@ -12,7 +12,6 @@ module Risc
end
# Go through and assemble all instructions.
# Assembly may cause LinkException, which is caught by caller
def assemble( instruction )
@index = 1
while(instruction)
@ -27,19 +26,4 @@ module Risc
end
end
# A LinkException is raised when the arm code can't fit a constant into _one_
# instruction. This is kind of unavoidable with arm.
#
# Off course the problem could be fixed without the exception, but the exception
# means all subsequent Instructions, including labels/jump targets move.
# Thus changing jump instructions to those labels.
# So the whole method has to be reassembled and (at least) the instructions beyond
# repositioned. Ie a non-local problem, and so the Exception.
#
# Note: In the future i hope to have a more flexible system, possibly with position
# listeners and change events. Because positions chaning is normal, not exceptional.
#
class LinkException < Exception
end
end

View File

@ -133,22 +133,6 @@ module Risc
# constant loads into one instruction.
#
def create_binary
not_ok = 1
while(not_ok)
begin
return do_create_binary
rescue LinkException
not_ok += 1
log.debug "Relink #{not_ok}"
position_code
end
end
end
# have to retry until it works. Unfortunately (FIXME) jumps can go be both
# directions, and so already assembled codes get wrong by moving/ inserting
# instructions. And we end up assmebling all code again :-(
def do_create_binary
objects.each do |id , method|
next unless method.is_a? Parfait::TypedMethod
writer = BinaryWriter.new(method.binary)

View File

@ -72,7 +72,7 @@ module Risc
def write_any( obj )
write_any_log( obj , "Write")
if @stream.length != Position.get(obj).at
raise "Write #{obj.class}:0x#{obj.object_id.to_s(16)} at 0x#{stream_position.to_s(16)} not #{Position.get(obj)}"
puts "Write #{obj.class}:0x#{obj.object_id.to_s(16)} at 0x#{stream_position.to_s(16)} not #{Position.get(obj)}"
end
write_any_out(obj)
write_any_log( obj , "Wrote")