cleanup, requires, namespacing to actually get it to work
This commit is contained in:
parent
5ad36bbd56
commit
2e6b90b12e
10
Gemfile
10
Gemfile
@ -1,10 +1,10 @@
|
|||||||
source "http://rubygems.org"
|
source "http://rubygems.org"
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "minitest", ">= 0"
|
gem "minitest"
|
||||||
gem "rdoc", "~> 3.12"
|
gem "rdoc", "~> 3.12"
|
||||||
gem "bundler", "~> 1.0"
|
gem "bundler"
|
||||||
gem "jeweler", "~> 2.0.1"
|
gem "jeweler"
|
||||||
gem "simplecov", ">= 0"
|
gem "simplecov"
|
||||||
gem "roodi", "~> 2.1.0"
|
gem "roodi"
|
||||||
end
|
end
|
||||||
|
72
Gemfile.lock
Normal file
72
Gemfile.lock
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
GEM
|
||||||
|
remote: http://rubygems.org/
|
||||||
|
specs:
|
||||||
|
addressable (2.3.6)
|
||||||
|
builder (3.2.2)
|
||||||
|
descendants_tracker (0.0.4)
|
||||||
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
|
docile (1.1.3)
|
||||||
|
faraday (0.9.0)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
git (1.2.6)
|
||||||
|
github_api (0.11.3)
|
||||||
|
addressable (~> 2.3)
|
||||||
|
descendants_tracker (~> 0.0.1)
|
||||||
|
faraday (~> 0.8, < 0.10)
|
||||||
|
hashie (>= 1.2)
|
||||||
|
multi_json (>= 1.7.5, < 2.0)
|
||||||
|
nokogiri (~> 1.6.0)
|
||||||
|
oauth2
|
||||||
|
hashie (2.1.1)
|
||||||
|
highline (1.6.21)
|
||||||
|
jeweler (2.0.1)
|
||||||
|
builder
|
||||||
|
bundler (>= 1.0)
|
||||||
|
git (>= 1.2.5)
|
||||||
|
github_api
|
||||||
|
highline (>= 1.6.15)
|
||||||
|
nokogiri (>= 1.5.10)
|
||||||
|
rake
|
||||||
|
rdoc
|
||||||
|
json (1.8.1)
|
||||||
|
jwt (0.1.11)
|
||||||
|
multi_json (>= 1.5)
|
||||||
|
mini_portile (0.5.3)
|
||||||
|
minitest (5.3.2)
|
||||||
|
multi_json (1.9.2)
|
||||||
|
multi_xml (0.5.5)
|
||||||
|
multipart-post (2.0.0)
|
||||||
|
nokogiri (1.6.1)
|
||||||
|
mini_portile (~> 0.5.0)
|
||||||
|
oauth2 (0.9.3)
|
||||||
|
faraday (>= 0.8, < 0.10)
|
||||||
|
jwt (~> 0.1.8)
|
||||||
|
multi_json (~> 1.3)
|
||||||
|
multi_xml (~> 0.5)
|
||||||
|
rack (~> 1.2)
|
||||||
|
rack (1.5.2)
|
||||||
|
rake (10.2.2)
|
||||||
|
rdoc (3.12.2)
|
||||||
|
json (~> 1.4)
|
||||||
|
roodi (2.1.0)
|
||||||
|
ruby_parser
|
||||||
|
ruby_parser (3.5.0)
|
||||||
|
sexp_processor (~> 4.1)
|
||||||
|
sexp_processor (4.4.3)
|
||||||
|
simplecov (0.8.2)
|
||||||
|
docile (~> 1.1.0)
|
||||||
|
multi_json
|
||||||
|
simplecov-html (~> 0.8.0)
|
||||||
|
simplecov-html (0.8.0)
|
||||||
|
thread_safe (0.3.3)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
bundler
|
||||||
|
jeweler
|
||||||
|
minitest
|
||||||
|
rdoc (~> 3.12)
|
||||||
|
roodi
|
||||||
|
simplecov
|
@ -1,4 +1,4 @@
|
|||||||
class Asm::ARM::AddrTableObject
|
class Asm::Arm::AddrTableObject
|
||||||
def initialize
|
def initialize
|
||||||
@table = []
|
@table = []
|
||||||
@const = []
|
@const = []
|
||||||
@ -21,8 +21,8 @@ class Asm::ARM::AddrTableObject
|
|||||||
@table.each do |pair|
|
@table.each do |pair|
|
||||||
target_label, here_label = *pair
|
target_label, here_label = *pair
|
||||||
here_label.assemble io, as
|
here_label.assemble io, as
|
||||||
as.add_relocation io.tell, target_label, Asm::ARM::R_ARM_ABS32,
|
as.add_relocation io.tell, target_label, Asm::Arm::R_ARM_ABS32,
|
||||||
Asm::ARM::Instruction::RelocHandler
|
Asm::Arm::Instruction::RelocHandler
|
||||||
io.write_uint32 0
|
io.write_uint32 0
|
||||||
end
|
end
|
||||||
@const.each do |pair|
|
@const.each do |pair|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
require_relative 'assembler'
|
require 'asm/assembler'
|
||||||
|
|
||||||
module Asm
|
module Asm
|
||||||
module Arm
|
module Arm
|
||||||
@ -17,7 +17,7 @@ module Asm
|
|||||||
# TODO actually find the closest somehow
|
# TODO actually find the closest somehow
|
||||||
def self.closest_addrtable(as)
|
def self.closest_addrtable(as)
|
||||||
as.objects.find do |obj|
|
as.objects.find do |obj|
|
||||||
obj.is_a?(Asm::ARM::AddrTableObject)
|
obj.is_a?(Asm::Arm::AddrTableObject)
|
||||||
end || (raise Asm::AssemblyError.new('could not find addrtable to use', nil))
|
end || (raise Asm::AssemblyError.new('could not find addrtable to use', nil))
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -49,6 +49,6 @@ module Asm
|
|||||||
raise 'unknown relocation type'
|
raise 'unknown relocation type'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ module Asm
|
|||||||
# ADDRESSING MODE 1
|
# ADDRESSING MODE 1
|
||||||
# Complete!
|
# Complete!
|
||||||
class BuilderA
|
class BuilderA
|
||||||
include Asm::ARM::InstructionTools
|
include Asm::Arm::InstructionTools
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@cond = 0b1110
|
@cond = 0b1110
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
|
require "asm/parser"
|
||||||
|
|
||||||
module Asm
|
module Asm
|
||||||
module Arm
|
module Arm
|
||||||
# ADDRESSING MODE 2
|
# ADDRESSING MODE 2
|
||||||
# Implemented: immediate offset with offset=0
|
# Implemented: immediate offset with offset=0
|
||||||
class BuilderB
|
class BuilderB
|
||||||
include Asm::ARM::InstructionTools
|
include Asm::Arm::InstructionTools
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@cond = 0b1110
|
@cond = 0b1110
|
||||||
@ -96,15 +98,15 @@ module Asm
|
|||||||
(pre_post_index << 12+4+4+1+1+1+1) | (i << 12+4+4+1+1+1+1+1) |
|
(pre_post_index << 12+4+4+1+1+1+1) | (i << 12+4+4+1+1+1+1+1) |
|
||||||
(inst_class << 12+4+4+1+1+1+1+1+1) | (cond << 12+4+4+1+1+1+1+1+1+2)
|
(inst_class << 12+4+4+1+1+1+1+1+1) | (cond << 12+4+4+1+1+1+1+1+1+2)
|
||||||
if (@use_addrtable_reloc)
|
if (@use_addrtable_reloc)
|
||||||
closest_addrtable = Asm::ARM.closest_addrtable(as)
|
closest_addrtable = Asm::Arm.closest_addrtable(as)
|
||||||
if (@addrtable_reloc_target.is_a?(Asm::Parser::LabelEquivAddrArgNode))
|
if (@addrtable_reloc_target.is_a?(Asm::Parser::LabelEquivAddrArgNode))
|
||||||
obj = ast_asm.object_for_label(@addrtable_reloc_target.label, inst)
|
obj = ast_asm.object_for_label(@addrtable_reloc_target.label, inst)
|
||||||
ref_label = closest_addrtable.add_label(obj)
|
ref_label = closest_addrtable.add_label(obj)
|
||||||
elsif (@addrtable_reloc_target.is_a?(Asm::Parser::NumEquivAddrArgNode))
|
elsif (@addrtable_reloc_target.is_a?(Asm::Parser::NumEquivAddrArgNode))
|
||||||
ref_label = closest_addrtable.add_const(@addrtable_reloc_target.value)
|
ref_label = closest_addrtable.add_const(@addrtable_reloc_target.value)
|
||||||
end
|
end
|
||||||
as.add_relocation io.tell, ref_label, Asm::ARM::R_ARM_PC12,
|
as.add_relocation io.tell, ref_label, Asm::Arm::R_ARM_PC12,
|
||||||
Asm::ARM::Instruction::RelocHandler
|
Asm::Arm::Instruction::RelocHandler
|
||||||
end
|
end
|
||||||
io.write_uint32 val
|
io.write_uint32 val
|
||||||
end
|
end
|
||||||
|
@ -2,11 +2,11 @@ module Asm
|
|||||||
module Arm
|
module Arm
|
||||||
# ADDRESSING MODE 4
|
# ADDRESSING MODE 4
|
||||||
class BuilderD
|
class BuilderD
|
||||||
include Asm::ARM::InstructionTools
|
include Asm::Arm::InstructionTools
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@cond = 0b1110
|
@cond = 0b1110
|
||||||
@inst_class = Asm::ARM::Instruction::OPC_STACK
|
@inst_class = Asm::Arm::Instruction::OPC_STACK
|
||||||
@pre_post_index = 0
|
@pre_post_index = 0
|
||||||
@up_down = 0
|
@up_down = 0
|
||||||
@s = 0
|
@s = 0
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
require_relative 'arm_assembler'
|
require 'asm/arm/arm_assembler'
|
||||||
require_relative 'parser'
|
require 'asm/arm/instruction'
|
||||||
|
require 'asm/label_object'
|
||||||
|
require 'asm/parser'
|
||||||
|
require 'stream_reader'
|
||||||
require 'stringio'
|
require 'stringio'
|
||||||
|
|
||||||
module Asm
|
module Asm
|
||||||
@ -51,7 +54,7 @@ module Asm
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
@asm.add_object Asm::ARM::Instruction.new(node)
|
@asm.add_object Asm::Arm::Instruction.new(node)
|
||||||
end
|
end
|
||||||
|
|
||||||
%w(adc add and bic eor orr rsb rsc sbc sub
|
%w(adc add and bic eor orr rsb rsc sbc sub
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
|
require "asm/arm/instruction_tools"
|
||||||
|
require "asm/arm/builder_a"
|
||||||
|
require "asm/arm/builder_b"
|
||||||
|
require "asm/arm/builder_d"
|
||||||
|
|
||||||
module Asm
|
module Asm
|
||||||
module Arm
|
module Arm
|
||||||
class Asm::ARM::Instruction
|
|
||||||
include Asm::ARM::InstructionTools
|
class Instruction
|
||||||
|
include InstructionTools
|
||||||
|
|
||||||
COND_POSTFIXES = Regexp.union(%w(eq ne cs cc mi pl vs vc hi ls ge lt gt le al)).source
|
COND_POSTFIXES = Regexp.union(%w(eq ne cs cc mi pl vs vc hi ls ge lt gt le al)).source
|
||||||
def initialize(node, ast_asm = nil)
|
def initialize(node, ast_asm = nil)
|
||||||
@ -63,7 +69,7 @@ module Asm
|
|||||||
:vs => 0b0110
|
:vs => 0b0110
|
||||||
}
|
}
|
||||||
|
|
||||||
RelocHandler = Asm::ARM.method(:write_resolved_relocation)
|
RelocHandler = Asm::Arm.method(:write_resolved_relocation)
|
||||||
|
|
||||||
def assemble(io, as)
|
def assemble(io, as)
|
||||||
s = @s ? 1 : 0
|
s = @s ? 1 : 0
|
||||||
@ -123,7 +129,7 @@ module Asm
|
|||||||
io << packed[0,3]
|
io << packed[0,3]
|
||||||
elsif (arg.is_a?(Asm::LabelObject) or arg.is_a?(Asm::Parser::LabelRefArgNode))
|
elsif (arg.is_a?(Asm::LabelObject) or arg.is_a?(Asm::Parser::LabelRefArgNode))
|
||||||
arg = @ast_asm.object_for_label(arg.label, self) if arg.is_a?(Asm::Parser::LabelRefArgNode)
|
arg = @ast_asm.object_for_label(arg.label, self) if arg.is_a?(Asm::Parser::LabelRefArgNode)
|
||||||
as.add_relocation(io.tell, arg, Asm::ARM::R_ARM_PC24, RelocHandler)
|
as.add_relocation(io.tell, arg, Asm::Arm::R_ARM_PC24, RelocHandler)
|
||||||
io << "\x00\x00\x00"
|
io << "\x00\x00\x00"
|
||||||
end
|
end
|
||||||
io.write_uint8 OPCODES[opcode] | (COND_BITS[@cond] << 4)
|
io.write_uint8 OPCODES[opcode] | (COND_BITS[@cond] << 4)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
module Asm
|
module Asm
|
||||||
module Arm
|
module Arm
|
||||||
module Asm::ARM::InstructionTools
|
module Asm::Arm::InstructionTools
|
||||||
def reg_ref(arg)
|
def reg_ref(arg)
|
||||||
if (not arg.is_a?(Asm::Parser::RegisterArgNode))
|
if (not arg.is_a?(Asm::Parser::RegisterArgNode))
|
||||||
raise Asm::AssemblyError.new('argument must be a register', arg)
|
raise Asm::AssemblyError.new('argument must be a register', arg)
|
||||||
|
@ -39,8 +39,8 @@ module Asm
|
|||||||
elsif (cmd.name == "asciz")
|
elsif (cmd.name == "asciz")
|
||||||
str = eval(cmd.value) + "\x00"
|
str = eval(cmd.value) + "\x00"
|
||||||
@asm.add_object Asm::DataObject.new(str)
|
@asm.add_object Asm::DataObject.new(str)
|
||||||
elsif (defined?(Asm::ARM) and cmd.name == 'addrtable')
|
elsif (defined?(Asm::Arm) and cmd.name == 'addrtable')
|
||||||
@asm.add_object Asm::ARM::AddrTableObject.new
|
@asm.add_object Asm::Arm::AddrTableObject.new
|
||||||
else
|
else
|
||||||
raise Asm::AssemblyError.new('unknown directive', cmd)
|
raise Asm::AssemblyError.new('unknown directive', cmd)
|
||||||
end
|
end
|
||||||
|
@ -86,7 +86,7 @@ module Asm
|
|||||||
case options.target
|
case options.target
|
||||||
when :arm
|
when :arm
|
||||||
require_relative 'arm_assembler.rb'
|
require_relative 'arm_assembler.rb'
|
||||||
as_module = Asm::ARM
|
as_module = Asm::Arm
|
||||||
as_target = Elf::Constants::TARGET_ARM
|
as_target = Elf::Constants::TARGET_ARM
|
||||||
when :ttk91
|
when :ttk91
|
||||||
require_relative 'ttk91_assembler.rb'
|
require_relative 'ttk91_assembler.rb'
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
require_relative 'str_scanner'
|
require_relative 'str_scanner'
|
||||||
|
|
||||||
module AS
|
module Asm
|
||||||
class ParseError < StandardError
|
class ParseError < StandardError
|
||||||
def initialize(message, s)
|
def initialize(message, s)
|
||||||
super(message)
|
super(message)
|
||||||
@ -10,9 +10,8 @@ module AS
|
|||||||
end
|
end
|
||||||
attr_reader :line, :column
|
attr_reader :line, :column
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
class Asm::Parser
|
class Parser
|
||||||
def initialize(str)
|
def initialize(str)
|
||||||
scanner = Asm::Scanner.new(str)
|
scanner = Asm::Scanner.new(str)
|
||||||
|
|
||||||
@ -264,6 +263,8 @@ class Asm::Parser
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
if (__FILE__ == $0)
|
if (__FILE__ == $0)
|
||||||
p Asm::Parser.parse ARGV[0]
|
p Asm::Parser.parse ARGV[0]
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
if (__FILE__ == $0)
|
if (__FILE__ == $0)
|
||||||
gen = Asm::ARMCodeGenerator.new
|
gen = Asm::ArmCodeGenerator.new
|
||||||
|
|
||||||
gen.instance_eval {
|
gen.instance_eval {
|
||||||
mov r0, 5
|
mov r0, 5
|
||||||
|
@ -8,7 +8,7 @@ end
|
|||||||
|
|
||||||
SimpleCov.configure do
|
SimpleCov.configure do
|
||||||
clean_filters
|
clean_filters
|
||||||
load_adapter 'test_frameworks'
|
load_profile 'test_frameworks'
|
||||||
end
|
end
|
||||||
|
|
||||||
ENV["COVERAGE"] && SimpleCov.start do
|
ENV["COVERAGE"] && SimpleCov.start do
|
||||||
@ -23,13 +23,9 @@ rescue Bundler::BundlerError => e
|
|||||||
$stderr.puts "Run `bundle install` to install missing gems"
|
$stderr.puts "Run `bundle install` to install missing gems"
|
||||||
exit e.status_code
|
exit e.status_code
|
||||||
end
|
end
|
||||||
require 'minitest/unit'
|
require "minitest/autorun"
|
||||||
|
|
||||||
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
||||||
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
||||||
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'test'))
|
||||||
|
|
||||||
require 'crystal'
|
require 'crystal'
|
||||||
|
|
||||||
class MiniTest::Unit::TestCase
|
|
||||||
end
|
|
||||||
|
|
||||||
MiniTest::Unit.autorun
|
|
||||||
|
Loading…
Reference in New Issue
Block a user