diff --git a/.gitignore b/.gitignore index 05072d6..2144d3d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ /*.s /*.so /.gem_rbs_collection +/node_modules +/package*.json diff --git a/lib/vaporware.rb b/lib/vaporware.rb index 4629139..20ab3b5 100644 --- a/lib/vaporware.rb +++ b/lib/vaporware.rb @@ -1,4 +1,19 @@ # frozen_string_literal: true require_relative "vaporware/version" + +require_relative "vaporware/assembler" require_relative "vaporware/compiler" +require_relative "vaporware/linker" + +module Vaporware + module_function + def compile!(input:, assembler: "as", linker: "ld", output: "tmp", debug: false, compiler_options: ["-O0"], shared: false) + d = File.expand_path(output) + basename = "#{File.dirname(d)}/#{File.basename(d, ".*")}" + execf = "#{basename}#{File.extname(d)}" + compiler = Vaporware::Compiler.compile!(input:, output: basename + ".s", debug:, compiler_options:, shared:) + assembler = Vaporware::Assembler.assemble!(input: basename+".s", output: basename+".o", assembler:, debug:) + linker = Vaporware::Linker.link!(input: basename+".o", output: execf, linker:, debug:, shared:) + end +end diff --git a/lib/vaporware/compiler/assembler.rb b/lib/vaporware/assembler.rb similarity index 90% rename from lib/vaporware/compiler/assembler.rb rename to lib/vaporware/assembler.rb index df7be8e..a459d9c 100644 --- a/lib/vaporware/compiler/assembler.rb +++ b/lib/vaporware/assembler.rb @@ -5,13 +5,13 @@ require_relative "assembler/elf/sections" require_relative "assembler/elf/section_header" -class Vaporware::Compiler::Assembler +class Vaporware::Assembler GCC_ASSEMBLERS = ["gcc", "as"] CLANG_ASSEMBLERS = ["clang", "llvm"] ASSEMBLERS = GCC_ASSEMBLERS + CLANG_ASSEMBLERS class Error < StandardError; end - def self.assemble!(input, output = File.basename(input, ".*") + ".o", options = {}) = new(input:, output:, **options).assemble + def self.assemble!(input:, output: File.basename(input, ".*") + ".o", assembler: "as", debug: false) = new(input:, output:, assembler:, debug:).assemble def initialize(input:, output: File.basename(input, ".*") + ".o", assembler: "as", type: :relocatable, debug: false) @input, @output = input, output diff --git a/lib/vaporware/compiler/assembler/elf.rb b/lib/vaporware/assembler/elf.rb similarity index 98% rename from lib/vaporware/compiler/assembler/elf.rb rename to lib/vaporware/assembler/elf.rb index bc2b2df..f9b6640 100644 --- a/lib/vaporware/compiler/assembler/elf.rb +++ b/lib/vaporware/assembler/elf.rb @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler +class Vaporware::Assembler class ELF class Error < StandardError; end class Section; end diff --git a/lib/vaporware/compiler/assembler/elf/header.rb b/lib/vaporware/assembler/elf/header.rb similarity index 94% rename from lib/vaporware/compiler/assembler/elf/header.rb rename to lib/vaporware/assembler/elf/header.rb index ee2756c..e36ce9d 100644 --- a/lib/vaporware/compiler/assembler/elf/header.rb +++ b/lib/vaporware/assembler/elf/header.rb @@ -1,7 +1,7 @@ require_relative "../elf" -class Vaporware::Compiler::Assembler::ELF::Header - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Header + include Vaporware::Assembler::ELF::Utils IDENT = [0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00].freeze ELF_FILE_TYPE = { NONE: 0, REL: 1, EXEC: 2, DYN: 3, CORE: 4 }.freeze diff --git a/lib/vaporware/compiler/assembler/elf/section.rb b/lib/vaporware/assembler/elf/section.rb similarity index 71% rename from lib/vaporware/compiler/assembler/elf/section.rb rename to lib/vaporware/assembler/elf/section.rb index 57af7c3..82e5663 100644 --- a/lib/vaporware/compiler/assembler/elf/section.rb +++ b/lib/vaporware/assembler/elf/section.rb @@ -8,15 +8,15 @@ require_relative "section/shstrtab" require_relative "section_header" -class Vaporware::Compiler::Assembler::ELF::Section +class Vaporware::Assembler::ELF::Section attr_reader :header, :body, :name, :section_name def initialize(type:, options: {}) type_string = type.to_s.capitalize type_string = type_string.upcase if type_string == "Bss" @section_name = type_string.downcase @name = section_name == "null" ? "" : "\0.#{section_name}" - @header = Vaporware::Compiler::Assembler::ELF::SectionHeader.new.send("#{@section_name}!") - @body = Module.const_get("Vaporware::Compiler::Assembler::ELF::Section::#{type_string}").new(**options) + @header = Vaporware::Assembler::ELF::SectionHeader.new.send("#{@section_name}!") + @body = Module.const_get("Vaporware::Assembler::ELF::Section::#{type_string}").new(**options) end def name=(name) diff --git a/lib/vaporware/compiler/assembler/elf/section/bss.rb b/lib/vaporware/assembler/elf/section/bss.rb similarity index 58% rename from lib/vaporware/compiler/assembler/elf/section/bss.rb rename to lib/vaporware/assembler/elf/section/bss.rb index cc30d58..518ae1b 100644 --- a/lib/vaporware/compiler/assembler/elf/section/bss.rb +++ b/lib/vaporware/assembler/elf/section/bss.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::BSS - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::BSS + include Vaporware::Assembler::ELF::Utils def initialize(**opts) = nil def build = bytes.flatten.pack("C*") def set! = self diff --git a/lib/vaporware/compiler/assembler/elf/section/data.rb b/lib/vaporware/assembler/elf/section/data.rb similarity index 51% rename from lib/vaporware/compiler/assembler/elf/section/data.rb rename to lib/vaporware/assembler/elf/section/data.rb index 1b5b4c3..26e8b0c 100644 --- a/lib/vaporware/compiler/assembler/elf/section/data.rb +++ b/lib/vaporware/assembler/elf/section/data.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Data - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::Data + include Vaporware::Assembler::ELF::Utils def initialize(**opts) = nil def build = bytes.flatten.pack("C*") def set! = self diff --git a/lib/vaporware/compiler/assembler/elf/section/note.rb b/lib/vaporware/assembler/elf/section/note.rb similarity index 90% rename from lib/vaporware/compiler/assembler/elf/section/note.rb rename to lib/vaporware/assembler/elf/section/note.rb index f273ce1..af5804e 100644 --- a/lib/vaporware/compiler/assembler/elf/section/note.rb +++ b/lib/vaporware/assembler/elf/section/note.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Note - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::Note + include Vaporware::Assembler::ELF::Utils def self.gnu_property = new.gnu_property!.build def self.null = new.null!.build diff --git a/lib/vaporware/compiler/assembler/elf/section/null.rb b/lib/vaporware/assembler/elf/section/null.rb similarity index 51% rename from lib/vaporware/compiler/assembler/elf/section/null.rb rename to lib/vaporware/assembler/elf/section/null.rb index 3ff5c42..6173406 100644 --- a/lib/vaporware/compiler/assembler/elf/section/null.rb +++ b/lib/vaporware/assembler/elf/section/null.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Null - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::Null + include Vaporware::Assembler::ELF::Utils def initialize(**opts) = nil def build = bytes.flatten.pack("C*") def set! = self diff --git a/lib/vaporware/compiler/assembler/elf/section/shstrtab.rb b/lib/vaporware/assembler/elf/section/shstrtab.rb similarity index 55% rename from lib/vaporware/compiler/assembler/elf/section/shstrtab.rb rename to lib/vaporware/assembler/elf/section/shstrtab.rb index e5ec246..57a03b4 100644 --- a/lib/vaporware/compiler/assembler/elf/section/shstrtab.rb +++ b/lib/vaporware/assembler/elf/section/shstrtab.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Shstrtab - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::Shstrtab + include Vaporware::Assembler::ELF::Utils def initialize(**opts) = @name = [] def build = bytes.flatten.pack("C*") def set!(name:) = (@name << name!(name); self) @@ -11,12 +11,12 @@ def name!(name) when String (name.match(/\A\0\..+\z/) ? name : "\0.#{name}").bytes when Array - raise Vaporware::Compiler::Assembler::ELF::Error, "unaccepted type in Array" unless name.all? { |elem| elem.is_a?(Integer) } + raise Vaporware::Assembler::ELF::Error, "unaccepted type in Array" unless name.all? { |elem| elem.is_a?(Integer) } n = name n.unshift(0) && n.push(0) unless n.first == 0 && n.last == 0 n else - raise Vaporware::Compiler::Assembler::ELF::Error, "unsupported type" + raise Vaporware::Assembler::ELF::Error, "unsupported type" end end end diff --git a/lib/vaporware/assembler/elf/section/strtab.rb b/lib/vaporware/assembler/elf/section/strtab.rb new file mode 100644 index 0000000..e093db0 --- /dev/null +++ b/lib/vaporware/assembler/elf/section/strtab.rb @@ -0,0 +1,5 @@ +class Vaporware::Assembler::ELF::Section::Strtab + include Vaporware::Assembler::ELF::Utils + def initialize(names = "\0main\0", **opts) = @names = names + def build = @names.bytes.pack("C*") +end diff --git a/lib/vaporware/compiler/assembler/elf/section/symtab.rb b/lib/vaporware/assembler/elf/section/symtab.rb similarity index 89% rename from lib/vaporware/compiler/assembler/elf/section/symtab.rb rename to lib/vaporware/assembler/elf/section/symtab.rb index faf9b88..e1fa26a 100644 --- a/lib/vaporware/compiler/assembler/elf/section/symtab.rb +++ b/lib/vaporware/assembler/elf/section/symtab.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Symtab - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::Section::Symtab + include Vaporware::Assembler::ELF::Utils def initialize(**opts) @entsize = [] @name = num2bytes(0, 4) diff --git a/lib/vaporware/compiler/assembler/elf/section/text.rb b/lib/vaporware/assembler/elf/section/text.rb similarity index 93% rename from lib/vaporware/compiler/assembler/elf/section/text.rb rename to lib/vaporware/assembler/elf/section/text.rb index 773d776..25cd2be 100644 --- a/lib/vaporware/compiler/assembler/elf/section/text.rb +++ b/lib/vaporware/assembler/elf/section/text.rb @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Text +class Vaporware::Assembler::ELF::Section::Text PREFIX = { REX_W: 0x48, }.freeze @@ -55,7 +55,7 @@ def opecode(op, *operands) when "ret" [0xc3] else - raise Vaporware::Compiler::Assembler::ELF::Error, "yet implemented operations: #{op}" + raise Vaporware::Assembler::ELF::Error, "yet implemented operations: #{op}" end end @@ -177,7 +177,7 @@ def reg(r) when /\d+/ r.to_i(16) else - raise Vaporware::Compiler::Assembler::ELF::Error, "yet implemented operand address: #{r}" + raise Vaporware::Assembler::ELF::Error, "yet implemented operand address: #{r}" end end def immediate(operand) = [operand.to_i(16)].pack("L").unpack("C*") diff --git a/lib/vaporware/compiler/assembler/elf/section_header.rb b/lib/vaporware/assembler/elf/section_header.rb similarity index 94% rename from lib/vaporware/compiler/assembler/elf/section_header.rb rename to lib/vaporware/assembler/elf/section_header.rb index 6134ec9..7b72f35 100644 --- a/lib/vaporware/compiler/assembler/elf/section_header.rb +++ b/lib/vaporware/assembler/elf/section_header.rb @@ -1,5 +1,5 @@ -class Vaporware::Compiler::Assembler::ELF::SectionHeader - include Vaporware::Compiler::Assembler::ELF::Utils +class Vaporware::Assembler::ELF::SectionHeader + include Vaporware::Assembler::ELF::Utils def initialize @name = nil @type = nil diff --git a/lib/vaporware/assembler/elf/sections.rb b/lib/vaporware/assembler/elf/sections.rb new file mode 100644 index 0000000..79c30b6 --- /dev/null +++ b/lib/vaporware/assembler/elf/sections.rb @@ -0,0 +1,19 @@ +require_relative "section" + +class Vaporware::Assembler::ELF::Sections + ATTRIBUTES = %i|null text data bss note symtab strtab shstrtab| + attr_reader *ATTRIBUTES + + def initialize + @null = Vaporware::Assembler::ELF::Section.new(type: :null) + @text = Vaporware::Assembler::ELF::Section.new(type: :text) + @data = Vaporware::Assembler::ELF::Section.new(type: :data) + @bss = Vaporware::Assembler::ELF::Section.new(type: :bss) + @note = Vaporware::Assembler::ELF::Section.new(type: :note, options: {type: :gnu}) + @symtab = Vaporware::Assembler::ELF::Section.new(type: :symtab) + @strtab = Vaporware::Assembler::ELF::Section.new(type: :strtab) + @shstrtab = Vaporware::Assembler::ELF::Section.new(type: :shstrtab) + end + + def each(&block) = ATTRIBUTES.each { |t| yield send(t) } +end diff --git a/lib/vaporware/compiler/assembler/elf/utils.rb b/lib/vaporware/assembler/elf/utils.rb similarity index 70% rename from lib/vaporware/compiler/assembler/elf/utils.rb rename to lib/vaporware/assembler/elf/utils.rb index 503f56b..f6b1e6e 100644 --- a/lib/vaporware/compiler/assembler/elf/utils.rb +++ b/lib/vaporware/assembler/elf/utils.rb @@ -1,7 +1,7 @@ -module Vaporware::Compiler::Assembler::ELF::Utils +module Vaporware::Assembler::ELF::Utils def build = (build_errors; bytes.flatten.pack("C*")) def size = build.bytesize - def set! = (raise Vaporware::Compiler::Assembler::ELF::Error, "should be implementing #{self.class}") + def set! = (raise Vaporware::Assembler::ELF::Error, "should be implementing #{self.class}") def empties = must_be_filled_section_fields private @@ -9,7 +9,7 @@ def align(val, bytes) val << 0 until val.size % bytes == 0 val end - def bytes = (raise Vaporware::Compiler::Assembler::ELF::Error, "should be implementing #{self.class}") + def bytes = (raise Vaporware::Assembler::ELF::Error, "should be implementing #{self.class}") def must_be_filled_section_fields = instance_variables.reject { |i| instance_variable_get(i) } def num2bytes(val, bytes) = hexas(val, bytes).reverse def check(val, bytes) = ((val.is_a?(Array) && val.all? { |v| v.is_a?(Integer) } && val.size == bytes) || (val.is_a?(Integer) && (hexas(val, bytes).size == bytes))) @@ -18,6 +18,6 @@ def build_errors return unless bytes.any?(&:nil?) errors = [] bytes.each_with_index { |v, idx| errors << instance_variables[idx] if v.nil? } - raise Vaporware::Compiler::Assembler::ELF::Error, "unaccepted types: #{errors.join(",")}" + raise Vaporware::Assembler::ELF::Error, "unaccepted types: #{errors.join(",")}" end end diff --git a/lib/vaporware/compiler.rb b/lib/vaporware/compiler.rb index 5ee940a..617435f 100644 --- a/lib/vaporware/compiler.rb +++ b/lib/vaporware/compiler.rb @@ -1,26 +1,17 @@ # frozen_string_literal: true require_relative "compiler/generator" -require_relative "compiler/assembler" -require_relative "compiler/linker" class Vaporware::Compiler attr_reader *%i(generator assembler linker) - def self.compile(source, assembler: "as", linker: "ld", dest: "tmp", debug: false, compiler_options: ["-O0"], shared: false) - compiler = new(input: source, output: dest, debug:, shared:, linker:, assembler:) + def self.compile!(input:, output: "tmp.s", debug: false, compiler_options: ["-O0"], shared: false) + compiler = new(input:, output:, debug:, shared:,) compiler.compile(compiler_options:) - compiler.assemble(input: dest.to_s + ".s", assembler:, debug:) - compiler.link end - def initialize(input:, output: File.basename(input, ".*"), linker: "ld", assembler: "as", debug: false, shared: false) - @generator = Vaporware::Compiler::Generator.new(input:, output: output + ".s", debug:, shared:) - @assembler = Vaporware::Compiler::Assembler.new(input: @generator.precompile, output: output + ".o", assembler:, debug:) - @linker = Vaporware::Compiler::Linker.new(input: @assembler.obj_file, output:, linker:, debug:, shared:) + def initialize(input:, output:, debug: false, shared: false) + @generator = Vaporware::Compiler::Generator.new(input:, output:, debug:, shared:) end - - def assemble(input:, output: File.basename(input, ".*") + ".o", assembler: "as", assembler_options: [], debug: false) = @assembler.assemble(input:, output:, assembler:, assembler_options:, debug:) - def link = @linker.link def compile(compiler_options: ["-O0"]) = @generator.compile end diff --git a/lib/vaporware/compiler/assembler/elf/section/strtab.rb b/lib/vaporware/compiler/assembler/elf/section/strtab.rb deleted file mode 100644 index eb57289..0000000 --- a/lib/vaporware/compiler/assembler/elf/section/strtab.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Strtab - include Vaporware::Compiler::Assembler::ELF::Utils - def initialize(names = "\0main\0", **opts) = @names = names - def build = @names.bytes.pack("C*") -end diff --git a/lib/vaporware/compiler/assembler/elf/sections.rb b/lib/vaporware/compiler/assembler/elf/sections.rb deleted file mode 100644 index d4d6962..0000000 --- a/lib/vaporware/compiler/assembler/elf/sections.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative "section" - -class Vaporware::Compiler::Assembler::ELF::Sections - ATTRIBUTES = %i|null text data bss note symtab strtab shstrtab| - attr_reader *ATTRIBUTES - - def initialize - @null = Vaporware::Compiler::Assembler::ELF::Section.new(type: :null) - @text = Vaporware::Compiler::Assembler::ELF::Section.new(type: :text) - @data = Vaporware::Compiler::Assembler::ELF::Section.new(type: :data) - @bss = Vaporware::Compiler::Assembler::ELF::Section.new(type: :bss) - @note = Vaporware::Compiler::Assembler::ELF::Section.new(type: :note, options: {type: :gnu}) - @symtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :symtab) - @strtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :strtab) - @shstrtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :shstrtab) - end - - def each(&block) = ATTRIBUTES.each { |t| yield send(t) } -end diff --git a/lib/vaporware/compiler/linker.rb b/lib/vaporware/linker.rb similarity index 88% rename from lib/vaporware/compiler/linker.rb rename to lib/vaporware/linker.rb index 2c436e5..df1880e 100644 --- a/lib/vaporware/compiler/linker.rb +++ b/lib/vaporware/linker.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class Vaporware::Compiler::Linker - def self.link!(source, dest = "a.out", linker: "mold", options: []) = new(input: source, output: dest, linker:, options:).link +class Vaporware::Linker + def self.link!(input:, output: "a.out", linker: "mold", debug: false, shared: false) = new(input:, output:, linker:, debug:, shared:).link def initialize(input:, output: "a.out", linker: "mold", linker_options: [], shared: false, debug: false) @input, @output, @linker = input, output, linker diff --git a/sig/vaporware/compiler/assembler.rbs b/sig/vaporware/assembler.rbs similarity index 84% rename from sig/vaporware/compiler/assembler.rbs rename to sig/vaporware/assembler.rbs index fac4245..337cc67 100644 --- a/sig/vaporware/compiler/assembler.rbs +++ b/sig/vaporware/assembler.rbs @@ -1,5 +1,5 @@ -use Vaporware::Compiler::Assembler::ELF -class Vaporware::Compiler::Assembler +use Vaporware::Assembler::ELF +class Vaporware::Assembler @input: String @output: String @assembler: String diff --git a/sig/vaporware/compiler/assembler/elf.rbs b/sig/vaporware/assembler/elf.rbs similarity index 73% rename from sig/vaporware/compiler/assembler/elf.rbs rename to sig/vaporware/assembler/elf.rbs index 78a0346..baaf530 100644 --- a/sig/vaporware/compiler/assembler/elf.rbs +++ b/sig/vaporware/assembler/elf.rbs @@ -1,8 +1,8 @@ -use Vaporware::Compiler::Assembler::ELF::Header -use Vaporware::Compiler::Assembler::ELF::Section::Text -use Vaporware::Compiler::Assembler::ELF::Sections +use Vaporware::Assembler::ELF::Header +use Vaporware::Assembler::ELF::Section::Text +use Vaporware::Assembler::ELF::Sections -class Vaporware::Compiler::Assembler::ELF +class Vaporware::Assembler::ELF Error: singleton(StandardError) @input: String diff --git a/sig/vaporware/compiler/assembler/elf/header.rbs b/sig/vaporware/assembler/elf/header.rbs similarity index 94% rename from sig/vaporware/compiler/assembler/elf/header.rbs rename to sig/vaporware/assembler/elf/header.rbs index 6580aef..33b559d 100644 --- a/sig/vaporware/compiler/assembler/elf/header.rbs +++ b/sig/vaporware/assembler/elf/header.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Header +class Vaporware::Assembler::ELF::Header IDENT: Array[Integer] ELF_FILE_TYPE: Hash[Symbol, Integer] diff --git a/sig/vaporware/compiler/assembler/elf/section.rbs b/sig/vaporware/assembler/elf/section.rbs similarity index 62% rename from sig/vaporware/compiler/assembler/elf/section.rbs rename to sig/vaporware/assembler/elf/section.rbs index e3412b5..f533ef1 100644 --- a/sig/vaporware/compiler/assembler/elf/section.rbs +++ b/sig/vaporware/assembler/elf/section.rbs @@ -1,7 +1,7 @@ -use Vaporware::Compiler::Assembler::ELF::SectionHeader -use Vaporware::Compiler::Assembler::ELF::Section::* +use Vaporware::Assembler::ELF::SectionHeader +use Vaporware::Assembler::ELF::Section::* -class Vaporware::Compiler::Assembler::ELF::Section +class Vaporware::Assembler::ELF::Section attr_reader name: String attr_reader header: SectionHeader attr_reader body: Text | Null | Data | BSS | Symtab | Shstrtab | Strtab | Note diff --git a/sig/vaporware/compiler/assembler/elf/section/bss.rbs b/sig/vaporware/assembler/elf/section/bss.rbs similarity index 78% rename from sig/vaporware/compiler/assembler/elf/section/bss.rbs rename to sig/vaporware/assembler/elf/section/bss.rbs index 05b60d6..630968a 100644 --- a/sig/vaporware/compiler/assembler/elf/section/bss.rbs +++ b/sig/vaporware/assembler/elf/section/bss.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::BSS +class Vaporware::Assembler::ELF::Section::BSS attr_reader size: Integer attr_reader offset: Integer diff --git a/sig/vaporware/compiler/assembler/elf/section/data.rbs b/sig/vaporware/assembler/elf/section/data.rbs similarity index 80% rename from sig/vaporware/compiler/assembler/elf/section/data.rbs rename to sig/vaporware/assembler/elf/section/data.rbs index 3a91458..c6153cc 100644 --- a/sig/vaporware/compiler/assembler/elf/section/data.rbs +++ b/sig/vaporware/assembler/elf/section/data.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Data +class Vaporware::Assembler::ELF::Section::Data PREFIX: Hash[Symbol, Integer] REGISTER_CODE: Hash[Symbol, Integer] OPECODE: Hash[Symbol, Integer] diff --git a/sig/vaporware/compiler/assembler/elf/section/note.rbs b/sig/vaporware/assembler/elf/section/note.rbs similarity index 93% rename from sig/vaporware/compiler/assembler/elf/section/note.rbs rename to sig/vaporware/assembler/elf/section/note.rbs index fef8d46..b0f0b24 100644 --- a/sig/vaporware/compiler/assembler/elf/section/note.rbs +++ b/sig/vaporware/assembler/elf/section/note.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Note +class Vaporware::Assembler::ELF::Section::Note def self.gnu_property: () -> String @nsize: Array[Integer]? diff --git a/sig/vaporware/assembler/elf/section/null.rbs b/sig/vaporware/assembler/elf/section/null.rbs new file mode 100644 index 0000000..413179c --- /dev/null +++ b/sig/vaporware/assembler/elf/section/null.rbs @@ -0,0 +1,2 @@ +class Vaporware::Assembler::ELF::Section::Null +end diff --git a/sig/vaporware/compiler/assembler/elf/section/shstrtab.rbs b/sig/vaporware/assembler/elf/section/shstrtab.rbs similarity index 83% rename from sig/vaporware/compiler/assembler/elf/section/shstrtab.rbs rename to sig/vaporware/assembler/elf/section/shstrtab.rbs index cebdb11..0233e63 100644 --- a/sig/vaporware/compiler/assembler/elf/section/shstrtab.rbs +++ b/sig/vaporware/assembler/elf/section/shstrtab.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Shstrtab +class Vaporware::Assembler::ELF::Section::Shstrtab @strtab: Array[Integer] def initialize: () -> void def build: () -> String diff --git a/sig/vaporware/compiler/assembler/elf/section/strtab.rbs b/sig/vaporware/assembler/elf/section/strtab.rbs similarity index 57% rename from sig/vaporware/compiler/assembler/elf/section/strtab.rbs rename to sig/vaporware/assembler/elf/section/strtab.rbs index 3f40b9c..7ba992f 100644 --- a/sig/vaporware/compiler/assembler/elf/section/strtab.rbs +++ b/sig/vaporware/assembler/elf/section/strtab.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Strtab +class Vaporware::Assembler::ELF::Section::Strtab @name: String def initialize: (String) -> void def build: () -> String diff --git a/sig/vaporware/compiler/assembler/elf/section/symtab.rbs b/sig/vaporware/assembler/elf/section/symtab.rbs similarity index 92% rename from sig/vaporware/compiler/assembler/elf/section/symtab.rbs rename to sig/vaporware/assembler/elf/section/symtab.rbs index 369ff34..06071aa 100644 --- a/sig/vaporware/compiler/assembler/elf/section/symtab.rbs +++ b/sig/vaporware/assembler/elf/section/symtab.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Symtab +class Vaporware::Assembler::ELF::Section::Symtab @name: Array[Integer]? @info: Array[Integer] @other: Array[Integer] diff --git a/sig/vaporware/compiler/assembler/elf/section/text.rbs b/sig/vaporware/assembler/elf/section/text.rbs similarity index 93% rename from sig/vaporware/compiler/assembler/elf/section/text.rbs rename to sig/vaporware/assembler/elf/section/text.rbs index 32d5d24..cbf129b 100644 --- a/sig/vaporware/compiler/assembler/elf/section/text.rbs +++ b/sig/vaporware/assembler/elf/section/text.rbs @@ -1,4 +1,4 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Text +class Vaporware::Assembler::ELF::Section::Text PREFIX: Hash[Symbol, Integer] REGISTER_CODE: Hash[Symbol, Integer] OPECODE: Hash[Symbol, Array[Integer]] diff --git a/sig/vaporware/compiler/assembler/elf/section_header.rbs b/sig/vaporware/assembler/elf/section_header.rbs similarity index 83% rename from sig/vaporware/compiler/assembler/elf/section_header.rbs rename to sig/vaporware/assembler/elf/section_header.rbs index b057212..7c67f50 100644 --- a/sig/vaporware/compiler/assembler/elf/section_header.rbs +++ b/sig/vaporware/assembler/elf/section_header.rbs @@ -1,6 +1,6 @@ -use Vaporware::Compiler::Assembler::ELF +use Vaporware::Assembler::ELF -class Vaporware::Compiler::Assembler::ELF::SectionHeader +class Vaporware::Assembler::ELF::SectionHeader @name: Array[Integer]? @type: Array[Integer]? @flags: Array[Integer]? @@ -13,7 +13,7 @@ class Vaporware::Compiler::Assembler::ELF::SectionHeader @entsize: Array[Integer]? def build: () -> String - def set!: (?name: Integer?, ?type: Integer?, ?flags: Integer?, ?addr: Integer?, ?offset: Integer?, ?size: Integer?, ?link: Integer?, ?info: Integer?, ?addralign: Integer?, ?entsize: Integer?) -> Vaporware::Compiler::Assembler::ELF::SectionHeader + def set!: (?name: Integer?, ?type: Integer?, ?flags: Integer?, ?addr: Integer?, ?offset: Integer?, ?size: Integer?, ?link: Integer?, ?info: Integer?, ?addralign: Integer?, ?entsize: Integer?) -> Vaporware::Assembler::ELF::SectionHeader def null!: () -> ELF::SectionHeader def text!: () -> ELF::SectionHeader def note!: () -> ELF::SectionHeader diff --git a/sig/vaporware/compiler/assembler/elf/sections.rbs b/sig/vaporware/assembler/elf/sections.rbs similarity index 61% rename from sig/vaporware/compiler/assembler/elf/sections.rbs rename to sig/vaporware/assembler/elf/sections.rbs index a31365f..74aa795 100644 --- a/sig/vaporware/compiler/assembler/elf/sections.rbs +++ b/sig/vaporware/assembler/elf/sections.rbs @@ -1,6 +1,6 @@ -use Vaporware::Compiler::Assembler::ELF::Section +use Vaporware::Assembler::ELF::Section -class Vaporware::Compiler::Assembler::ELF::Sections +class Vaporware::Assembler::ELF::Sections ATTRIBUTES: Array[Symbol] attr_reader null: Section attr_reader text: Section @@ -12,5 +12,5 @@ class Vaporware::Compiler::Assembler::ELF::Sections attr_reader shstrtab: Section def initialize: () -> void - def each: (){ (Vaporware::Compiler::Assembler::ELF::Section) -> void } -> void + def each: (){ (Vaporware::Assembler::ELF::Section) -> void } -> void end diff --git a/sig/vaporware/compiler/assembler/elf/utils.rbs b/sig/vaporware/assembler/elf/utils.rbs similarity index 82% rename from sig/vaporware/compiler/assembler/elf/utils.rbs rename to sig/vaporware/assembler/elf/utils.rbs index eb4bb36..253abed 100644 --- a/sig/vaporware/compiler/assembler/elf/utils.rbs +++ b/sig/vaporware/assembler/elf/utils.rbs @@ -1,6 +1,6 @@ -use Vaporware::Compiler::Assembler::ELF::Error +use Vaporware::Assembler::ELF::Error -module Vaporware::Compiler::Assembler::ELF::Utils +module Vaporware::Assembler::ELF::Utils def build: () -> String def size: () -> Integer def empties: () -> Array[Symbol] diff --git a/sig/vaporware/compiler.rbs b/sig/vaporware/compiler.rbs index 4363803..b6914d2 100644 --- a/sig/vaporware/compiler.rbs +++ b/sig/vaporware/compiler.rbs @@ -4,14 +4,8 @@ class Vaporware::Compiler DYN_LD_PATH: String SHARED_LD_PATH: String # class methods - def self.compile: (String, ?assembler: String, ?linker: String, ?dest: String, ?debug: bool, ?compiler_options: Array[String], ?linker_options: Array[String], ?shared: bool) -> void - def initialize: (input: String, ?output: String, ?assembler: String, ?linker: String, ?debug: bool, ?shared: bool) -> void + def self.compile!: (input: String, ?output: String, ?compiler_options: Array[String], ?debug: bool, ?shared: bool) -> void + def initialize: (input: String, output: String, ?debug: bool, ?shared: bool) -> void - @generator: Vaporware::Compiler::Generator - @assembler: Vaporware::Compiler::Assembler - # instance methods - def assemble: (input: String, ?output: String, ?assembler: String, ?assembler_options: Array[String]?, ?debug: bool) -> String - def link: (input: String, ?output: String, ?linker: String, ?linker_options: Array[String], ?shared: bool) -> void - def compile: (?compiler_options: Array[String]) -> void - def call_command: (Array[String]) -> void + def compile: (compiler_options: Array[String]) -> String end diff --git a/sig/vaporware/compiler/assembler/elf/section/null.rbs b/sig/vaporware/compiler/assembler/elf/section/null.rbs deleted file mode 100644 index 0bf63b3..0000000 --- a/sig/vaporware/compiler/assembler/elf/section/null.rbs +++ /dev/null @@ -1,2 +0,0 @@ -class Vaporware::Compiler::Assembler::ELF::Section::Null -end diff --git a/test/vaporware/compiler/assembler/elf/section/test_note.rb b/test/vaporware/assembler/elf/section/test_note.rb similarity index 65% rename from test/vaporware/compiler/assembler/elf/section/test_note.rb rename to test/vaporware/assembler/elf/section/test_note.rb index 49c249e..9c9a496 100644 --- a/test/vaporware/compiler/assembler/elf/section/test_note.rb +++ b/test/vaporware/assembler/elf/section/test_note.rb @@ -1,13 +1,13 @@ require "vaporware" require "test/unit" -class Vaporware::Compiler::Assembler::ELF::Section::NoteTest < Test::Unit::TestCase +class Vaporware::Assembler::ELF::Section::NoteTest < Test::Unit::TestCase def reference_binary = "\x04\x00\x00\x00 \x00\x00\x00\x05\x00\x00\x00GNU\x00\x02\x00\x01\xC0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\xC0\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00".force_encoding("ASCII-8BIT") - def setup = @note = Vaporware::Compiler::Assembler::ELF::Section::Note.new + def setup = @note = Vaporware::Assembler::ELF::Section::Note.new def test_gnu_property! assert_equal( - Vaporware::Compiler::Assembler::ELF::Section::Note.gnu_property, + Vaporware::Assembler::ELF::Section::Note.gnu_property, reference_binary ) assert_equal( diff --git a/test/vaporware/compiler/assembler/elf/section/test_shstrtab.rb b/test/vaporware/assembler/elf/section/test_shstrtab.rb similarity index 51% rename from test/vaporware/compiler/assembler/elf/section/test_shstrtab.rb rename to test/vaporware/assembler/elf/section/test_shstrtab.rb index 55c2df9..fc2ab48 100644 --- a/test/vaporware/compiler/assembler/elf/section/test_shstrtab.rb +++ b/test/vaporware/assembler/elf/section/test_shstrtab.rb @@ -1,8 +1,8 @@ require "vaporware" require "test/unit" -class Vaporware::Compiler::Assembler::ELF::Section::TestShstrtab < Test::Unit::TestCase - def setup = @shstrtab = Vaporware::Compiler::Assembler::ELF::Section::Shstrtab.new +class Vaporware::Assembler::ELF::Section::TestShstrtab < Test::Unit::TestCase + def setup = @shstrtab = Vaporware::Assembler::ELF::Section::Shstrtab.new def test_set_values binary = "\x00.text\x00".force_encoding("ASCII-8BIT") @shstrtab.set!(name: "text") @@ -12,7 +12,7 @@ def test_set_values assert_equal(@shstrtab.build, binary) end def test_alert_values - assert_raise(Vaporware::Compiler::Assembler::ELF::Error) { @shstrtab.set!(name: :main) } - assert_raise(Vaporware::Compiler::Assembler::ELF::Error) { @shstrtab.set!(name: 123) } + assert_raise(Vaporware::Assembler::ELF::Error) { @shstrtab.set!(name: :main) } + assert_raise(Vaporware::Assembler::ELF::Error) { @shstrtab.set!(name: 123) } end end diff --git a/test/vaporware/compiler/assembler/elf/section/test_symtab.rb b/test/vaporware/assembler/elf/section/test_symtab.rb similarity index 80% rename from test/vaporware/compiler/assembler/elf/section/test_symtab.rb rename to test/vaporware/assembler/elf/section/test_symtab.rb index ba296b3..bac0176 100644 --- a/test/vaporware/compiler/assembler/elf/section/test_symtab.rb +++ b/test/vaporware/assembler/elf/section/test_symtab.rb @@ -1,8 +1,8 @@ require "vaporware" require "test/unit" -class Vaporware::Compiler::Assembler::ELF::Section::TestSymtab < Test::Unit::TestCase - def setup = @symtab = Vaporware::Compiler::Assembler::ELF::Section::Symtab.new +class Vaporware::Assembler::ELF::Section::TestSymtab < Test::Unit::TestCase + def setup = @symtab = Vaporware::Assembler::ELF::Section::Symtab.new def test_default_values binary = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00".force_encoding("ASCII-8BIT") diff --git a/test/vaporware/assembler/elf/test_header.rb b/test/vaporware/assembler/elf/test_header.rb new file mode 100644 index 0000000..58cc929 --- /dev/null +++ b/test/vaporware/assembler/elf/test_header.rb @@ -0,0 +1,10 @@ +require "vaporware" +require "test/unit" + +class Vaporware::Assembler::ELF::HeaderTest < Test::Unit::TestCase + def setup = @elf_header = Vaporware::Assembler::ELF::Header.new + + def test_build_elf_header + # TODO: ELF Header Section binary + end +end diff --git a/test/vaporware/compiler/assembler/elf/test_section_header.rb b/test/vaporware/assembler/elf/test_section_header.rb similarity index 63% rename from test/vaporware/compiler/assembler/elf/test_section_header.rb rename to test/vaporware/assembler/elf/test_section_header.rb index 6d282ea..b2358e4 100644 --- a/test/vaporware/compiler/assembler/elf/test_section_header.rb +++ b/test/vaporware/assembler/elf/test_section_header.rb @@ -1,8 +1,8 @@ require "vaporware" require "test/unit" -class Vaporware::Compiler::Assembler::ELF::SectionHeaderTest < Test::Unit::TestCase - def setup = @section_header = Vaporware::Compiler::Assembler::ELF::SectionHeader.new +class Vaporware::Assembler::ELF::SectionHeaderTest < Test::Unit::TestCase + def setup = @section_header = Vaporware::Assembler::ELF::SectionHeader.new def test_null! assert(@section_header.null!) assert_equal(@section_header.build.size, 64) diff --git a/test/vaporware/compiler/assembler/elf/test_header.rb b/test/vaporware/compiler/assembler/elf/test_header.rb deleted file mode 100644 index 2c6affd..0000000 --- a/test/vaporware/compiler/assembler/elf/test_header.rb +++ /dev/null @@ -1,10 +0,0 @@ -require "vaporware" -require "test/unit" - -class Vaporware::Compiler::Assembler::ELF::HeaderTest < Test::Unit::TestCase - def setup = @elf_header = Vaporware::Compiler::Assembler::ELF::Header.new - - def test_build_elf_header - # TODO: ELF Header Section binary - end -end diff --git a/test/vaporware/compiler/test_assembler.rb b/test/vaporware/test_assembler.rb similarity index 94% rename from test/vaporware/compiler/test_assembler.rb rename to test/vaporware/test_assembler.rb index 57dffca..e10e033 100644 --- a/test/vaporware/compiler/test_assembler.rb +++ b/test/vaporware/test_assembler.rb @@ -3,11 +3,11 @@ require "tempfile" require "pathname" -class Vaporware::Compiler::Assembler::ELFTest < Test::Unit::TestCase +class Vaporware::Assembler::ELFTest < Test::Unit::TestCase def test_to_elf input = Pathname.pwd.join('sample', 'assembler', 'plus.s').to_s - assembler = Vaporware::Compiler::Assembler.new(input:, output: "amd64.o") + assembler = Vaporware::Assembler.new(input:, output: "amd64.o") header, null, text, data, bss, note, symtab, strtab, shstrtab, *section_headers = assembler.to_elf sh_null, sh_text, sh_data, sh_bss, sh_note, sh_symtab, sh_strtab, sh_shstrtab = section_headers r_header, r_null, r_text, r_data, r_bss, r_note, r_symtab, r_strtab, r_shstrtab, *r_section_headers = dumped_references @@ -36,12 +36,12 @@ def test_to_elf def test_assembler_command input = Pathname.pwd.join('sample', 'assembler', 'plus.s').to_s - assembler = Vaporware::Compiler::Assembler.new(input:, output: "amd64.o") + assembler = Vaporware::Assembler.new(input:, output: "amd64.o") assert_equal("as", assembler.command("as")) assert_equal("as", assembler.command("gcc")) assert_equal("clang", assembler.command("clang")) assert_match(/clang/, assembler.command("llvm")) - assert_raise(Vaporware::Compiler::Assembler::Error) { assembler.command("foo") } + assert_raise(Vaporware::Assembler::Error) { assembler.command("foo") } end def dumped_references diff --git a/test/vaporware/test_compiler.rb b/test/vaporware/test_compiler.rb index 1803987..ba89b00 100644 --- a/test/vaporware/test_compiler.rb +++ b/test/vaporware/test_compiler.rb @@ -9,7 +9,7 @@ def teardown end def test_sample_plus @file = "sample/plus.rb" - @vaporware = Vaporware::Compiler.compile(@file, assembler: "self") + @vaporware = Vaporware.compile!(input: @file, assembler: "self") IO.popen("./tmp").close exit_code, handle_code = check_process($?.to_i) assert_equal(9, exit_code) @@ -18,7 +18,7 @@ def test_sample_plus def test_sample_variable @file = "sample/variable.rb" - @vaporware = Vaporware::Compiler.compile(@file, assembler: "self") + @vaporware = Vaporware.compile!(input: @file, assembler: "self") IO.popen("./tmp").close exit_code, handle_code = check_process($?.to_i) assert_equal(1, exit_code) @@ -27,7 +27,7 @@ def test_sample_variable def test_sample_if @file = "sample/if.rb" - @vaporware = Vaporware::Compiler.compile(@file) + @vaporware = Vaporware.compile!(input: @file) IO.popen("./tmp").close exit_code, handle_code = check_process($?.to_i) assert_equal(1, exit_code) @@ -36,7 +36,7 @@ def test_sample_if def test_sample_else @file = "sample/else.rb" - @vaporware = Vaporware::Compiler.compile(@file) + @vaporware = Vaporware.compile!(input: @file) IO.popen("./tmp").close exit_code, handle_code = check_process($?.to_i) assert_equal(2, exit_code) @@ -45,7 +45,7 @@ def test_sample_else def test_sample_while @file = "sample/while.rb" - @vaporware = Vaporware::Compiler.compile(@file) + @vaporware = Vaporware.compile!(input: @file) IO.popen("./tmp").close exit_code, handle_code = check_process($?.to_i) assert_equal(55, exit_code) @@ -55,7 +55,7 @@ def test_sample_while def test_sample_call_method @generated = ["libtmp.so", "libtmp.so.o", "libtmp.so.s"] @file = "sample/method.rb" - @vaporware = Vaporware::Compiler.compile(@file, dest: "./libtmp.so", shared: true, linker: "mold", assembler: "as") + @vaporware = Vaporware.compile!(input: @file, output: "./libtmp.so", shared: true, linker: "mold", assembler: "as") require './sample/fiddle.rb' assert_equal(10, X.aibo) end diff --git a/test/vaporware/compiler/test_linker.rb b/test/vaporware/test_linker.rb similarity index 66% rename from test/vaporware/compiler/test_linker.rb rename to test/vaporware/test_linker.rb index 2db39fb..bac6e55 100644 --- a/test/vaporware/compiler/test_linker.rb +++ b/test/vaporware/test_linker.rb @@ -1,17 +1,17 @@ require "vaporware" require "test/unit" -class Vaporware::Compiler::LinkerTest < Test::Unit::TestCase +class Vaporware::LinkerTest < Test::Unit::TestCase def test_librarie - linker = Vaporware::Compiler::Linker.new(input: "tmp.o") + linker = Vaporware::Linker.new(input: "tmp.o") assert_false(linker.libpath.empty?, "should not be empty") assert_false(linker.gcc_libpath.empty?, "should not be empty") end def test_link_command - linker = Vaporware::Compiler::Linker.new(input: "tmp.o", output: "tmp") + linker = Vaporware::Linker.new(input: "tmp.o", output: "tmp") assert_match(%r|mold -o tmp -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /.+/crt1.o /.+/crti.o /.+/crtbegin.o /.+/crtend.o /.+/libc.so /.+/crtn.o tmp.o|, linker.link_command) - linker = Vaporware::Compiler::Linker.new(input: "tmp.o", output: "tmp", shared: true) + linker = Vaporware::Linker.new(input: "tmp.o", output: "tmp", shared: true) assert_match(%r|mold -o tmp -m elf_x86_64 --shared /.+/crti.o /.+/crtbeginS.o /.+/crtendS.o /.+/libc.so /.+/crtn.o tmp.o|, linker.link_command) end end