Mercurial > octave
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 |
rev | line source |
---|---|
14899 | 1 /* |
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 | 4 |
5 This file is part of Octave. | |
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 | 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 | 16 |
17 You should have received a copy of the GNU General Public License | |
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 | 20 |
21 */ | |
22 | |
16768 | 23 // Author: Max Brister <max@2bass.com> |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 |