annotate libinterp/parse-tree/pt-jit.h @ 26376:00f796120a6d stable

maint: Update copyright dates in all source files.
author John W. Eaton <jwe@octave.org>
date Wed, 02 Jan 2019 16:32:43 -0500
parents 078b795c5219
children d68381feb6cb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
1 /*
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
2
26376
00f796120a6d maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents: 25103
diff changeset
3 Copyright (C) 2012-2019 Max Brister
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
4
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
5 This file is part of Octave.
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
6
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24446
diff changeset
7 Octave is free software: you can redistribute it and/or modify it
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
8 under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24446
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
10 (at your option) any later version.
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
11
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
12 Octave is distributed in the hope that it will be useful, but
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22407
diff changeset
15 GNU General Public License for more details.
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
16
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24446
diff changeset
19 <https://www.gnu.org/licenses/>.
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
20
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
21 */
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
22
16768
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15592
diff changeset
23 // Author: Max Brister <max@2bass.com>
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 15592
diff changeset
24
20791
f7084eae3318 maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents: 19697
diff changeset
25 #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
26 #define octave_pt_jit_h 1
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
27
21244
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
28 #include "octave-config.h"
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
29
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21244
diff changeset
30 #if defined (HAVE_LLVM)
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
31
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
32 #include "jit-typeinfo.h"
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
33 #include "jit-ir.h"
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
34 #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
35 #include "symscope.h"
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
36
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
37 // 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
38 class octave_value_list;
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
39
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
40 namespace octave
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
41 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
42 namespace jit
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
43 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
44 #if defined (LEGACY_PASSMANAGER)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
45 typedef llvm::legacy::PassManager PassManager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
46 typedef llvm::legacy::FunctionPassManager FunctionPassManager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
47 #else
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
48 typedef llvm::PassManager PassManager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
49 typedef llvm::FunctionPassManager FunctionPassManager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
50 #endif
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
51
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
52 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
53 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
54 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
55
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
56 // 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
57 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
58 jit_convert : public tree_walker
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
59 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
60 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
61
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
62 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
63 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
64 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
65
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
66 jit_convert (tree& tee, jit_type *for_bounds = nullptr);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
67
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
68 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
69
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
70 template <typename ...Args>
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
71 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
72 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
73 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
74 return create_checked_impl (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
75 }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
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 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
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 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
80
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
81 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
82
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
83 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
84
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
85 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
86
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
87 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
88
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
89 void visit_argument_list (tree_argument_list&);
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_binary_expression (tree_binary_expression&);
23425
7dfa3bc8e3d5 handle boolean expressions separately in JIT compiler
John W. Eaton <jwe@octave.org>
parents: 23220
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_boolean_expression (tree_boolean_expression&);
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_break_command (tree_break_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_colon_expression (tree_colon_expression&);
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_continue_command (tree_continue_command&);
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_decl_command (tree_decl_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_decl_init_list (tree_decl_init_list&);
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_decl_elt (tree_decl_elt&);
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_simple_for_command (tree_simple_for_command&);
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_complex_for_command (tree_complex_for_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
110
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
111 void visit_octave_user_script (octave_user_script&);
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_octave_user_function (octave_user_function&);
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_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
116
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
117 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
118
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
119 void visit_function_def (tree_function_def&);
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_identifier (tree_identifier&);
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_if_clause (tree_if_clause&);
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_if_command (tree_if_command&);
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_if_command_list (tree_if_command_list&);
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_index_expression (tree_index_expression&);
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_matrix (tree_matrix&);
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_cell (tree_cell&);
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_multi_assignment (tree_multi_assignment&);
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_no_op_command (tree_no_op_command&);
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_constant (tree_constant&);
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_fcn_handle (tree_fcn_handle&);
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_funcall (tree_funcall&);
15842
896cf5769537 Add visit_funcall method to JIT tree walker.
Michael Goffioul <michael.goffioul@gmail.com>
parents: 15592
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_parameter_list (tree_parameter_list&);
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_postfix_expression (tree_postfix_expression&);
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_prefix_expression (tree_prefix_expression&);
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_return_command (tree_return_command&);
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_return_list (tree_return_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_simple_assignment (tree_simple_assignment&);
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_statement (tree_statement&);
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_statement_list (tree_statement_list&);
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_switch_case (tree_switch_case&);
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_switch_case_list (tree_switch_case_list&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
164
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
165 void visit_switch_command (tree_switch_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
166
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
167 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
168
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
169 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
170
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
171 void visit_while_command (tree_while_command&);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
172
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
173 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
174
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
175 private:
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
176
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
177 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
178 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
179
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
180 bool m_converting_function;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
181
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
182 // 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
183 symbol_scope m_scope;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
184
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
185 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
186
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
187 // 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
188 jit_value *m_result;
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 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
191
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
192 jit_block *m_final_block;
14938
bab44e3ee291 Adding basic error support to JIT
Max Brister <max@2bass.com>
parents: 14937
diff changeset
193
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
194 jit_block *m_block;
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 llvm::Function *m_function;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
197
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
198 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
199
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
200 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
201
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
202 size_t m_iterator_count;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
203 size_t m_for_bounds_count;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
204 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
205
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
206 variable_map m_vmap;
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
207
24361
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24270
diff changeset
208 void initialize (const symbol_scope& s);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
209
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
210 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
211
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
212 // 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
213 // created
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
214 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
215
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
216 // 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
217 // 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
218 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
219
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
220 // 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
221 // extract statement
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
222 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
223 bool isarg = true);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
224
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
225 // 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
226 // iterator counter will not be incremented.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
227 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
228 { 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
229
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
230 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
231 { 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
232
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
233 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
234 { 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
235
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
236 std::string next_name (const char *prefix, size_t& count, bool inc);
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
237
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
238 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
239 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
240
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
241 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
242 bool artificial = false);
14969
bbeef7b8ea2e Add support for matrix indexed assignment to JIT
Max Brister <max@2bass.com>
parents: 14968
diff changeset
243
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
244 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
245 bool artificial = false);
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
246
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
247 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
248
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
249 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
250
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
251 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
252 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
253 block_list m_continues;
14935
5801e031a3b5 Place releases after last use and generalize dom visiting
Max Brister <max@2bass.com>
parents: 14932
diff changeset
254
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
255 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
256 };
14928
39d52aa37a08 Use standard SSA construction algorithm, and support break/continue
Max Brister <max@2bass.com>
parents: 14926
diff changeset
257
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
258 // 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
259 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
260 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
261 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
262 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
263
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
264 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
265 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
266 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
267 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
268
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
269 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
270 const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
271 const std::list<jit_value *>& constants,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
272 octave_user_function& fcn,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
273 const std::vector<jit_type *>& args);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
274
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
275 // 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
276 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
277 { return m_argument_vec; }
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
278
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
279 #define JIT_METH(clname) \
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
280 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
281
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
282 JIT_VISIT_IR_CLASSES;
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
283
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
284 #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
285
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
286 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
287
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
288 // 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
289 std::map<std::string, int> m_argument_index;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
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 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
292
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
293 // 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
294 std::map<std::string, llvm::Value *> m_arguments;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
295
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
296 bool m_converting_function;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
297
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
298 // 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
299 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
300
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
301 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
302 llvm::BasicBlock *m_prelude;
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 convert (const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
305 const std::list<jit_value *>& constants);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
306
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
307 void finish_phi (jit_phi *phi);
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
308
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
309 void visit (jit_value *jvalue)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
310 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
311 return visit (*jvalue);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
312 }
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
313
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
314 void visit (jit_value& jvalue)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
315 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
316 jvalue.accept (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
317 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
318 };
14906
3f81e8b42955 JIT for loops over ranges
Max Brister <max@2bass.com>
parents: 14903
diff changeset
319
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
320 // 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
321 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
322 jit_infer
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
323 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
324 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
325
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
326 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
327
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
328 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
329 const variable_map& avmap);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
330
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
331 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
332
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
333 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
334
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
335 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
336
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
337 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
338
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
339 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
340 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
341 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
342 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
343
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
344 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
345
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
346 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
347
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
348 void construct_ssa (void);
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 do_construct_ssa (jit_block& block, size_t avisit_count);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
351
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
352 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
353
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
354 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
355
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
356 void place_releases (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 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
359
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
360 void remove_dead ();
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
361
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
362 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
363
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
364 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
365
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
366 void simplify_phi (void);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15183
diff changeset
367
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
368 void simplify_phi (jit_phi& phi);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
369 };
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
370
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
371
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
372 class jit_module;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
373
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
374 class
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
375 tree_jit
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
376 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
377 // ----- Constructor/destructor (singleton pattern) -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
378
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
379 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
380
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
381 ~tree_jit (void);
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
382
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
383 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
384
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
385 tree_jit (void);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
386 static tree_jit& instance (void);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
387
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
388 // ----- Initialization -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
389
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
390 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
391
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
392 static bool initialized;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
393 bool do_initialize (void);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
394
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
395 // ----- Target machine ----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
396
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
397 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
398
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
399 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
400 { return instance ().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 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
403
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
404 llvm::TargetMachine *target_machine;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
405
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
406 // ----- Create LLVM modules and engines -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
407
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
408 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
409
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
410 static jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
411 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
412
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
413 static jit::EngineOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
414 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
415
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
416 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
417
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
418 jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
419 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
420
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
421 // ----- 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
422
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
423 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
424
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
425 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
426 { 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
427
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
428 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
429 { 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
430
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
431 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
432
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
433 // 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
434 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
435 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
436 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
437 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
438
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
439 // ----- Symbol resolution -----
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
440
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
441 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
442
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
443 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
444 { 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
445
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
446 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
447 { return instance ().do_getSymbolAddress (name); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
448
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
449 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
450
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
451 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
452
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
453 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
454
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
455 // ----- Generate unique identifiers -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
456
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
457 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
458
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
459 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
460 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
461 return std::string ("jittedForLoop")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
462 + std::to_string (next_forloop_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
463 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
464 // 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
465
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
466 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
467 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
468 return std::string ("jittedFunction")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
469 + std::to_string (next_function_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
470 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
471 // 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
472
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
473 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
474 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
475 return std::string ("octaveJITModule")
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
476 + std::to_string (next_module_number ++);
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
477 }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
478 // 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
479
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
480 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
481
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
482 static int next_forloop_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
483 static int next_function_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
484 static int next_module_number;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
485
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
486 // ----- JIT and execute ASTs -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
487
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
488 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
489
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
490 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
491 const octave_value& bounds)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
492 { 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
493
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
494 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
495 { return instance ().do_execute (cmd); }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
496
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
497 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
498 const octave_value_list& args,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
499 octave_value_list& retval)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
500 { 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
501
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
502 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
503
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
504 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
505 const octave_value& bounds);
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
506
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
507 bool do_execute (tree_while_command& cmd);
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 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
510 const octave_value_list& args,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
511 octave_value_list& retval);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
512
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
513 // ----- Miscellaneous -----
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
514
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
515 bool enabled (void);
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
516
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
517 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
518 };
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
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
521 class
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
522 jit_module
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
523 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
524 // 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
525 // 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
526
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
527 // 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
528 // 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
529
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
530 public:
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 // 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
533 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
534 = 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
535
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
536 // Delete the underlying JIT engine
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
537 ~jit_module ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
538
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
539 // 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
540 llvm::Function*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
541 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
542 const llvm::Twine &name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
543
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
544 // 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
545 llvm::GlobalVariable*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
546 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
547 const llvm::Twine& name) const;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
548
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
549 // 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
550 // and return it
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
551 llvm::Function*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
552 get_intrinsic_declaration (size_t id,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
553 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
554
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
555 // 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
556 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
557
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
558 // 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
559 // 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
560 template <typename ptr_type>
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
561 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
562 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
563 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
564 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
565
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
566 // 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
567 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
568
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
569 // 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
570 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
571
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
572 // 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
573 // 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
574 void finalizeObject (void);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
575
24446
4ca5c9f899d3 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 24362
diff changeset
576 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
577
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
578 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
579
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
580 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
581 llvm::ExecutionEngine *m_engine;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
582 };
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
583
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
584
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
585 class
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
586 jit_info : public jit_module
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
587 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
588 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
589
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
590 // 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
591 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
592
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
593 jit_info (tree& tee);
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 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
596
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
597 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
598
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
599 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
600
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
601 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
602
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
603 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
604
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
605 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
606 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
607 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
608
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
609 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
610
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
611 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
612
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
613 // 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
614 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
615 jited_function m_function;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
616
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
617 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
618 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
619 };
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
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
622 class
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
623 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
624 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
625 public:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
626
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
627 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
628 const octave_value_list& ov_args);
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
629
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
630 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
631 octave_value_list& retval) const;
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
632
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
633 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
634
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
635 private:
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
636
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
637 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
638
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24239
diff changeset
639 // 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
640 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
641 jited_function m_function;
14913
c7071907a641 Use symbol_record_ref instead of names in JIT
Max Brister <max@2bass.com>
parents: 14911
diff changeset
642
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
643 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
644 };
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24238
diff changeset
645 }
14937
78e1457c5bf5 Remove some macros from pt-jit.h and pt-jit.cc
Max Brister <max@2bass.com>
parents: 14936
diff changeset
646
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
647 #endif
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
648
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
649 #endif