about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/llvmconvert.py22
-rw-r--r--test/arch/x86/unit/asm_test.py10
-rw-r--r--test/arch/x86/unit/mn_div.py17
-rwxr-xr-xtest/test_all.py2
4 files changed, 49 insertions, 2 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py
index 7729d12c..cf6dea31 100644
--- a/miasm2/jitter/llvmconvert.py
+++ b/miasm2/jitter/llvmconvert.py
@@ -135,13 +135,31 @@ class LLVMContext_JIT(LLVMContext):
         self.library_filenames = library_filenames
         self.ir_arch = ir_arch
         self.arch_specific()
+        self.load_libraries()
         LLVMContext.__init__(self, name)
         self.vmcpu = {}
 
-    def new_module(self, name="mod"):
-        LLVMContext.new_module(self, name)
+    def load_libraries(self):
+        # Get LLVM specific functions
+        name = "libLLVM-%d.%d" % (llvm.llvm_version_info[0],
+                                  llvm.llvm_version_info[1],
+        )
+        try:
+            # On Windows, no need to add ".dll"
+            self.add_shared_library(name)
+        except RuntimeError:
+            try:
+                # On Linux, ".so" is needed
+                self.add_shared_library("%s.so" % name)
+            except RuntimeError:
+                pass
+
+        # Load additional libraries
         for lib_fname in self.library_filenames:
             self.add_shared_library(lib_fname)
+
+    def new_module(self, name="mod"):
+        LLVMContext.new_module(self, name)
         self.add_memlookups()
         self.add_get_exceptionflag()
         self.add_op()
diff --git a/test/arch/x86/unit/asm_test.py b/test/arch/x86/unit/asm_test.py
index aba47df1..8a6b215c 100644
--- a/test/arch/x86/unit/asm_test.py
+++ b/test/arch/x86/unit/asm_test.py
@@ -90,3 +90,13 @@ class Asm_Test_16(Asm_Test):
         self.myjit.vm.add_memory_page(self.run_addr, PAGE_READ | PAGE_WRITE, self.assembly)
         self.myjit.push_uint16_t(self.ret_addr)
         self.myjit.add_breakpoint(self.ret_addr, lambda x:False)
+
+class Asm_Test_64(Asm_Test):
+    arch_name = "x86_64"
+    arch_attrib = 64
+    ret_addr = 0x1337beef
+
+    def init_machine(self):
+        self.myjit.vm.add_memory_page(self.run_addr, PAGE_READ | PAGE_WRITE, self.assembly)
+        self.myjit.push_uint64_t(self.ret_addr)
+        self.myjit.add_breakpoint(self.ret_addr, lambda x:False)
diff --git a/test/arch/x86/unit/mn_div.py b/test/arch/x86/unit/mn_div.py
new file mode 100644
index 00000000..84569607
--- /dev/null
+++ b/test/arch/x86/unit/mn_div.py
@@ -0,0 +1,17 @@
+import sys
+from asm_test import Asm_Test_64
+
+class Test_DIV(Asm_Test_64):
+    TXT = '''
+main:
+        MOV RAX, 0x8877665544332211
+        MOV RBX, 0x11223344556677
+        DIV RBX
+        RET
+    '''
+    def check(self):
+        assert self.myjit.cpu.RAX == 0x7F7
+        assert self.myjit.cpu.RDX == 0x440
+
+if __name__ == "__main__":
+    [test(*sys.argv[1:])() for test in [Test_DIV]]
diff --git a/test/test_all.py b/test/test_all.py
index b70afa9a..3da2dbb5 100755
--- a/test/test_all.py
+++ b/test/test_all.py
@@ -60,6 +60,7 @@ class ArchUnitTest(RegressionTest):
 # script -> blacklisted jitter
 blacklist = {
     "x86/unit/mn_float.py": ["python", "llvm"],
+    "x86/unit/mn_div.py": ["tcc", "gcc"],
 }
 for script in ["x86/sem.py",
                "x86/unit/mn_strings.py",
@@ -80,6 +81,7 @@ for script in ["x86/sem.py",
                "x86/unit/mn_pushpop.py",
                "x86/unit/mn_seh.py",
                "x86/unit/mn_cpuid.py",
+               "x86/unit/mn_div.py",
                "arm/arch.py",
                "arm/sem.py",
                "aarch64/unit/mn_ubfm.py",