ruby-llvm 3.1.0.beta.1 → 3.2.0.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +30 -0
- data/README.md +49 -0
- data/ext/ruby-llvm-support/Rakefile +30 -7
- data/ext/ruby-llvm-support/support.cpp +48 -1
- data/lib/llvm.rb +26 -3
- data/lib/llvm/analysis.rb +8 -11
- data/lib/llvm/analysis_ffi.rb +1 -1
- data/lib/llvm/core.rb +36 -1
- data/lib/llvm/core/bitcode_ffi.rb +1 -1
- data/lib/llvm/core/builder.rb +20 -14
- data/lib/llvm/core/module.rb +87 -63
- data/lib/llvm/core/pass_manager.rb +30 -30
- data/lib/llvm/core/type.rb +34 -51
- data/lib/llvm/core/value.rb +13 -25
- data/lib/llvm/core_ffi.rb +62 -21
- data/lib/llvm/execution_engine.rb +13 -19
- data/lib/llvm/execution_engine_ffi.rb +1 -1
- data/lib/llvm/linker.rb +35 -0
- data/lib/llvm/linker_ffi.rb +45 -0
- data/lib/llvm/support.rb +32 -6
- data/lib/llvm/target.rb +318 -1
- data/lib/llvm/target_ffi.rb +302 -14
- data/lib/llvm/transforms/ipo_ffi.rb +1 -1
- data/lib/llvm/transforms/scalar_ffi.rb +1 -1
- data/lib/llvm/transforms/vectorize.rb +17 -0
- data/lib/llvm/transforms/vectorize_ffi.rb +31 -0
- data/lib/llvm/version.rb +21 -2
- data/test/array_test.rb +1 -1
- data/test/basic_block_test.rb +1 -1
- data/test/basic_test.rb +1 -1
- data/test/binary_operations_test.rb +1 -1
- data/test/bitcode_test.rb +2 -2
- data/test/branch_test.rb +1 -1
- data/test/call_test.rb +1 -1
- data/test/comparisons_test.rb +1 -1
- data/test/conversions_test.rb +1 -1
- data/test/double_test.rb +2 -2
- data/test/equality_test.rb +5 -5
- data/test/generic_value_test.rb +1 -1
- data/test/instruction_test.rb +1 -1
- data/test/ipo_test.rb +1 -1
- data/test/linker_test.rb +46 -0
- data/test/memory_access_test.rb +1 -1
- data/test/module_test.rb +50 -1
- data/test/phi_test.rb +1 -1
- data/test/select_test.rb +1 -1
- data/test/struct_test.rb +3 -3
- data/test/target_test.rb +124 -0
- data/test/test_helper.rb +10 -1
- data/test/type_test.rb +1 -1
- data/test/vector_test.rb +1 -1
- metadata +33 -22
- data/README.rdoc +0 -34
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # Generated by ffi_gen. Please do not change this file by hand.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'ffi'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module LLVM::C
         | 
| 6 | 
            +
              extend FFI::Library
         | 
| 7 | 
            +
              ffi_lib 'LLVM-3.2'
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              def self.attach_function(name, *_)
         | 
| 10 | 
            +
                begin; super; rescue FFI::NotFoundError => e
         | 
| 11 | 
            +
                  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              # (Not documented)
         | 
| 16 | 
            +
              # 
         | 
| 17 | 
            +
              # @method add_bb_vectorize_pass(pm)
         | 
| 18 | 
            +
              # @param [FFI::Pointer(PassManagerRef)] pm 
         | 
| 19 | 
            +
              # @return [nil] 
         | 
| 20 | 
            +
              # @scope class
         | 
| 21 | 
            +
              attach_function :add_bb_vectorize_pass, :LLVMAddBBVectorizePass, [:pointer], :void
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
              # See llvm::createLoopVectorizePass function.
         | 
| 24 | 
            +
              # 
         | 
| 25 | 
            +
              # @method add_loop_vectorize_pass(pm)
         | 
| 26 | 
            +
              # @param [FFI::Pointer(PassManagerRef)] pm 
         | 
| 27 | 
            +
              # @return [nil] 
         | 
| 28 | 
            +
              # @scope class
         | 
| 29 | 
            +
              attach_function :add_loop_vectorize_pass, :LLVMAddLoopVectorizePass, [:pointer], :void
         | 
| 30 | 
            +
              
         | 
| 31 | 
            +
            end
         | 
    
        data/lib/llvm/version.rb
    CHANGED
    
    | @@ -1,4 +1,23 @@ | |
| 1 | 
            +
            require 'find'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module LLVM
         | 
| 2 | 
            -
              LLVM_VERSION = "3. | 
| 3 | 
            -
              RUBY_LLVM_VERSION = "3. | 
| 4 | 
            +
              LLVM_VERSION = "3.2"
         | 
| 5 | 
            +
              RUBY_LLVM_VERSION = "3.2.0.beta.1"
         | 
| 6 | 
            +
              LLVM_CONFIG = begin
         | 
| 7 | 
            +
                variants = %W(llvm-config-#{LLVM_VERSION} llvm-config)
         | 
| 8 | 
            +
                llvm_config = nil
         | 
| 9 | 
            +
                catch :done do
         | 
| 10 | 
            +
                  paths = ENV['PATH'].split(File::PATH_SEPARATOR).select(&File.method(:directory?))
         | 
| 11 | 
            +
                  Find.find(*paths) do |path|
         | 
| 12 | 
            +
                    if variants.include?(File.basename(path))
         | 
| 13 | 
            +
                      actual_version = `#{path} --version`.chomp
         | 
| 14 | 
            +
                      if LLVM_VERSION == actual_version
         | 
| 15 | 
            +
                        llvm_config = path
         | 
| 16 | 
            +
                        throw(:done)
         | 
| 17 | 
            +
                      end
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                llvm_config
         | 
| 22 | 
            +
              end
         | 
| 4 23 | 
             
            end
         | 
    
        data/test/array_test.rb
    CHANGED
    
    
    
        data/test/basic_block_test.rb
    CHANGED
    
    
    
        data/test/basic_test.rb
    CHANGED
    
    
    
        data/test/bitcode_test.rb
    CHANGED
    
    
    
        data/test/branch_test.rb
    CHANGED
    
    
    
        data/test/call_test.rb
    CHANGED
    
    
    
        data/test/comparisons_test.rb
    CHANGED
    
    
    
        data/test/conversions_test.rb
    CHANGED
    
    
    
        data/test/double_test.rb
    CHANGED
    
    | @@ -2,7 +2,7 @@ require "test_helper" | |
| 2 2 |  | 
| 3 3 | 
             
            class DoubleTestCase < Test::Unit::TestCase
         | 
| 4 4 | 
             
              def setup
         | 
| 5 | 
            -
                LLVM. | 
| 5 | 
            +
                LLVM.init_jit
         | 
| 6 6 | 
             
              end
         | 
| 7 7 |  | 
| 8 8 | 
             
              def test_double
         | 
| @@ -16,7 +16,7 @@ class DoubleTestCase < Test::Unit::TestCase | |
| 16 16 |  | 
| 17 17 | 
             
                  bb = fun.basic_blocks.append
         | 
| 18 18 | 
             
                  builder.position_at_end(bb)
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 20 | 
             
                  builder.ret(builder.fadd(p0, LLVM::Double(1.0)))
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
    
        data/test/equality_test.rb
    CHANGED
    
    | @@ -3,7 +3,7 @@ require "llvm/core" | |
| 3 3 |  | 
| 4 4 | 
             
            class EqualityTestCase < Test::Unit::TestCase
         | 
| 5 5 | 
             
              def setup
         | 
| 6 | 
            -
                LLVM. | 
| 6 | 
            +
                LLVM.init_jit
         | 
| 7 7 | 
             
              end
         | 
| 8 8 |  | 
| 9 9 | 
             
              class MyModule < LLVM::Module; end
         | 
| @@ -40,7 +40,7 @@ class EqualityTestCase < Test::Unit::TestCase | |
| 40 40 | 
             
                                  :same      => [int1, int1],
         | 
| 41 41 | 
             
                                  :not_same  => [int1, int2, int3, int4],
         | 
| 42 42 | 
             
                                  :eql       => [int1, int2],
         | 
| 43 | 
            -
                                  :not_eql   => [int1, int3 | 
| 43 | 
            +
                                  :not_eql   => [int1, int3]
         | 
| 44 44 | 
             
              end
         | 
| 45 45 |  | 
| 46 46 | 
             
              def test_module
         | 
| @@ -54,7 +54,7 @@ class EqualityTestCase < Test::Unit::TestCase | |
| 54 54 | 
             
                                  :same      => [mod1, mod1],
         | 
| 55 55 | 
             
                                  :not_same  => [mod1, mod2, mod3, mod4],
         | 
| 56 56 | 
             
                                  :eql       => [mod1, mod2],
         | 
| 57 | 
            -
                                  :not_eql   => [mod1, mod3 | 
| 57 | 
            +
                                  :not_eql   => [mod1, mod3]
         | 
| 58 58 | 
             
              end
         | 
| 59 59 |  | 
| 60 60 | 
             
              def test_type
         | 
| @@ -68,7 +68,7 @@ class EqualityTestCase < Test::Unit::TestCase | |
| 68 68 | 
             
                                  :same      => [type1, type1],
         | 
| 69 69 | 
             
                                  :not_same  => [type1, type2, type3, type4],
         | 
| 70 70 | 
             
                                  :eql       => [type1, type2],
         | 
| 71 | 
            -
                                  :not_eql   => [type1, type3 | 
| 71 | 
            +
                                  :not_eql   => [type1, type3]
         | 
| 72 72 | 
             
              end
         | 
| 73 73 |  | 
| 74 74 | 
             
              def test_function
         | 
| @@ -84,7 +84,7 @@ class EqualityTestCase < Test::Unit::TestCase | |
| 84 84 | 
             
                                  :same      => [fn1, fn1],
         | 
| 85 85 | 
             
                                  :not_same  => [fn1, fn2, fn3, fn4],
         | 
| 86 86 | 
             
                                  :eql       => [fn1, fn2],
         | 
| 87 | 
            -
                                  :not_eql   => [fn1, fn3 | 
| 87 | 
            +
                                  :not_eql   => [fn1, fn3]
         | 
| 88 88 | 
             
              end
         | 
| 89 89 |  | 
| 90 90 | 
             
            end
         | 
    
        data/test/generic_value_test.rb
    CHANGED
    
    
    
        data/test/instruction_test.rb
    CHANGED
    
    
    
        data/test/ipo_test.rb
    CHANGED
    
    
    
        data/test/linker_test.rb
    ADDED
    
    | @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            require 'test_helper'
         | 
| 2 | 
            +
            require 'llvm/core'
         | 
| 3 | 
            +
            require 'llvm/linker'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class LinkerTestCase < Test::Unit::TestCase
         | 
| 6 | 
            +
              def setup
         | 
| 7 | 
            +
                LLVM.init_jit
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              def create_modules
         | 
| 11 | 
            +
                @mod1 = define_module('mod1') do |mod|
         | 
| 12 | 
            +
                  mod1calc = mod.functions.add("calc", [], LLVM::Int32)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  mod.functions.add("main", [], LLVM::Int32) do |fn|
         | 
| 15 | 
            +
                    fn.basic_blocks.append.build do |builder|
         | 
| 16 | 
            +
                      val = builder.call(mod1calc)
         | 
| 17 | 
            +
                      builder.ret val
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                @mod2 = define_module('mod2') do |mod|
         | 
| 23 | 
            +
                  mod.functions.add("calc", [], LLVM::Int32) do |fn|
         | 
| 24 | 
            +
                    fn.basic_blocks.append.build do |builder|
         | 
| 25 | 
            +
                      builder.ret LLVM::Int32.from_i(42)
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def test_link_into
         | 
| 32 | 
            +
                create_modules
         | 
| 33 | 
            +
                @mod2.link_into(@mod1)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                assert_equal 42, run_function_on_module(@mod1, 'main').to_i
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              def test_link_into_and_destroy
         | 
| 39 | 
            +
                create_modules
         | 
| 40 | 
            +
                @mod2.link_into_and_destroy(@mod1)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                assert_nil @mod2.to_ptr
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                assert_equal 42, run_function_on_module(@mod1, 'main').to_i
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
    
        data/test/memory_access_test.rb
    CHANGED
    
    
    
        data/test/module_test.rb
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            require "test_helper"
         | 
| 2 | 
            +
            require "tempfile"
         | 
| 2 3 |  | 
| 3 4 | 
             
            class ModuleTestCase < Test::Unit::TestCase
         | 
| 4 5 |  | 
| 5 6 | 
             
              def setup
         | 
| 6 | 
            -
                LLVM. | 
| 7 | 
            +
                LLVM.init_jit
         | 
| 7 8 | 
             
              end
         | 
| 8 9 |  | 
| 9 10 | 
             
              def test_simple_module
         | 
| @@ -18,4 +19,52 @@ class ModuleTestCase < Test::Unit::TestCase | |
| 18 19 | 
             
                end
         | 
| 19 20 | 
             
              end
         | 
| 20 21 |  | 
| 22 | 
            +
              def test_global_variable
         | 
| 23 | 
            +
                yielded = false
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                define_module('test_globals_add') do |mod|
         | 
| 26 | 
            +
                  mod.globals.add(LLVM::Int32, 'i') do |var|
         | 
| 27 | 
            +
                    yielded = true
         | 
| 28 | 
            +
                    assert_not_nil var
         | 
| 29 | 
            +
                    assert var.kind_of?(LLVM::GlobalVariable)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    assert !var.unnamed_addr?
         | 
| 32 | 
            +
                    var.unnamed_addr = true
         | 
| 33 | 
            +
                    assert var.unnamed_addr?
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                assert yielded, 'LLVM::Module::GlobalCollection#add takes block'
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def test_dump
         | 
| 41 | 
            +
                mod = LLVM::Module.new('test_print')
         | 
| 42 | 
            +
                expected_pattern = /^; ModuleID = 'test_print'$/
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                Tempfile.open('test_dump.1') do |tmpfile|
         | 
| 45 | 
            +
                  # debug stream (stderr)
         | 
| 46 | 
            +
                  stderr_old = $stderr.dup
         | 
| 47 | 
            +
                  $stderr.reopen(tmpfile.path, 'a')
         | 
| 48 | 
            +
                  begin
         | 
| 49 | 
            +
                    mod.dump
         | 
| 50 | 
            +
                    $stderr.flush
         | 
| 51 | 
            +
                    assert_match expected_pattern, File.read(tmpfile.path)
         | 
| 52 | 
            +
                  ensure
         | 
| 53 | 
            +
                    $stderr.reopen(stderr_old)
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                Tempfile.open('test_dump.2') do |tmpfile|
         | 
| 58 | 
            +
                  # file descriptor
         | 
| 59 | 
            +
                  mod.dump(tmpfile.fileno)
         | 
| 60 | 
            +
                  assert_match expected_pattern, File.read(tmpfile.path)
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                Tempfile.open('test_dump.3') do |tmpfile|
         | 
| 64 | 
            +
                  # io object
         | 
| 65 | 
            +
                  mod.dump(tmpfile)
         | 
| 66 | 
            +
                  assert_match expected_pattern, File.read(tmpfile.path)
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 21 70 | 
             
            end
         | 
    
        data/test/phi_test.rb
    CHANGED
    
    
    
        data/test/select_test.rb
    CHANGED
    
    
    
        data/test/struct_test.rb
    CHANGED
    
    | @@ -6,7 +6,7 @@ class StructTestCase < Test::Unit::TestCase | |
| 6 6 | 
             
              LLVM_PACKED = true
         | 
| 7 7 |  | 
| 8 8 | 
             
              def setup
         | 
| 9 | 
            -
                LLVM. | 
| 9 | 
            +
                LLVM.init_jit
         | 
| 10 10 | 
             
              end
         | 
| 11 11 |  | 
| 12 12 | 
             
              def test_simple_struct
         | 
| @@ -16,13 +16,13 @@ class StructTestCase < Test::Unit::TestCase | |
| 16 16 | 
             
                assert_equal LLVM::Int.type, struct.element_types[0]
         | 
| 17 17 | 
             
                assert_equal LLVM::Float.type, struct.element_types[1]
         | 
| 18 18 | 
             
              end
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 20 | 
             
              def test_named_struct
         | 
| 21 21 | 
             
                struct = LLVM::Struct(LLVM::Int, LLVM::Float, "struct100")
         | 
| 22 22 | 
             
                assert_instance_of LLVM::StructType, struct
         | 
| 23 23 | 
             
                assert_equal "struct100", struct.name
         | 
| 24 24 | 
             
              end
         | 
| 25 | 
            -
             | 
| 25 | 
            +
             | 
| 26 26 | 
             
              def test_deferred_element_type_setting
         | 
| 27 27 | 
             
                struct = LLVM::Struct("struct200")
         | 
| 28 28 | 
             
                struct.element_types = [LLVM::Int, LLVM::Float]
         | 
    
        data/test/target_test.rb
    ADDED
    
    | @@ -0,0 +1,124 @@ | |
| 1 | 
            +
            require "test_helper"
         | 
| 2 | 
            +
            require 'llvm/version'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class TargetTestCase < Test::Unit::TestCase
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def setup
         | 
| 7 | 
            +
                LLVM::Target.init('X86', true)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                @x86 = LLVM::Target.by_name('x86')
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def test_init_native
         | 
| 13 | 
            +
                assert_nothing_raised { LLVM::Target.init_native }
         | 
| 14 | 
            +
                assert_nothing_raised { LLVM::Target.init_native(true) }
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              if `#{LLVM::LLVM_CONFIG} --targets-built` =~ /ARM/
         | 
| 18 | 
            +
                def test_init_arm
         | 
| 19 | 
            +
                  assert_nothing_raised { LLVM::Target.init('ARM') }
         | 
| 20 | 
            +
                  assert_nothing_raised { LLVM::Target.init('ARM', true) }
         | 
| 21 | 
            +
                  assert_not_nil LLVM::Target.by_name('arm')
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def test_init_all
         | 
| 26 | 
            +
                assert_nothing_raised { LLVM::Target.init_all }
         | 
| 27 | 
            +
                assert_nothing_raised { LLVM::Target.init_all(true) }
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def test_each
         | 
| 31 | 
            +
                targets = LLVM::Target.each
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                assert_instance_of Enumerator, targets
         | 
| 34 | 
            +
                assert_equal 2, targets.count
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def test_target
         | 
| 38 | 
            +
                assert_equal 'x86', @x86.name
         | 
| 39 | 
            +
                assert_equal "32-bit X86: Pentium-Pro and above", @x86.description
         | 
| 40 | 
            +
                assert_equal true, @x86.jit?
         | 
| 41 | 
            +
                assert_equal true, @x86.target_machine?
         | 
| 42 | 
            +
                assert_equal true, @x86.asm_backend?
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              def test_target_machine
         | 
| 46 | 
            +
                @x86 = LLVM::Target.by_name('x86')
         | 
| 47 | 
            +
                mach = @x86.create_machine('x86-linux-gnu', 'i686')
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                assert_equal @x86, mach.target
         | 
| 50 | 
            +
                assert_equal 'x86-linux-gnu', mach.triple
         | 
| 51 | 
            +
                assert_equal 'i686', mach.cpu
         | 
| 52 | 
            +
                assert_equal '', mach.features
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                layout = mach.data_layout
         | 
| 55 | 
            +
                assert_equal 'e-p:32:32:32-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f32:32:32-f64:32:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32', layout.to_s
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              def test_emit
         | 
| 59 | 
            +
                mach = @x86.create_machine('x86-linux-gnu')
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                mod = define_module('test') do |mod|
         | 
| 62 | 
            +
                  define_function(mod, 'main', [], LLVM::Int) do |builder, fun|
         | 
| 63 | 
            +
                    entry = fun.basic_blocks.append
         | 
| 64 | 
            +
                    builder.position_at_end(entry)
         | 
| 65 | 
            +
                    builder.ret(LLVM::Int(0))
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                Tempfile.open('emit') do |tmp|
         | 
| 70 | 
            +
                  assert_nothing_raised { mach.emit(mod, tmp.path) }
         | 
| 71 | 
            +
                  assert_match %r{xorl\t%eax, %eax}, tmp.read
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                Tempfile.open('emit') do |tmp|
         | 
| 75 | 
            +
                  assert_nothing_raised { mach.emit(mod, tmp.path, :object) }
         | 
| 76 | 
            +
                  assert_match %r{\x31\xc0\xc3}o, File.read(tmp.path, mode: 'rb')
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              def test_module_properties
         | 
| 81 | 
            +
                mod = LLVM::Module.new('mod')
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                assert_equal '', mod.triple
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                mod.triple = 'x86-linux-gnu'
         | 
| 86 | 
            +
                assert_equal 'x86-linux-gnu', mod.triple
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                assert_equal '', mod.data_layout
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                mod.data_layout = 'e-p:64:64:64'
         | 
| 91 | 
            +
                assert_equal 'e-p:64:64:64', mod.data_layout
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
              def test_data_layout
         | 
| 95 | 
            +
                layout_be = LLVM::TargetDataLayout.new('E')
         | 
| 96 | 
            +
                assert_equal :big_endian, layout_be.byte_order
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                desc = "e-p:64:64:64-S0-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64"
         | 
| 99 | 
            +
                layout = LLVM::TargetDataLayout.new(desc)
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                assert_equal desc, layout.to_s
         | 
| 102 | 
            +
                assert_equal :little_endian, layout.byte_order
         | 
| 103 | 
            +
                assert_equal 8, layout.pointer_size
         | 
| 104 | 
            +
                assert_equal 8, layout.pointer_size(0)
         | 
| 105 | 
            +
                assert_equal LLVM::Int64.type, layout.int_ptr_type
         | 
| 106 | 
            +
                assert_equal LLVM::Int64.type, layout.int_ptr_type(0)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                assert_equal 19, layout.bit_size_of(LLVM::Int19.type)
         | 
| 109 | 
            +
                assert_equal 3, layout.storage_size_of(LLVM::Int19.type)
         | 
| 110 | 
            +
                assert_equal 4, layout.abi_size_of(LLVM::Int19.type)
         | 
| 111 | 
            +
                assert_equal 4, layout.abi_alignment_of(LLVM::Int19.type)
         | 
| 112 | 
            +
                assert_equal 4, layout.call_frame_alignment_of(LLVM::Int19.type)
         | 
| 113 | 
            +
                assert_equal 4, layout.preferred_alignment_of(LLVM::Int19.type)
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                struct = LLVM.Struct(LLVM::Int8, LLVM::Int32)
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                assert_equal 0, layout.offset_of_element(struct, 0)
         | 
| 118 | 
            +
                assert_equal 4, layout.offset_of_element(struct, 1)
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                assert_equal 0, layout.element_at_offset(struct, 0)
         | 
| 121 | 
            +
                assert_equal 0, layout.element_at_offset(struct, 3)
         | 
| 122 | 
            +
                assert_equal 1, layout.element_at_offset(struct, 4)
         | 
| 123 | 
            +
              end
         | 
| 124 | 
            +
            end
         |