diff options
| author | Ajax <commial@gmail.com> | 2017-01-03 10:48:53 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2017-01-04 17:14:55 +0100 |
| commit | 7f7bab09b3fdf47ace9236bf5bdeacab6bd4c907 (patch) | |
| tree | d1c736481360b0e6ed9fe724d94951081e91e568 | |
| parent | ecb30067cb14ea5924699abbd8bbe79c9330fbcf (diff) | |
| download | miasm-7f7bab09b3fdf47ace9236bf5bdeacab6bd4c907.tar.gz miasm-7f7bab09b3fdf47ace9236bf5bdeacab6bd4c907.zip | |
LLVM: add support for optimisation
Diffstat (limited to '')
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index cb6a5011..dbc0d1b9 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -60,39 +60,21 @@ class LLVMContext(): "Initialize a context with a module named 'name'" self.new_module(name) - def optimise_level(self, classic_passes=True, dead_passes=True): - """Set the optimisation level : - classic_passes : - - combine instruction - - reassociate - - global value numbering - - simplify cfg - - dead_passes : - - dead code - - dead store - - dead instructions + def optimise_level(self, level=2): + """Set the optimisation level to @level from 0 to 2 + 0: non-optimized + 2: optimized """ # Set up the optimiser pipeline - """ - if classic_passes is True: - # self.pass_manager.add(llvm_p.PASS_INSTCOMBINE) - self.pass_manager.add(llvm_p.PASS_REASSOCIATE) - self.pass_manager.add(llvm_p.PASS_GVN) - self.pass_manager.add(llvm_p.PASS_SIMPLIFYCFG) - - if dead_passes is True: - self.pass_manager.add(llvm_p.PASS_DCE) - self.pass_manager.add(llvm_p.PASS_DSE) - self.pass_manager.add(llvm_p.PASS_DIE) - - self.pass_manager.initialize() - """ + pmb = llvm.create_pass_manager_builder() + pmb.opt_level = level + pm = llvm.create_module_pass_manager() + pmb.populate(pm) + self.pass_manager = pm def new_module(self, name="mod"): self.mod = llvm_ir.Module(name=name) - # self.pass_manager = llvm.FunctionPassManager(self.mod) llvm.initialize() llvm.initialize_native_target() llvm.initialize_native_asmprinter() @@ -109,7 +91,7 @@ class LLVMContext(): def get_passmanager(self): "Return the Pass Manager associated with this context" - return self.exec_engine + return self.pass_manager def get_module(self): "Return the module associated with this context" @@ -1528,6 +1510,10 @@ class LLVMFunction(): # Parse our generated module mod = llvm.parse_assembly( str( self.mod ) ) mod.verify() + + # Apply optimisation + self.llvm_context.get_passmanager().run(mod) + # Now add the module and make sure it is ready for execution target = llvm.Target.from_default_triple() target_machine = target.create_target_machine() |