annotate libinterp/parse-tree/pt-jit.h @ 29572:aef11bb4e6d1

use std::size_t and std::ptrdiff_t in C++ code (bug #60471) Files affected: make_int.cc, file-editor-tab.cc, octave-qscintilla.cc, Cell.cc, Cell.h, call-stack.cc, call-stack.h, cellfun.cc, data.cc, debug.cc, dlmread.cc, error.cc, event-queue.h, fcn-info.cc, fcn-info.h, file-io.cc, ft-text-renderer.cc, gl2ps-print.cc, graphics.cc, graphics.in.h, help.cc, hex2num.cc, input.cc, latex-text-renderer.cc, load-path.cc, load-save.cc, load-save.h, ls-hdf5.cc, ls-mat-ascii.cc, ls-mat5.cc, ls-oct-text.cc, mex.cc, mexproto.h, mxarray.h, oct-map.cc, oct-stream.cc, oct-stream.h, pager.cc, pager.h, pr-output.cc, regexp.cc, settings.h, stack-frame.cc, stack-frame.h, strfns.cc, syminfo.cc, symrec.h, symscope.cc, symscope.h, symtab.cc, sysdep.cc, toplev.cc, utils.cc, utils.h, variables.cc, __fltk_uigetfile__.cc, __init_fltk__.cc, audioread.cc, gzip.cc, cdef-class.cc, cdef-manager.cc, cdef-method.cc, cdef-object.cc, cdef-object.h, ov-base-diag.cc, ov-base-diag.h, ov-base-mat.cc, ov-base-mat.h, ov-base-scalar.cc, ov-base-scalar.h, ov-base-sparse.h, ov-base.cc, ov-base.h, ov-cell.cc, ov-cell.h, ov-ch-mat.cc, ov-class.cc, ov-class.h, ov-classdef.cc, ov-fcn-handle.cc, ov-java.cc, ov-lazy-idx.h, ov-perm.cc, ov-perm.h, ov-range.h, ov-str-mat.cc, ov-struct.cc, ov-struct.h, ov-usr-fcn.cc, ov-usr-fcn.h, ov.cc, ov.h, ovl.cc, octave.cc, bp-table.cc, jit-ir.cc, jit-ir.h, jit-typeinfo.cc, jit-typeinfo.h, jit-util.h, lex.h, lex.ll, oct-lvalue.cc, oct-parse.yy, parse.h, profiler.h, pt-eval.cc, pt-eval.h, pt-jit.cc, pt-jit.h, pt-pr-code.cc, pt-tm-const.cc, pt-tm-const.h, Array.h, CMatrix.cc, DiagArray2.h, PermMatrix.h, Sparse.h, dMatrix.cc, fCMatrix.cc, fMatrix.cc, bsxfun-defs.cc, oct-fftw.cc, oct-fftw.h, randpoisson.cc, sparse-chol.cc, mx-inlines.cc, file-ops.cc, lo-sysdep.cc, oct-env.cc, oct-time.cc, action-container.cc, action-container.h, base-list.h, caseless-str.h, cmd-edit.cc, cmd-hist.cc, data-conv.cc, data-conv.h, f77-fcn.h, file-info.cc, file-info.h, kpse.cc, kpse.h, lo-cutils.h, lo-hash.h, lo-regexp.cc, oct-base64.cc, oct-base64.h, oct-binmap.h, oct-glob.cc, oct-shlib.cc, oct-shlib.h, oct-sort.cc, oct-sparse.h, oct-string.cc, quit.cc, unwind-prot.h, url-transfer.cc, main.in.cc, mkoctfile.in.cc, and shared-fcns.h.
author John W. Eaton <jwe@octave.org>
date Wed, 28 Apr 2021 22:57:42 -0400
parents 0a5b15007766
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
29358
0a5b15007766 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 28256
diff changeset
3 // Copyright (C) 2012-2021 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
25
20791
f7084eae3318 maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents: 19697
diff changeset
26 #if ! defined (octave_pt_jit_h)
17822
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17787
diff changeset
27 #define octave_pt_jit_h 1
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
28
21244
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
29 #include "octave-config.h"
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
30
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21244
diff changeset
31 #if defined (HAVE_LLVM)
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
32
26542
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
33 #include "jit-util.h"
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
34 #include "jit-typeinfo.h"
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
35 #include "jit-ir.h"
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
36 #include "pt-walk.h"
24362
3fc24b792a24 avoid including symtab.h, symscope.h, or symrec.h unnecessarily
John W. Eaton <jwe@octave.org>
parents: 24361
diff changeset
37 #include "symscope.h"
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
38
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
39 // octave_value_list is not (yet) in the octave namespace
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
40 class octave_value_list;
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
41
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
42 namespace octave
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
43 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
44 namespace jit
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
45 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
46 typedef std::unique_ptr<llvm::Module> ModuleOwner;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
47 typedef std::unique_ptr<llvm::ExecutionEngine> EngineOwner;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
48 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
49
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
50 // Convert from the parse tree (AST) to the low level Octave IR.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
51 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
52 jit_convert : public tree_walker
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
53 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
54 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
55
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
56 typedef std::pair<jit_type *, std::string> type_bound;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
57 typedef std::vector<type_bound> type_bound_vector;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
58 typedef std::map<std::string, jit_variable *> variable_map;
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
59
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
60 jit_convert (tree& tee, jit_type *for_bounds = nullptr);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
61
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
62 jit_convert (octave_user_function& fcn, const std::vector<jit_type *>& args);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
63
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
64 template <typename ...Args>
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
65 jit_call * create_checked (const Args&... args)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
66 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
67 jit_call *ret = m_factory.create<jit_call> (args...);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
68 return create_checked_impl (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
69 }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
70
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
71 jit_block_list& get_blocks (void) { return m_blocks; }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
72
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
73 const type_bound_vector& get_bounds (void) const { return m_bounds; }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
74
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
75 jit_factory& get_factory (void) { return m_factory; }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
76
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
77 llvm::Function *get_function (void) const { return m_function; }
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
78
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
79 const variable_map& get_variable_map (void) const { return m_vmap; }
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
80
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
81 void visit_anon_fcn_handle (tree_anon_fcn_handle&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
82
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
83 void visit_argument_list (tree_argument_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
84
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
85 void visit_binary_expression (tree_binary_expression&);
23425
7dfa3bc8e3d5 handle boolean expressions separately in JIT compiler
John W. Eaton <jwe@octave.org>
parents: 23220
diff changeset
86
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
87 void visit_boolean_expression (tree_boolean_expression&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
88
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
89 void visit_break_command (tree_break_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
90
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
91 void visit_colon_expression (tree_colon_expression&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
92
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
93 void visit_continue_command (tree_continue_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
94
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
95 void visit_decl_command (tree_decl_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
96
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
97 void visit_decl_init_list (tree_decl_init_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
98
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
99 void visit_decl_elt (tree_decl_elt&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
100
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
101 void visit_simple_for_command (tree_simple_for_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
102
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
103 void visit_complex_for_command (tree_complex_for_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
104
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
105 void visit_octave_user_script (octave_user_script&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
106
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
107 void visit_octave_user_function (octave_user_function&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
108
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
109 void visit_octave_user_function_header (octave_user_function&);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
110
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
111 void visit_octave_user_function_trailer (octave_user_function&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
112
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
113 void visit_function_def (tree_function_def&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
114
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
115 void visit_identifier (tree_identifier&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
116
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
117 void visit_if_clause (tree_if_clause&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
118
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
119 void visit_if_command (tree_if_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
120
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
121 void visit_if_command_list (tree_if_command_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
122
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
123 void visit_index_expression (tree_index_expression&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
124
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
125 void visit_matrix (tree_matrix&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
126
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
127 void visit_cell (tree_cell&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
128
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
129 void visit_multi_assignment (tree_multi_assignment&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
130
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
131 void visit_no_op_command (tree_no_op_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
132
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
133 void visit_constant (tree_constant&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
134
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
135 void visit_fcn_handle (tree_fcn_handle&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
136
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
137 void visit_parameter_list (tree_parameter_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
138
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
139 void visit_postfix_expression (tree_postfix_expression&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
140
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
141 void visit_prefix_expression (tree_prefix_expression&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
142
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
143 void visit_return_command (tree_return_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
144
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
145 void visit_simple_assignment (tree_simple_assignment&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
146
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
147 void visit_statement (tree_statement&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
148
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
149 void visit_statement_list (tree_statement_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
150
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
151 void visit_switch_case (tree_switch_case&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
152
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
153 void visit_switch_case_list (tree_switch_case_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
154
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
155 void visit_switch_command (tree_switch_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
156
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
157 void visit_try_catch_command (tree_try_catch_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
158
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
159 void visit_unwind_protect_command (tree_unwind_protect_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
160
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
161 void visit_while_command (tree_while_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
162
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
163 void visit_do_until_command (tree_do_until_command&);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
164
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
165 private:
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
166
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
167 std::vector<std::pair<std::string, bool>> m_arguments;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
168 type_bound_vector m_bounds;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
169
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
170 bool m_converting_function;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
171
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
172 // the scope of the function we are converting, or the current scope
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
173 symbol_scope m_scope;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
174
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
175 jit_factory m_factory;
15182
a7a56b436de2 Factor out jit_block_list and jit_factory from jit_convert
Max Brister <max@2bass.com>
parents: 15181
diff changeset
176
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
177 // used instead of return values from visit_* functions
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
178 jit_value *m_result;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
179
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
180 jit_block *m_entry_block;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
181
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
182 jit_block *m_final_block;
14938
bab44e3ee291 Adding basic error support to JIT
Max Brister <max@2bass.com>
parents: 14937
diff changeset
183
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
184 jit_block *m_block;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
185
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
186 llvm::Function *m_function;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
187
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
188 jit_block_list m_blocks;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
189
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
190 std::vector<jit_magic_end::context> m_end_context;
15056
bc32288f4a42 Support the end keyword for one dimentional indexing in JIT.
Max Brister <max@2bass.com>
parents: 15027
diff changeset
191
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
192 std::size_t m_iterator_count;
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
193 std::size_t m_for_bounds_count;
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
194 std::size_t m_short_count;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
195
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
196 variable_map m_vmap;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
197
24361
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
198 void initialize (const symbol_scope& s);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
199
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
200 jit_call * create_checked_impl (jit_call *ret);
14961
903a5ee2cdde Simplify the creation of error checks in jit
Max Brister <max@2bass.com>
parents: 14960
diff changeset
201
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
202 // get an existing vairable. If the variable does not exist, it will not be
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
203 // created
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
204 jit_variable * find_variable (const std::string& vname) const;
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
205
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
206 // get a variable, create it if it does not exist. The type will default to
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
207 // the variable's current type in the symbol table.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
208 jit_variable * get_variable (const std::string& vname);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
209
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
210 // create a variable of the given name and given type. Will also insert an
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
211 // extract statement
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
212 jit_variable * create_variable (const std::string& vname, jit_type *type,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
213 bool isarg = true);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
214
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
215 // The name of the next for loop iterator. If inc is false, then the
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
216 // iterator counter will not be incremented.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
217 std::string next_iterator (bool inc = true)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
218 { return next_name ("#iter", m_iterator_count, inc); }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
219
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
220 std::string next_for_bounds (bool inc = true)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
221 { return next_name ("#for_bounds", m_for_bounds_count, inc); }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
222
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
223 std::string next_shortcircut_result (bool inc = true)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
224 { return next_name ("#shortcircut_result", m_short_count, inc); }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
225
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
226 std::string next_name (const char *prefix, std::size_t& count, bool inc);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
227
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
228 jit_instruction * resolve (tree_index_expression& exp,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
229 jit_value *extra_arg = nullptr, bool lhs = false);
14969
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
230
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
231 jit_value * do_assign (tree_expression *exp, jit_value *rhs,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
232 bool artificial = false);
14969
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
233
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
234 jit_value * do_assign (const std::string& lhs, jit_value *rhs, bool print,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
235 bool artificial = false);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
236
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
237 jit_value * visit (tree *tee) { return visit (*tee); }
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
238
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
239 jit_value * visit (tree& tee);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
240
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
241 typedef std::list<jit_block *> block_list;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
242 block_list m_breaks;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
243 block_list m_continues;
14935
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
244
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
245 void finish_breaks (jit_block *dest, const block_list& lst);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
246 };
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
247
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
248 // Convert from the low level Octave IR to LLVM
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
249 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
250 jit_convert_llvm : public jit_ir_walker
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
251 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
252 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
253
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
254 llvm::Function * convert_loop (const jit_module& module,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
255 const jit_block_list& blocks,
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
256 const std::list<jit_value *>& constants,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
257 const std::string& llvm_function_name);
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
258
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
259 jit_function convert_function (const jit_module& module,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
260 const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
261 const std::list<jit_value *>& constants,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
262 octave_user_function& fcn,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
263 const std::vector<jit_type *>& args);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
264
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
265 // arguments to the llvm::Function for loops
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
266 const std::vector<std::pair<std::string, bool>>& get_arguments(void) const
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
267 { return m_argument_vec; }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
268
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
269 #define JIT_METH(clname) \
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
270 virtual void visit (jit_ ## clname&);
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
271
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
272 JIT_VISIT_IR_CLASSES;
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
273
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
274 #undef JIT_METH
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
275
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
276 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
277
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
278 // name -> argument index (used for compiling functions)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
279 std::map<std::string, int> m_argument_index;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
280
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
281 std::vector<std::pair<std::string, bool>> m_argument_vec;
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
282
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
283 // name -> llvm argument (used for compiling loops)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
284 std::map<std::string, llvm::Value *> m_arguments;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
285
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
286 bool m_converting_function;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
287
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
288 // only used if we are converting a function
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
289 jit_function m_creating;
15370
8355fddce815 Use sret and do not use save/restore stack (bug #37308)
Max Brister <max@2bass.com>
parents: 15337
diff changeset
290
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
291 llvm::Function *m_function;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
292 llvm::BasicBlock *m_prelude;
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
293
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
294 void convert (const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
295 const std::list<jit_value *>& constants);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
296
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
297 void finish_phi (jit_phi *phi);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
298
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
299 void visit (jit_value *jvalue)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
300 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
301 return visit (*jvalue);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
302 }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
303
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
304 void visit (jit_value& jvalue)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
305 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
306 jvalue.accept (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
307 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
308 };
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
309
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
310 // type inference and SSA construction on the low level Octave IR
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
311 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
312 jit_infer
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
313 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
314 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
315
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
316 typedef jit_convert::variable_map variable_map;
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
317
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
318 jit_infer (jit_factory& afactory, jit_block_list& ablocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
319 const variable_map& avmap);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
320
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
321 jit_block_list& get_blocks (void) const { return m_blocks; }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
322
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
323 jit_factory& get_factory (void) const { return m_factory; }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
324
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
325 void infer (void);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
326
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
327 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
328
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
329 jit_block_list& m_blocks;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
330 jit_factory& m_factory;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
331 const variable_map& m_vmap;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
332 std::list<jit_instruction *> m_worklist;
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
333
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
334 void append_users (jit_value *v);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
335
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
336 void append_users_term (jit_terminator *term);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
337
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
338 void construct_ssa (void);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
339
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
340 void do_construct_ssa (jit_block& block, std::size_t avisit_count);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
341
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
342 jit_block& entry_block (void) { return *m_blocks.front (); }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
343
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
344 jit_block& final_block (void) { return *m_blocks.back (); }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
345
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
346 void place_releases (void);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
347
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
348 void push_worklist (jit_instruction *instr);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
349
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
350 void remove_dead ();
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
351
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
352 void release_dead_phi (jit_block& ablock);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
353
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
354 void release_temp (jit_block& ablock, std::set<jit_value *>& temp);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
355
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
356 void simplify_phi (void);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
357
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
358 void simplify_phi (jit_phi& phi);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
359 };
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
360
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
361
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
362 class jit_module;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
363
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
364 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
365 tree_jit
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
366 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
367 // ----- Constructor/destructor (singleton pattern) -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
368
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
369 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
370
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
371 ~tree_jit (void);
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
372
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
373 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
374
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
375 tree_jit (void);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
376 static tree_jit& instance (void);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
377
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
378 // ----- Initialization -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
379
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
380 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
381
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
382 static bool initialized;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
383 bool do_initialize (void);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
384
26535
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
385 // ----- LLVM context -----
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
386
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
387 public:
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
388
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
389 static llvm::LLVMContext llvm_context;
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26376
diff changeset
390
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
391 // ----- Target machine ----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
392
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
393 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
394
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
395 static const llvm::TargetMachine* get_target_machine (void)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
396 { return instance ().target_machine; }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
397
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
398 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
399
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
400 llvm::TargetMachine *target_machine;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
401
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
402 // ----- Create LLVM modules and engines -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
403
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
404 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
405
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
406 static jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
407 open_new_module (const std::string& module_name = generate_unique_module_name ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
408
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
409 static jit::EngineOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
410 create_new_engine (jit::ModuleOwner module_owner);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
411
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
412 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
413
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
414 jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
415 do_open_new_module (const std::string& module_name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
416
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
417 // ----- Registering JIT modules (module+engine pairs) -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
418
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
419 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
420
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
421 static void register_jit_module (jit_module* jm)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
422 { instance ().do_register_jit_module (jm); }
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
423
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
424 static void unregister_jit_module (jit_module* jm)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
425 { instance ().do_unregister_jit_module (jm); }
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
426
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
427 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
428
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
429 // List of all currently registered jit modules
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
430 std::list<jit_module*> jm_list;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
431 void do_register_jit_module (jit_module* jm);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
432 void do_unregister_jit_module (jit_module* jm);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
433 void do_dump_all_modules (void) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
434
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
435 // ----- Symbol resolution -----
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
436
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
437 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
438
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
439 static void* getPointerToNamedFunction (const std::string &name)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
440 { return instance ().do_getPointerToNamedFunction (name); }
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
441
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
442 static uint64_t getSymbolAddress (const std::string &name)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
443 { return instance ().do_getSymbolAddress (name); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
444
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
445 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
446
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
447 void* do_getPointerToNamedFunction (const std::string &Name) const;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
448
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
449 uint64_t do_getSymbolAddress (const std::string &name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
450
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
451 // ----- Generate unique identifiers -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
452
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
453 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
454
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
455 static std::string generate_unique_forloop_name (void)
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
456 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
457 return std::string ("jittedForLoop")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
458 + std::to_string (next_forloop_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
459 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
460 // FIXME: Check that the identifier does not exist
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
461
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
462 static std::string generate_unique_function_name (void)
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
463 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
464 return std::string ("jittedFunction")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
465 + std::to_string (next_function_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
466 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
467 // FIXME: Check that the identifier does not exist
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
468
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
469 static std::string generate_unique_module_name (void)
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
470 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
471 return std::string ("octaveJITModule")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
472 + std::to_string (next_module_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
473 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
474 // FIXME: Check that the identifier does not exist
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
475
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
476 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
477
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
478 static int next_forloop_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
479 static int next_function_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
480 static int next_module_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
481
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
482 // ----- JIT and execute ASTs -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
483
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
484 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
485
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
486 static bool execute (tree_simple_for_command& cmd,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
487 const octave_value& bounds)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
488 { return instance ().do_execute (cmd, bounds); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
489
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
490 static bool execute (tree_while_command& cmd)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
491 { return instance ().do_execute (cmd); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
492
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
493 static bool execute (octave_user_function& fcn,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
494 const octave_value_list& args,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
495 octave_value_list& retval)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
496 { return instance ().do_execute (fcn, args, retval); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
497
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
498 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
499
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
500 bool do_execute (tree_simple_for_command& cmd,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
501 const octave_value& bounds);
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
502
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
503 bool do_execute (tree_while_command& cmd);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
504
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
505 bool do_execute (octave_user_function& fcn,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
506 const octave_value_list& args,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
507 octave_value_list& retval);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
508
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
509 // ----- Miscellaneous -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
510
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
511 bool enabled (void);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
512
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
513 std::size_t trip_count (const octave_value& bounds) const;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
514 };
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
515
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
516
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
517 class
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
518 jit_module
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
519 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
520 // TODO: Encapsulate all operations that can modify the module,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
521 // and prevent them if the module has been finalized
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
522
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
523 // TODO: Consider creating the engine at the end only?
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
524 // I have read somewhere that this is more efficient (nor sure)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
525
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
526 public:
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
527
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
528 // Create an open module and associated JIT engine
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
529 jit_module (const std::string& module_name
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
530 = tree_jit::generate_unique_module_name ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
531
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
532 // Delete the underlying JIT engine
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
533 ~jit_module ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
534
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
535 // Create an LLVM function in the module, with external linkage
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
536 llvm::Function*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
537 create_llvm_function (llvm::FunctionType *ftype,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
538 const llvm::Twine &name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
539
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
540 // Create a global in the module, with external linkage
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
541 llvm::GlobalVariable*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
542 create_global_variable (llvm::Type *type, bool is_constant,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
543 const llvm::Twine& name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
544
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
545 // Create or insert an LLVM Function declaration for an intrinsic,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
546 // and return it
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
547 llvm::Function*
29572
aef11bb4e6d1 use std::size_t and std::ptrdiff_t in C++ code (bug #60471)
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
548 get_intrinsic_declaration (std::size_t id,
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
549 std::vector<llvm::Type*> types) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
550
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
551 // Underlying type of enums defined in yet-inconplete types
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
552 typedef unsigned llvm_gv_linkage; // FIXME: autoconf this
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
553
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
554 // add_global_mapping tells the execution engine where a specified
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
555 // global value (variable or function) is
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
556 template <typename ptr_type>
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
557 void add_global_mapping (const llvm::GlobalValue* gv, ptr_type p) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
558 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
559 do_add_global_mapping (gv, reinterpret_cast<void *> (p));
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
560 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
561
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
562 // Return the address of the specified function.
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
563 uint64_t getFunctionAddress (const std::string &name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
564
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
565 // Optimize a function in the LLVM module
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
566 void optimize (llvm::Function *fn) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
567
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
568 // FIXME: Once this has been called, we should not be able
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
569 // to change anything in the module...
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
570 void finalizeObject (void);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
571
24446
4ca5c9f899d3 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 24362
diff changeset
572 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
573
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
574 void do_add_global_mapping (const llvm::GlobalValue* gv, void* p) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
575
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
576 llvm::Module *m_module;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
577 llvm::ExecutionEngine *m_engine;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
578 };
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
579
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
580
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
581 class
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
582 jit_info : public jit_module
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
583 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
584 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
585
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
586 // we use a pointer here so we don't have to include ov.h
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
587 typedef std::map<std::string, const octave_value *> vmap;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
588
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
589 jit_info (tree& tee);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
590
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
591 jit_info (tree& tee, const octave_value& for_bounds);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
592
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
593 jit_info (tree_simple_for_command& tee, const octave_value& for_bounds);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
594
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
595 bool execute (const vmap& extra_vars = vmap ()) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
596
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
597 bool match (const vmap& extra_vars = vmap ()) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
598
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
599 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
600
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
601 typedef jit_convert::type_bound type_bound;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
602 typedef jit_convert::type_bound_vector type_bound_vector;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
603 typedef void (*jited_function)(octave_base_value**);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
604
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
605 void compile (tree& tee, jit_type *for_bounds = 0);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
606
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
607 octave_value find (const vmap& extra_vars, const std::string& vname) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
608
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
609 // LLVM function associated to this jit_info object
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
610 std::string m_llvm_function_name;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
611 jited_function m_function;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
612
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
613 std::vector<std::pair<std::string, bool>> m_arguments;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
614 type_bound_vector m_bounds;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
615 };
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
616
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
617
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
618 class
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
619 jit_function_info : public jit_module
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
620 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
621 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
622
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
623 jit_function_info (octave_user_function& fcn,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
624 const octave_value_list& ov_args);
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
625
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
626 bool execute (const octave_value_list& ov_args,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
627 octave_value_list& retval) const;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
628
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
629 bool match (const octave_value_list& ov_args) const;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
630
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
631 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
632
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
633 typedef octave_base_value *(*jited_function)(octave_base_value**);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
634
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
635 // LLVM function associated to this jit_info object
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
636 std::string m_llvm_function_name;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
637 jited_function m_function;
14913
c7071907a641 Use symbol_record_ref instead of names in JIT
Max Brister <max@2bass.com>
parents: 14911
diff changeset
638
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
639 std::vector<jit_type *> m_argument_types;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
640 };
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
641 }
14937
78e1457c5bf5 Remove some macros from pt-jit.h and pt-jit.cc
Max Brister <max@2bass.com>
parents: 14936
diff changeset
642
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
643 #endif
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
644
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
645 #endif