annotate libinterp/parse-tree/pt-jit.cc @ 27929:265b386f8b20

maint: Use two spaces between sentences in code comments. * Canvas.cc, Figure.cc, ObjectProxy.cc, documentation.cc, gui-preferences-sc.h, gui-settings.cc, file-editor-tab.cc, file-editor.cc, find-dialog.cc, octave-qscintilla.cc, main-window.cc, qt-interpreter-events.cc, resource-manager.cc, workspace-model.cc, gl2ps-print.cc, graphics.cc, ls-hdf5.cc, urlwrite.cc, __ode15__.cc, gzip.cc, pt-anon-scopes.cc, pt-jit.cc, DASPK.cc, url-transfer.cc: Use two spaces between sentences in code comments.
author Rik <rik@octave.org>
date Fri, 10 Jan 2020 12:10:13 -0800
parents bd51beb6205e
children c20b7290c778
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
3 // Copyright (C) 2012-2020 The Octave Project Developers
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
25
16768
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 16442
diff changeset
26 // Author: Max Brister <max@2bass.com>
e2de3c8882be copyright notice fixes
John W. Eaton <jwe@octave.org>
parents: 16442
diff changeset
27
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
28 #define __STDC_LIMIT_MACROS
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
29 #define __STDC_CONSTANT_MACROS
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
30
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
31 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
32 # include "config.h"
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
33 #endif
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
34
25438
cb1606f78f6b prefer <istream>, <ostream>, or <iosfwd> to <iostream> where possible
John W. Eaton <jwe@octave.org>
parents: 25343
diff changeset
35 #include <sstream>
23170
b3f2645803fe Add headers needed on MacOS to avoid "implicit instantiation of undefined
Mike Miller <mtmiller@octave.org>
parents: 23137
diff changeset
36 #include <string>
b3f2645803fe Add headers needed on MacOS to avoid "implicit instantiation of undefined
Mike Miller <mtmiller@octave.org>
parents: 23137
diff changeset
37
23137
334119c390b3 move bp_table class to separate file
John W. Eaton <jwe@octave.org>
parents: 23126
diff changeset
38 #include "bp-table.h"
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
39 #include "defun.h"
21109
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
40 #include "errwarn.h"
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
41 #include "ov.h"
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
42 #include "pager.h"
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
43 #include "pt-all.h"
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
44 #include "pt-jit.h"
15595
6e780fb15c14 Make Vdebug_on_interrupt not be static
Max Brister <max@2bass.com>
parents: 15593
diff changeset
45 #include "sighandlers.h"
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
46 #include "symtab.h"
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
47 #include "variables.h"
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
48 #include "interpreter-private.h"
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
49
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
50 // Programming Note: As of hg id 2b2c8ac44cd2, this file builds with
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
51 // LLVM 3.8 but not with 3.9 (or probably any later version).
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
52
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
53 #if defined (HAVE_LLVM)
16131
e125db98263f build: Eliminate 2 unused variable warnings when not compiling with JIT.
Rik <rik@octave.org>
parents: 15893
diff changeset
54
14903
54ea692b8ab5 Reworking JIT implementation
Max Brister <max@2bass.com>
parents: 14901
diff changeset
55 #include <llvm/Analysis/CallGraph.h>
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
56 #include <llvm/Analysis/Passes.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
57
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
58 #if defined (HAVE_LLVM_IR_VERIFIER_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
59 # include <llvm/IR/Verifier.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
60 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
61 # include <llvm/Analysis/Verifier.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
62 #endif
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
63
24245
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
64 #if defined (HAVE_LLVM_ANALYSIS_BASICALIASANALYSIS_H)
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
65 // In LLVM 3.8.x and later, we use createBasicAAWrapperPass from:
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
66 # include <llvm/Analysis/BasicAliasAnalysis.h>
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
67 #endif
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
68 // In LLVM 3.7.x and earlier, we use createBasicAliasAnalysisPass
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
69 // from llvm/Analysis/Passes.h (already included above)
b3b7677334f6 jit: pt-jit.cc: Use createBasicAAWrapperPass instead of createBasicAliasAnalysisPass
Julien Bect <jbect@users.sourceforge.net>
parents: 24244
diff changeset
70
26539
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
71 #if defined (HAVE_LLVM_BITCODE_READERWRITER_H)
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
72 // In LLVM <= 3.9, only one header for bitcode read/writer
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
73 # include <llvm/Bitcode/ReaderWriter.h>
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
74 #else
26544
6657213145e5 libinterp/parse-tree/pt-jit.cc: comment: Fix a typo
Julien Bect <jbect@users.sourceforge.net>
parents: 26542
diff changeset
75 // Starting with LLVM 4.0, two separate headers
26539
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
76 # include <llvm/Bitcode/BitcodeReader.h>
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
77 # include <llvm/Bitcode/BitcodeWriter.h>
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
78 #endif
ed1dad5e71c3 jit: configure: Check if llvm/Bitcode/ReaderWriter.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26538
diff changeset
79
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
80 #include <llvm/ExecutionEngine/ExecutionEngine.h>
25117
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
81 // old JIT, LLVM < 3.6.0
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
82 // #include <llvm/ExecutionEngine/JIT.h>
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
83 // MCJIT, LLVM >= 3.0.0
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
84 #include <llvm/ExecutionEngine/MCJIT.h>
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
85 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
86
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
87 #if defined (LEGACY_PASSMANAGER)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
88 # include <llvm/IR/LegacyPassManager.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
89 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
90 # include <llvm/PassManager.h>
18831
4a4edf0f2077 fix LLVM 3.4 build (bug #41061)
Stefan Mahr <dac922@gmx.de>
parents: 18692
diff changeset
91 #endif
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
92
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
93 #if defined (HAVE_LLVM_IR_FUNCTION_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
94 # include <llvm/IR/LLVMContext.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
95 # include <llvm/IR/Module.h>
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
96 # include <llvm/IR/Intrinsics.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
97 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
98 # include <llvm/LLVMContext.h>
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
99 # include <llvm/Module.h>
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
100 # include <llvm/Intrinsics.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
101 #endif
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
102
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
103 #if defined (HAVE_LLVM_SUPPORT_IRBUILDER_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
104 # include <llvm/Support/IRBuilder.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
105 #elif defined(HAVE_LLVM_IR_IRBUILDER_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
106 # include <llvm/IR/IRBuilder.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16941
diff changeset
107 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
108 # include <llvm/IRBuilder.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16941
diff changeset
109 #endif
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
110
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
111 #include <llvm/Support/raw_os_ostream.h>
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
112 #include <llvm/Support/TargetSelect.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
113
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21578
diff changeset
114 #if defined (HAVE_LLVM_IR_DATALAYOUT_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
115 # include <llvm/IR/DataLayout.h>
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
116 #elif defined(HAVE_LLVM_DATALAYOUT_H)
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
117 # include <llvm/DataLayout.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16941
diff changeset
118 #else
21200
fcac5dbbf9ed maint: Indent #ifdef blocks in libinterp.
Rik <rik@octave.org>
parents: 21109
diff changeset
119 # include <llvm/Target/TargetData.h>
17031
38bcfd413db0 Handle LLVM API incoherence. Octave now works with LLVM 3.0, 3.1, and 3.2
LYH <lyh.kernel@gmail.com>
parents: 16941
diff changeset
120 #endif
17164
36fd98b9ce48 Add support for llvm 3.3
Max Brister <max@2bass.com>
parents: 17031
diff changeset
121
15016
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
122 #include <llvm/Transforms/IPO.h>
005cb78e1dd1 Split pt-jit into multiple files.
Max Brister <max@2bass.com>
parents: 15014
diff changeset
123 #include <llvm/Transforms/Scalar.h>
14899
f25d2224fa02 Initial JIT support
Max Brister <max@2bass.com>
parents:
diff changeset
124
26537
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
125 // Starting with LLVM 3.9.0, llvm::createGVNPass has
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
126 // been moved to a new header file named GVN.h
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
127 // (before that it was in llvm/Transforms/Scalar.h)
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
128 #if defined (HAVE_LLVM_TRANSFORMS_SCALAR_GVN_H)
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
129 # include <llvm/Transforms/Scalar/GVN.h>
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
130 #endif
7a77eb39c7f0 jit: configure: Check if llvm/Transforms/Scalar/GVN.h exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26535
diff changeset
131
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
132 static bool Vdebug_jit = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
133
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
134 static bool Vjit_enable = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
135
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
136 static int Vjit_startcnt = 1000;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
137
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
138 static int Vjit_failcnt = 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
139
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
140 namespace octave
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
141 {
26542
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
142 namespace jit
26617
98afb8bbd1f6 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 26544
diff changeset
143 {
26542
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
144 #if defined (LEGACY_PASSMANAGER)
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
145 typedef llvm::legacy::PassManager PassManager;
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
146 typedef llvm::legacy::FunctionPassManager FunctionPassManager;
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
147 #else
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
148 typedef llvm::PassManager PassManager;
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
149 typedef llvm::FunctionPassManager FunctionPassManager;
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
150 #endif
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
151 }
e590d8ad9ed0 jit: Remove jit::PassManager and jit::FunctionPassManager from public API
Julien Bect <jbect@users.sourceforge.net>
parents: 26540
diff changeset
152
26535
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26403
diff changeset
153 static llvm::IRBuilder<> builder (tree_jit::llvm_context);
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26403
diff changeset
154
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26403
diff changeset
155 static llvm::LLVMContext& context = tree_jit::llvm_context;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
156
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
157 // -------------------- jit_break_exception --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
158
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
159 // jit_break is thrown whenever a branch we are converting has only breaks or
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
160 // continues. This is because all code that follows a break or continue
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
161 // is dead.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
162 class jit_break_exception : public std::exception
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
163 { };
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
164
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
165 // -------------------- jit_convert --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
166 jit_convert::jit_convert (tree& tee, jit_type *for_bounds)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
167 : m_converting_function (false)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
168 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
169 initialize (__get_current_scope__ ("jit_convert::jit_convert"));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
170
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
171 if (for_bounds)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
172 create_variable (next_for_bounds (false), for_bounds);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
173
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
174 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
175 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
176 visit (tee);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
177 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
178 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
179 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
180
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
181 // breaks must have been handled by the top level loop
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
182 assert (m_breaks.empty ());
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
183 assert (m_continues.empty ());
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
184
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
185 m_block->append (m_factory.create<jit_branch> (m_final_block));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
186 m_blocks.push_back (m_final_block);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
187
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
188 for (auto iter = m_vmap.begin (); iter != m_vmap.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
189 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
190 jit_variable *var = iter->second;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
191 const std::string& name = var->name ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
192 if (name.size () && name[0] != '#')
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
193 m_final_block->append (m_factory.create<jit_store_argument> (var));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
194 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
195
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
196 m_final_block->append (m_factory.create<jit_return> ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
197 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
198
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
199 jit_convert::jit_convert (octave_user_function& fcn,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
200 const std::vector<jit_type *>& args)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
201 : m_converting_function (true)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
202 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
203 initialize (fcn.scope ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
204
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
205 tree_parameter_list *plist = fcn.parameter_list ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
206 tree_parameter_list *rlist = fcn.return_list ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
207 if (plist && plist->takes_varargs ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
208 throw jit_fail_exception ("varags not supported");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
209
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
210 if (rlist && (rlist->size () > 1 || rlist->takes_varargs ()))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
211 throw jit_fail_exception ("multiple returns not supported");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
212
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
213 if (plist)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
214 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
215 auto piter = plist->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
216 for (size_t i = 0; i < args.size (); ++i, ++piter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
217 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
218 if (piter == plist->end ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
219 throw jit_fail_exception ("Too many parameter to function");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
220
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
221 tree_decl_elt *elt = *piter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
222 std::string name = elt->name ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
223 create_variable (name, args[i]);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
224 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
225 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
226
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
227 jit_value *return_value = nullptr;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
228 bool all_breaking = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
229 if (fcn.is_special_expr ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
230 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
231 tree_expression *expr = fcn.special_expr ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
232 if (expr)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
233 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
234 jit_variable *retvar = get_variable ("#return");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
235 jit_value *retval = nullptr;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
236 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
237 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
238 retval = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
239 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
240 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
241 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
242
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
243 if (m_breaks.size () || m_continues.size ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
244 throw jit_fail_exception ("break/continue not supported in "
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
245 "anonymous functions");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
246
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
247 m_block->append (m_factory.create<jit_assign> (retvar, retval));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
248 return_value = retvar;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
249 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
250 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
251 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
252 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
253 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
254 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
255 visit_statement_list (*fcn.body ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
256 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
257 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
258 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
259 all_breaking = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
260 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
261
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
262 // the user may use break or continue to exit the function
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
263 finish_breaks (m_final_block, m_continues);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
264 finish_breaks (m_final_block, m_breaks);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
265 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
266
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
267 if (! all_breaking)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
268 m_block->append (m_factory.create<jit_branch> (m_final_block));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
269
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
270 m_blocks.push_back (m_final_block);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
271 m_block = m_final_block;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
272
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
273 if (! return_value && rlist && rlist->size () == 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
274 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
275 tree_decl_elt *elt = rlist->front ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
276 return_value = get_variable (elt->name ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
277 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
278
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
279 // FIXME: We should use live range analysis to delete variables where
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
280 // needed. For now we just delete everything at the end of the function.
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
281 for (auto iter = m_vmap.begin ();
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
282 iter != m_vmap.end ();
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
283 ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
284 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
285 if (iter->second != return_value)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
286 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
287 jit_call *call;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
288 call = m_factory.create<jit_call> (&jit_typeinfo::destroy,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
289 iter->second);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
290 m_final_block->append (call);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
291 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
292 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
293
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
294 if (return_value)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
295 m_final_block->append (m_factory.create<jit_return> (return_value));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
296 else
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
297 m_final_block->append (m_factory.create<jit_return> ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
298 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
299
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
300 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
301 jit_convert::visit_anon_fcn_handle (tree_anon_fcn_handle&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
302 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
303 throw jit_fail_exception ("No visit_anon_fcn_handle implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
304 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
305
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
306 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
307 jit_convert::visit_argument_list (tree_argument_list&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
308 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
309 throw jit_fail_exception ("No visit_argument_list implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
310 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
311
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
312 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
313 jit_convert::visit_binary_expression (tree_binary_expression& be)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
314 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
315 tree_expression *lhs = be.lhs ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
316 jit_value *lhsv = visit (lhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
317
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
318 tree_expression *rhs = be.rhs ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
319 jit_value *rhsv = visit (rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
320
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
321 const jit_operation& fn = jit_typeinfo::binary_op (be.op_type ());
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
322 m_result = create_checked (fn, lhsv, rhsv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
323 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
324
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
325 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
326 jit_convert::visit_boolean_expression (tree_boolean_expression& be)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
327 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
328 bool is_and = be.op_type () == tree_boolean_expression::bool_and;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
329
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
330 std::string short_name = next_shortcircut_result ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
331 jit_variable *short_result = m_factory.create<jit_variable> (short_name);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
332 m_vmap[short_name] = short_result;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
333
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
334 jit_block *done = m_factory.create<jit_block> (m_block->name ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
335 tree_expression *lhs = be.lhs ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
336 jit_value *lhsv = visit (lhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
337 lhsv = create_checked (&jit_typeinfo::logically_true, lhsv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
338
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
339 jit_block *short_early = m_factory.create<jit_block> ("short_early");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
340 m_blocks.push_back (short_early);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
341
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
342 jit_block *short_cont = m_factory.create<jit_block> ("short_cont");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
343
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
344 if (is_and)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
345 m_block->append (m_factory.create<jit_cond_branch> (lhsv, short_cont,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
346 short_early));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
347 else
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
348 m_block->append (m_factory.create<jit_cond_branch> (lhsv, short_early,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
349 short_cont));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
350
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
351 m_block = short_early;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
352
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
353 jit_value *early_result = m_factory.create<jit_const_bool> (! is_and);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
354 m_block->append (m_factory.create<jit_assign> (short_result, early_result));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
355 m_block->append (m_factory.create<jit_branch> (done));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
356
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
357 m_blocks.push_back (short_cont);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
358 m_block = short_cont;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
359
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
360 tree_expression *rhs = be.rhs ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
361 jit_value *rhsv = visit (rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
362 rhsv = create_checked (&jit_typeinfo::logically_true, rhsv);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
363 m_block->append (m_factory.create<jit_assign> (short_result, rhsv));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
364 m_block->append (m_factory.create<jit_branch> (done));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
365
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
366 m_blocks.push_back (done);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
367 m_block = done;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
368 m_result = short_result;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
369 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
370
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
371 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
372 jit_convert::visit_break_command (tree_break_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
373 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
374 m_breaks.push_back (m_block);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
375 throw jit_break_exception ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
376 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
377
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
378 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
379 jit_convert::visit_colon_expression (tree_colon_expression& expr)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
380 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
381 // in the futher we need to add support for classes and deal with rvalues
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
382 jit_value *base = visit (expr.base ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
383 jit_value *limit = visit (expr.limit ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
384 jit_value *increment;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
385 tree_expression *tinc = expr.increment ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
386
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
387 if (tinc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
388 increment = visit (tinc);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
389 else
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
390 increment = m_factory.create<jit_const_scalar> (1);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
391
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
392 m_result = m_block->append (m_factory.create<jit_call> (jit_typeinfo::make_range,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
393 base, limit, increment));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
394 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
395
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
396 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
397 jit_convert::visit_continue_command (tree_continue_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
398 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
399 m_continues.push_back (m_block);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
400 throw jit_break_exception ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
401 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
402
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
403 void
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
404 jit_convert::visit_decl_command (tree_decl_command&)
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
405 {
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
406 throw jit_fail_exception ("No visit_decl_command implementation");
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
407 }
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
408
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
409 void
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
410 jit_convert::visit_decl_elt (tree_decl_elt&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
411 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
412 throw jit_fail_exception ("No visit_decl_elt implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
413 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
414
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
415 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
416 jit_convert::visit_decl_init_list (tree_decl_init_list&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
417 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
418 throw jit_fail_exception ("No visit_decl_init_list implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
419 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
420
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
421 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
422 jit_convert::visit_simple_for_command (tree_simple_for_command& cmd)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
423 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
424 // Note we do an initial check to see if the loop will run atleast once.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
425 // This allows us to get better type inference bounds on variables defined
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
426 // and used only inside the for loop (e.g., the index variable)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
427
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
428 // If we are a nested for loop we need to store the previous breaks
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
429 unwind_protect frame;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
430 frame.protect_var (m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
431 frame.protect_var (m_continues);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
432 m_breaks.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
433 m_continues.clear ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
434
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
435 // Need a variable for our iterator, because it is used in multiple blocks
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
436 std::string iter_name = next_iterator ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
437 jit_variable *iterator = m_factory.create<jit_variable> (iter_name);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
438 m_factory.create<jit_variable> (iter_name);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
439 m_vmap[iter_name] = iterator;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
440
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
441 jit_block *body = m_factory.create<jit_block> ("for_body");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
442 jit_block *tail = m_factory.create<jit_block> ("for_tail");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
443
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
444 // Do control expression, iter init, and condition check in prev_block
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
445 // (block).
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
446 // if we are the top level for loop, the bounds is an input argument.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
447 jit_value *control = find_variable (next_for_bounds ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
448 if (! control)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
449 control = visit (cmd.control_expr ());
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
450 jit_call *init_iter = m_factory.create<jit_call> (jit_typeinfo::for_init,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
451 control);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
452 m_block->append (init_iter);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
453 m_block->append (m_factory.create<jit_assign> (iterator, init_iter));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
454
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
455 jit_call *check = m_factory.create<jit_call> (jit_typeinfo::for_check,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
456 control, iterator);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
457 m_block->append (check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
458 m_block->append (m_factory.create<jit_cond_branch> (check, body, tail));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
459
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
460 m_blocks.push_back (body);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
461 m_block = body;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
462
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
463 // compute the syntactical iterator
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
464 jit_call *idx_rhs = m_factory.create<jit_call> (jit_typeinfo::for_index,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
465 control, iterator);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
466 m_block->append (idx_rhs);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
467 do_assign (cmd.left_hand_side (), idx_rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
468
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
469 // do loop
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
470 tree_statement_list *pt_body = cmd.body ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
471 bool all_breaking = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
472 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
473 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
474 pt_body->accept (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
475 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
476 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
477 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
478 if (m_continues.empty ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
479 {
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
480 // WTF are you doing user? Every branch was a break, why did you
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
481 // have a loop??? Users are silly people...
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
482 finish_breaks (tail, m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
483 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
484 m_block = tail;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
485 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
486 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
487
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
488 all_breaking = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
489 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
490
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
491 // check our condition, continues jump to this block
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
492 jit_block *check_block = m_factory.create<jit_block> ("for_check");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
493 m_blocks.push_back (check_block);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
494
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
495 jit_block *interrupt_check = m_factory.create<jit_block> ("for_interrupt");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
496 m_blocks.push_back (interrupt_check);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
497
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
498 if (! all_breaking)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
499 m_block->append (m_factory.create<jit_branch> (check_block));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
500 finish_breaks (check_block, m_continues);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
501
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
502 m_block = check_block;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
503 const jit_operation& add_fn = jit_typeinfo::binary_op (octave_value::op_add);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
504 jit_value *one = m_factory.create<jit_const_index> (1);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
505 jit_call *iter_inc = m_factory.create<jit_call> (add_fn, iterator, one);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
506 m_block->append (iter_inc);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
507 m_block->append (m_factory.create<jit_assign> (iterator, iter_inc));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
508 check = m_block->append (m_factory.create<jit_call> (jit_typeinfo::for_check,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
509 control, iterator));
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
510 m_block->append (m_factory.create<jit_cond_branch> (check, interrupt_check,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
511 tail));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
512
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
513 m_block = interrupt_check;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
514 jit_error_check *ec
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
515 = m_factory.create<jit_error_check> (jit_error_check::var_interrupt,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
516 body, m_final_block);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
517 m_block->append (ec);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
518
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
519 // breaks will go to our tail
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
520 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
521 finish_breaks (tail, m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
522 m_block = tail;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
523 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
524
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
525 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
526 jit_convert::visit_complex_for_command (tree_complex_for_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
527 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
528 throw jit_fail_exception ("No visit_complex_for_command implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
529 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
530
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
531 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
532 jit_convert::visit_octave_user_script (octave_user_script&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
533 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
534 throw jit_fail_exception ("No visit_octave_user_script implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
535 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
536
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
537 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
538 jit_convert::visit_octave_user_function (octave_user_function&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
539 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
540 throw jit_fail_exception ("No visit_octave_user_function implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
541 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
542
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
543 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
544 jit_convert::visit_octave_user_function_header (octave_user_function&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
545 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
546 throw jit_fail_exception ("No visit_octave_user_function_header implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
547 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
548
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
549 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
550 jit_convert::visit_octave_user_function_trailer (octave_user_function&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
551 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
552 throw jit_fail_exception ("No visit_octave_user_function_trailer implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
553 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
554
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
555 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
556 jit_convert::visit_function_def (tree_function_def&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
557 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
558 throw jit_fail_exception ("No visit_function_def implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
559 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
560
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
561 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
562 jit_convert::visit_identifier (tree_identifier& ti)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
563 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
564 if (ti.has_magic_end ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
565 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
566 if (! m_end_context.size ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
567 throw jit_fail_exception ("Illegal end");
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
568 m_result = m_block->append (m_factory.create<jit_magic_end> (m_end_context));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
569 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
570 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
571 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
572 jit_variable *var = get_variable (ti.name ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
573 jit_instruction *instr;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
574 instr = m_factory.create<jit_call> (&jit_typeinfo::grab, var);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
575 m_result = m_block->append (instr);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
576 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
577 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
578
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
579 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
580 jit_convert::visit_if_clause (tree_if_clause&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
581 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
582 throw jit_fail_exception ("No visit_if_clause implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
583 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
584
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
585 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
586 jit_convert::visit_if_command_list (tree_if_command_list& lst)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
587 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
588 tree_if_clause *last = lst.back ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
589 size_t last_else = static_cast<size_t> (last->is_else_clause ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
590
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
591 // entry_blocks represents the block you need to enter in order to execute
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
592 // the condition check for the ith clause. For the else, it is simple the
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
593 // else body. If there is no else body, then it is padded with the tail.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
594 std::vector<jit_block *> entry_blocks (lst.size () + 1 - last_else);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
595 entry_blocks[0] = m_block;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
596
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
597 // Need to construct blocks first, because they have jumps to each other.
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
598 auto iter = lst.begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
599 ++iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
600 for (size_t i = 1; iter != lst.end (); ++iter, ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
601 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
602 tree_if_clause *tic = *iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
603 if (tic->is_else_clause ())
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
604 entry_blocks[i] = m_factory.create<jit_block> ("else");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
605 else
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
606 entry_blocks[i] = m_factory.create<jit_block> ("ifelse_cond");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
607 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
608
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
609 jit_block *tail = m_factory.create<jit_block> ("if_tail");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
610 if (! last_else)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
611 entry_blocks[entry_blocks.size () - 1] = tail;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
612
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
613 // each branch in the if statement will have different breaks/continues
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
614 block_list current_breaks = m_breaks;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
615 block_list current_continues = m_continues;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
616 m_breaks.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
617 m_continues.clear ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
618
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
619 size_t num_incoming = 0; // number of incoming blocks to our tail
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
620 iter = lst.begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
621 for (size_t i = 0; iter != lst.end (); ++iter, ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
622 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
623 tree_if_clause *tic = *iter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
624 m_block = entry_blocks[i];
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
625 assert (m_block);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
626
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
627 if (i) // the first block is prev_block, so it has already been added
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
628 m_blocks.push_back (entry_blocks[i]);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
629
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
630 if (! tic->is_else_clause ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
631 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
632 tree_expression *expr = tic->condition ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
633 jit_value *cond = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
634 jit_call *check = create_checked (&jit_typeinfo::logically_true,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
635 cond);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
636 jit_block *body = m_factory.create<jit_block> (i == 0 ? "if_body"
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
637 : "ifelse_body");
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
638 m_blocks.push_back (body);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
639
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
640 jit_instruction *br = m_factory.create<jit_cond_branch> (check,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
641 body,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
642 entry_blocks[i + 1]);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
643 m_block->append (br);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
644 m_block = body;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
645 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
646
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
647 tree_statement_list *stmt_lst = tic->commands ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
648 assert (stmt_lst); // jwe: Can this be null?
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
649
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
650 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
651 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
652 stmt_lst->accept (*this);
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
653 ++num_incoming;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
654 m_block->append (m_factory.create<jit_branch> (tail));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
655 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
656 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
657 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
658
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
659 current_breaks.splice (current_breaks.end (), m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
660 current_continues.splice (current_continues.end (), m_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
661 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
662
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
663 m_breaks.splice (m_breaks.end (), current_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
664 m_continues.splice (m_continues.end (), current_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
665
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
666 if (num_incoming || ! last_else)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
667 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
668 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
669 m_block = tail;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
670 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
671 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
672 // every branch broke, so we don't have a tail
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
673 throw jit_break_exception ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
674 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
675
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
676 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
677 jit_convert::visit_index_expression (tree_index_expression& exp)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
678 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
679 m_result = resolve (exp);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
680 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
681
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
682 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
683 jit_convert::visit_matrix (tree_matrix&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
684 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
685 throw jit_fail_exception ("No visit_matrix implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
686 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
687
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
688 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
689 jit_convert::visit_cell (tree_cell&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
690 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
691 throw jit_fail_exception ("No visit_cell implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
692 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
693
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
694 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
695 jit_convert::visit_multi_assignment (tree_multi_assignment&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
696 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
697 throw jit_fail_exception ("No visit_multi_assignment implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
698 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
699
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
700 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
701 jit_convert::visit_no_op_command (tree_no_op_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
702 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
703 throw jit_fail_exception ("No visit_no_op_command implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
704 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
705
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
706 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
707 jit_convert::visit_constant (tree_constant& tc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
708 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
709 octave_value v = tc.value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
710
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
711 jit_type *ty = jit_typeinfo::type_of (v);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
712
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
713 if (ty == jit_typeinfo::get_scalar ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
714 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
715 double dv = v.double_value ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
716 m_result = m_factory.create<jit_const_scalar> (dv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
717 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
718 else if (ty == jit_typeinfo::get_range ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
719 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
720 Range rv = v.range_value ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
721 m_result = m_factory.create<jit_const_range> (rv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
722 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
723 else if (ty == jit_typeinfo::get_complex ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
724 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
725 Complex cv = v.complex_value ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
726 m_result = m_factory.create<jit_const_complex> (cv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
727 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
728 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
729 throw jit_fail_exception ("Unknown constant");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
730 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
731
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
732 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
733 jit_convert::visit_fcn_handle (tree_fcn_handle&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
734 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
735 throw jit_fail_exception ("No visit_fcn_handle implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
736 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
737
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
738 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
739 jit_convert::visit_parameter_list (tree_parameter_list&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
740 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
741 throw jit_fail_exception ("No visit_parameter_list implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
742 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
743
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
744 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
745 jit_convert::visit_postfix_expression (tree_postfix_expression& tpe)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
746 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
747 octave_value::unary_op etype = tpe.op_type ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
748 tree_expression *operand = tpe.operand ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
749 jit_value *operandv = visit (operand);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
750
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
751 const jit_operation& fn = jit_typeinfo::unary_op (etype);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
752 m_result = create_checked (fn, operandv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
753
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
754 if (etype == octave_value::op_incr || etype == octave_value::op_decr)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
755 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
756 jit_value *ret = create_checked (&jit_typeinfo::grab, operandv);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
757 do_assign (operand, m_result);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
758 m_result = ret;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
759 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
760 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
761
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
762 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
763 jit_convert::visit_prefix_expression (tree_prefix_expression& tpe)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
764 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
765 octave_value::unary_op etype = tpe.op_type ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
766 tree_expression *operand = tpe.operand ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
767 const jit_operation& fn = jit_typeinfo::unary_op (etype);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
768 m_result = create_checked (fn, visit (operand));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
769
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
770 if (etype == octave_value::op_incr || etype == octave_value::op_decr)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
771 do_assign (operand, m_result);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
772 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
773
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
774 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
775 jit_convert::visit_return_command (tree_return_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
776 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
777 throw jit_fail_exception ("No visit_return_command implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
778 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
779
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
780 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
781 jit_convert::visit_return_list (tree_return_list&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
782 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
783 throw jit_fail_exception ("No visit_return_list implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
784 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
785
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
786 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
787 jit_convert::visit_simple_assignment (tree_simple_assignment& tsa)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
788 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
789 tree_expression *rhs = tsa.right_hand_side ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
790 jit_value *rhsv = visit (rhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
791 octave_value::assign_op op = tsa.op_type ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
792
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
793 if (op != octave_value::op_asn_eq)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
794 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
795 // Do the equivalent binary operation, then assign.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
796 // This is always correct, but it isn't always optimal.
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
797 tree_expression *lhs = tsa.left_hand_side ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
798 jit_value *lhsv = visit (lhs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
799 octave_value::binary_op bop = octave_value::assign_op_to_binary_op (op);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
800 const jit_operation& fn = jit_typeinfo::binary_op (bop);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
801 rhsv = create_checked (fn, lhsv, rhsv);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
802 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
803
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
804 m_result = do_assign (tsa.left_hand_side (), rhsv);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
805 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
806
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
807 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
808 jit_convert::visit_statement (tree_statement& stmt)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
809 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
810 tree_command *cmd = stmt.command ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
811 tree_expression *expr = stmt.expression ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
812
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
813 if (cmd)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
814 visit (cmd);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
815 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
816 {
25336
389757b7b6af eliminate redundant octave:: namespace tags
John W. Eaton <jwe@octave.org>
parents: 25117
diff changeset
817 // stolen from tree_evaluator::visit_statement
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
818 bool do_bind_ans = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
819
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
820 if (expr->is_identifier ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
821 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
822 tree_identifier *id = dynamic_cast<tree_identifier *> (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
823
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
824 do_bind_ans = (! id->is_variable (m_scope.current_context ()));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
825 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
826 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
827 do_bind_ans = (! expr->is_assignment_expression ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
828
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
829 jit_value *expr_result = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
830
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
831 if (do_bind_ans)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
832 do_assign ("ans", expr_result, expr->print_result ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
833 else if (expr->is_identifier () && expr->print_result ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
834 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
835 // FIXME: ugly hack, we need to come up with a way to pass
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
836 // nargout to visit_identifier
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
837 const jit_operation& fn = jit_typeinfo::print_value ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
838 jit_const_string *name = m_factory.create<jit_const_string>
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
839 (expr->name ());
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
840 m_block->append (m_factory.create<jit_call> (fn, name,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
841 expr_result));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
842 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
843 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
844 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
845
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
846 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
847 jit_convert::visit_switch_case (tree_switch_case&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
848 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
849 throw jit_fail_exception ("No visit_switch_case implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
850 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
851
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
852 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
853 jit_convert::visit_switch_case_list (tree_switch_case_list&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
854 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
855 throw jit_fail_exception ("No visit_switch_case_list implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
856 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
857
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
858 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
859 jit_convert::visit_switch_command (tree_switch_command& cmd)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
860 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
861 tree_switch_case_list *lst = cmd.case_list ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
862
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
863 // always visit switch expression
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
864 tree_expression *expr = cmd.switch_value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
865 assert (expr && "Switch value can not be null");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
866 jit_value *value = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
867 assert (value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
868
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
869 size_t case_blocks_num = lst->size ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
870
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
871 if (! case_blocks_num) // there's nothing to do
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
872 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
873
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
874 // check for otherwise, it's interpreted as last 'else' condition
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
875 size_t has_otherwise = 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
876 tree_switch_case *last = lst->back ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
877 if (last->is_default_case ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
878 has_otherwise = 1;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
879
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
880 std::vector<jit_block *> entry_blocks (case_blocks_num+1 - has_otherwise);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
881
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
882 // the first entry point is always the actual block. Afterward, new blocks
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
883 // are created for every case and the otherwise branch
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
884 entry_blocks[0] = m_block;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
885 for (size_t i = 1; i < case_blocks_num; ++i)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
886 entry_blocks[i] = m_factory.create<jit_block> ("case_cond");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
887
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
888 jit_block *tail = m_factory.create<jit_block> ("switch_tail");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
889
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
890 // if there's no otherwise branch, the 'else' of the last branch
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
891 // has to point to the tail
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
892 if (! has_otherwise)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
893 entry_blocks[entry_blocks.size()-1] = tail;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
894
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
895 // each branch in the case statement will have different breaks/continues
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
896 block_list current_breaks = m_breaks;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
897 block_list current_continues = m_continues;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
898 m_breaks.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
899 m_continues.clear ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
900
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
901 size_t num_incoming = 0; // number of incoming blocks to our tail
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
902
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
903 auto iter = lst->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
904 for (size_t i = 0; i < case_blocks_num; ++iter, ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
905 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
906 tree_switch_case *twc = *iter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
907 m_block = entry_blocks[i]; // case_cond
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
908 assert (m_block);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
909
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
910 if (i)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
911 m_blocks.push_back (entry_blocks[i]); // first block already pushed
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
912
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
913 if (! twc->is_default_case ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
914 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
915 // compare result of switch expression with actual case label
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
916 tree_expression *te = twc->case_label ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
917 jit_value *label = visit (te);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
918 assert(label);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
919
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
920 const jit_operation& fn = jit_typeinfo::binary_op (octave_value::op_eq);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
921 jit_value *cond = create_checked (fn, value, label);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
922 assert(cond);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
923
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
924 jit_call *check = create_checked (&jit_typeinfo::logically_true,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
925 cond);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
926
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
927 jit_block *body = m_factory.create<jit_block> ("case_body");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
928 m_blocks.push_back (body);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
929
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
930 m_block->append (m_factory.create<jit_cond_branch> (check, body,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
931 entry_blocks[i+1]));
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
932 m_block = body; // case_body
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
933 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
934
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
935 tree_statement_list *stmt_lst = twc->commands ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
936 assert(stmt_lst);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
937
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
938 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
939 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
940 stmt_lst->accept (*this);
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
941 num_incoming++;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
942 m_block->append (m_factory.create<jit_branch> (tail));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
943 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
944 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
945 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
946
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
947 // each branch in the case statement will have different
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
948 // breaks/continues
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
949 current_breaks.splice (current_breaks.end (), m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
950 current_continues.splice (current_continues.end (), m_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
951 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
952
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
953 // each branch in the case statement will have different breaks/continues
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
954 m_breaks.splice (m_breaks.end (), current_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
955 m_continues.splice (m_continues.end (), current_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
956
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
957 if (num_incoming || ! has_otherwise)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
958 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
959 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
960 m_block = tail; // switch_tail
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
961 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
962 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
963 throw jit_break_exception (); // every branch broke
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
964 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
965
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
966 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
967 jit_convert::visit_try_catch_command (tree_try_catch_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
968 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
969 throw jit_fail_exception ("No visit_try_catch_command implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
970 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
971
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
972 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
973 jit_convert::visit_unwind_protect_command (tree_unwind_protect_command&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
974 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
975 throw jit_fail_exception ("No visit_unwind_protect_command implementation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
976 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
977
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
978 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
979 jit_convert::visit_while_command (tree_while_command& wc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
980 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
981 unwind_protect frame;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
982 frame.protect_var (m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
983 frame.protect_var (m_continues);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
984 m_breaks.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
985 m_continues.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
986
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
987 jit_block *cond_check = m_factory.create<jit_block> ("while_cond_check");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
988 m_block->append (m_factory.create<jit_branch> (cond_check));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
989 m_blocks.push_back (cond_check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
990 m_block = cond_check;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
991
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
992 tree_expression *expr = wc.condition ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
993 assert (expr && "While expression can not be null");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
994 jit_value *check = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
995 check = create_checked (&jit_typeinfo::logically_true, check);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
996
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
997 jit_block *body = m_factory.create<jit_block> ("while_body");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
998 m_blocks.push_back (body);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
999
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1000 jit_block *tail = m_factory.create<jit_block> ("while_tail");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1001 m_block->append (m_factory.create<jit_cond_branch> (check, body, tail));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1002 m_block = body;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1003
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1004 tree_statement_list *loop_body = wc.body ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1005 bool all_breaking = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1006 if (loop_body)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1007 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1008 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1009 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1010 loop_body->accept (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1011 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1012 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1013 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1014 all_breaking = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1015 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1016 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1017
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1018 finish_breaks (tail, m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1019
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1020 if (! all_breaking || m_continues.size ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1021 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1022 jit_block *interrupt_check
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1023 = m_factory.create<jit_block> ("interrupt_check");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1024 m_blocks.push_back (interrupt_check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1025 finish_breaks (interrupt_check, m_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1026 if (! all_breaking)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1027 m_block->append (m_factory.create<jit_branch> (interrupt_check));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1028
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1029 m_block = interrupt_check;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1030 jit_error_check *ec
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1031 = m_factory.create<jit_error_check> (jit_error_check::var_interrupt,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1032 cond_check, m_final_block);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1033 m_block->append (ec);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1034 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1035
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1036 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1037 m_block = tail;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1038 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1039
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1040 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1041 jit_convert::visit_do_until_command (tree_do_until_command& duc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1042 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1043 unwind_protect frame;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1044 frame.protect_var (m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1045 frame.protect_var (m_continues);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1046 m_breaks.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1047 m_continues.clear ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1048
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1049 jit_block *body = m_factory.create<jit_block> ("do_until_body");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1050 jit_block *cond_check = m_factory.create<jit_block> ("do_until_cond_check");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1051 jit_block *tail = m_factory.create<jit_block> ("do_until_tail");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1052
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1053 m_block->append (m_factory.create<jit_branch> (body));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1054 m_blocks.push_back (body);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1055 m_block = body;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1056
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1057 tree_statement_list *loop_body = duc.body ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1058 bool all_breaking = false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1059 if (loop_body)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1060 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1061 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1062 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1063 loop_body->accept (*this);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1064 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1065 catch (const jit_break_exception&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1066 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1067 all_breaking = true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1068 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1069 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1070
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1071 finish_breaks (tail, m_breaks);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1072
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1073 if (! all_breaking || m_continues.size ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1074 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1075 jit_block *interrupt_check
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1076 = m_factory.create<jit_block> ("interrupt_check");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1077 m_blocks.push_back (interrupt_check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1078 finish_breaks (interrupt_check, m_continues);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1079 if (! all_breaking)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1080 m_block->append (m_factory.create<jit_branch> (interrupt_check));
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1081
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1082 m_block = interrupt_check;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1083 jit_error_check *ec
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1084 = m_factory.create<jit_error_check> (jit_error_check::var_interrupt,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1085 cond_check, m_final_block);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1086 m_block->append (ec);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1087
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1088 m_blocks.push_back (cond_check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1089 m_block = cond_check;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1090
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1091 tree_expression *expr = duc.condition ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1092 assert (expr && "Do-Until expression can not be null");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1093 jit_value *check = visit (expr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1094 check = create_checked (&jit_typeinfo::logically_true, check);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1095
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1096 m_block->append (m_factory.create<jit_cond_branch> (check, tail,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1097 body));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1098 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1099
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1100 m_blocks.push_back (tail);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1101 m_block = tail;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1102 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1103
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1104 void
24361
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24356
diff changeset
1105 jit_convert::initialize (const symbol_scope& s)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1106 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1107 m_scope = s;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1108 m_iterator_count = 0;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1109 m_for_bounds_count = 0;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1110 m_short_count = 0;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1111 jit_instruction::reset_ids ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1112
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1113 m_entry_block = m_factory.create<jit_block> ("body");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1114 m_final_block = m_factory.create<jit_block> ("final");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1115 m_blocks.push_back (m_entry_block);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1116 m_entry_block->mark_alive ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1117 m_block = m_entry_block;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1118 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1119
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1120 jit_call *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1121 jit_convert::create_checked_impl (jit_call *ret)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1122 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1123 m_block->append (ret);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1124
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1125 jit_block *normal = m_factory.create<jit_block> (m_block->name ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1126 jit_error_check *check
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1127 = m_factory.create<jit_error_check> (jit_error_check::var_error_state,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1128 ret, normal, m_final_block);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1129 m_block->append (check);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1130 m_blocks.push_back (normal);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1131 m_block = normal;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1132
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
1133 return ret;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1134 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1135
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1136 jit_variable *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1137 jit_convert::find_variable (const std::string& vname) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1138 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1139 variable_map::const_iterator iter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1140 iter = m_vmap.find (vname);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1141 return iter != m_vmap.end () ? iter->second : nullptr;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1142 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1143
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1144 jit_variable *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1145 jit_convert::get_variable (const std::string& vname)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1146 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1147 jit_variable *ret = find_variable (vname);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1148 if (ret)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1149 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1150
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1151 symbol_table& symtab = __get_symbol_table__ ("jit_convert::find_variable");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1152
26114
0e207a5cc212 eliminate useless function
John W. Eaton <jwe@octave.org>
parents: 26003
diff changeset
1153 symbol_record record = m_scope.find_symbol (vname);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1154 if (record.is_persistent () || record.is_global ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1155 throw jit_fail_exception ("Persistent and global not yet supported");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1156
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1157 if (m_converting_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1158 return create_variable (vname, jit_typeinfo::get_any (), false);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1159 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1160 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1161 octave_value val = record.varval (m_scope.current_context ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1162 if (val.is_undefined ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1163 val = symtab.find_function (vname);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1164
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1165 jit_type *type = jit_typeinfo::type_of (val);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1166 m_bounds.push_back (type_bound (type, vname));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1167
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1168 return create_variable (vname, type);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1169 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1170 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1171
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1172 jit_variable *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1173 jit_convert::create_variable (const std::string& vname, jit_type *type,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1174 bool isarg)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1175 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1176 jit_variable *var = m_factory.create<jit_variable> (vname);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1177
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1178 if (isarg)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1179 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1180 jit_extract_argument *extract;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1181 extract = m_factory.create<jit_extract_argument> (type, var);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1182 m_entry_block->prepend (extract);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1183 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1184 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1185 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1186 jit_call *init = m_factory.create<jit_call> (&jit_typeinfo::create_undef);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1187 jit_assign *assign = m_factory.create<jit_assign> (var, init);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1188 m_entry_block->prepend (assign);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1189 m_entry_block->prepend (init);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1190 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1191
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1192 return m_vmap[vname] = var;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1193 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1194
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1195 std::string
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1196 jit_convert::next_name (const char *prefix, size_t& count, bool inc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1197 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1198 std::stringstream ss;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1199 ss << prefix << count;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1200 if (inc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1201 ++count;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1202 return ss.str ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1203 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1204
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1205 jit_instruction *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1206 jit_convert::resolve (tree_index_expression& exp, jit_value *extra_arg,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1207 bool lhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1208 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1209 std::string type = exp.type_tags ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1210 if (! (type.size () == 1 && type[0] == '('))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1211 throw jit_fail_exception ("Unsupported index operation");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1212
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1213 std::list<tree_argument_list *> args = exp.arg_lists ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1214 if (args.size () != 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1215 throw jit_fail_exception ("Bad number of arguments in "
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1216 "tree_index_expression");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1217
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1218 tree_argument_list *arg_list = args.front ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1219 if (! arg_list)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1220 throw jit_fail_exception ("null argument list");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1221
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1222 if (arg_list->size () < 1)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1223 throw jit_fail_exception ("Empty arg_list");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1224
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1225 tree_expression *tree_object = exp.expression ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1226 jit_value *object;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1227 if (lhs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1228 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1229 tree_identifier *id = dynamic_cast<tree_identifier *> (tree_object);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1230 if (! id)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1231 throw jit_fail_exception ("expected identifier");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1232 object = get_variable (id->name ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1233 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1234 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1235 object = visit (tree_object);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1236
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1237 size_t narg = arg_list->size ();
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1238 auto iter = arg_list->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1239 bool have_extra = extra_arg;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1240 std::vector<jit_value *> call_args (narg + 1 + have_extra);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1241 call_args[0] = object;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1242
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1243 for (size_t idx = 0; iter != arg_list->end (); ++idx, ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1244 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1245 unwind_protect frame;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1246 frame.add_method (&m_end_context,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1247 &std::vector<jit_magic_end::context>::pop_back);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1248
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1249 jit_magic_end::context ctx (m_factory, object, idx, narg);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1250 m_end_context.push_back (ctx);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1251 call_args[idx + 1] = visit (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1252 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1253
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1254 if (extra_arg)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1255 call_args[call_args.size () - 1] = extra_arg;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1256
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1257 const jit_operation& fres = (lhs ? jit_typeinfo::paren_subsasgn ()
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1258 : jit_typeinfo::paren_subsref ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1259
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1260 return create_checked (fres, call_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1261 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1262
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1263 jit_value *
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1264 jit_convert::do_assign (tree_expression *exp, jit_value *rhs, bool
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1265 artificial)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1266 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1267 if (! exp)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1268 throw jit_fail_exception ("NULL lhs in assign");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1269
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1270 if (isa<tree_identifier> (exp))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1271 return do_assign (exp->name (), rhs, exp->print_result (), artificial);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1272 else if (tree_index_expression *idx
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1273 = dynamic_cast<tree_index_expression *> (exp))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1274 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1275 jit_value *new_object = resolve (*idx, rhs, true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1276 do_assign (idx->expression (), new_object, true);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1277
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1278 // FIXME: Will not work for values that must be release/grabed
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1279 return rhs;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1280 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1281 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1282 throw jit_fail_exception ("Unsupported assignment");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1283 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1284
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1285 jit_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1286 jit_convert::do_assign (const std::string& lhs, jit_value *rhs,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1287 bool print, bool artificial)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1288 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1289 jit_variable *var = get_variable (lhs);
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1290 jit_assign *assign = m_block->append (m_factory.create<jit_assign> (var,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1291 rhs));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1292
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1293 if (artificial)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1294 assign->mark_artificial ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1295
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1296 if (print)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1297 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1298 const jit_operation& print_fn = jit_typeinfo::print_value ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1299 jit_const_string *name = m_factory.create<jit_const_string> (lhs);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1300 m_block->append (m_factory.create<jit_call> (print_fn, name, var));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1301 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1302
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1303 return var;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1304 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1305
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1306 jit_value *
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1307 jit_convert::visit (tree& tee)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1308 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1309 unwind_protect frame;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1310 frame.protect_var (m_result);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1311
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1312 tee.accept (*this);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1313 return m_result;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1314 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1315
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1316 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1317 jit_convert::finish_breaks (jit_block *dest, const block_list& lst)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1318 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1319 for (auto iter = lst.begin (); iter != lst.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1320 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1321 jit_block *b = *iter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1322 b->append (m_factory.create<jit_branch> (dest));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1323 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1324 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1325
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1326 // -------------------- jit_convert_llvm --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1327 llvm::Function *
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
1328 jit_convert_llvm::convert_loop (const jit_module& module,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1329 const jit_block_list& blocks,
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
1330 const std::list<jit_value *>& constants,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
1331 const std::string& llvm_function_name)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1332 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1333 m_converting_function = false;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1334
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1335 // for now just init arguments from entry, later we will have to do
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1336 // something more interesting
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1337 jit_block *m_entry_block = blocks.front ();
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1338 for (auto iter = m_entry_block->begin ();
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1339 iter != m_entry_block->end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1340 if (jit_extract_argument *extract
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1341 = dynamic_cast<jit_extract_argument *> (*iter))
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1342 m_argument_vec.push_back (std::make_pair (extract->name (), true));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1343
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1344 jit_type *any = jit_typeinfo::get_any ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1345
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1346 // argument is an array of octave_base_value*, or octave_base_value**
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1347 llvm::Type *arg_type = any->to_llvm (); // this is octave_base_value*
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1348 llvm::FunctionType *ft;
24243
735ebdfdb7d4 jit: pt-jit.cc: Add type argument to CreateConstInBoundsGEP1_32 (LLVM >= 3.7)
Julien Bect <jbect@users.sourceforge.net>
parents: 24241
diff changeset
1349 ft = llvm::FunctionType::get (llvm::Type::getVoidTy (context),
735ebdfdb7d4 jit: pt-jit.cc: Add type argument to CreateConstInBoundsGEP1_32 (LLVM >= 3.7)
Julien Bect <jbect@users.sourceforge.net>
parents: 24241
diff changeset
1350 arg_type->getPointerTo (), false);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
1351
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1352 m_function = module.create_llvm_function (ft, llvm_function_name);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1353 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1354 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1355 m_prelude = llvm::BasicBlock::Create (context, "prelude", m_function);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1356 builder.SetInsertPoint (m_prelude);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1357
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1358 // The jitted function will have only one function argument, of
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1359 // octave_base_value** type
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1360 llvm::Value *arg = &*(m_function->arg_begin ());
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1361
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1362 for (size_t i = 0; i < m_argument_vec.size (); ++i)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1363 {
26540
df230bb22ba6 jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
Julien Bect <jbect@users.sourceforge.net>
parents: 26539
diff changeset
1364 #if defined (LLVM_IRBUILDER_CREATECONSTINBOUNDSGEP1_32_REQUIRES_TYPE)
25117
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
1365 // LLVM >= 3.7
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
1366 llvm::Value *loaded_arg = builder.CreateConstInBoundsGEP1_32 (arg_type, arg, i);
26540
df230bb22ba6 jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
Julien Bect <jbect@users.sourceforge.net>
parents: 26539
diff changeset
1367 #else
df230bb22ba6 jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
Julien Bect <jbect@users.sourceforge.net>
parents: 26539
diff changeset
1368 // LLVM <= 3.6
df230bb22ba6 jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
Julien Bect <jbect@users.sourceforge.net>
parents: 26539
diff changeset
1369 llvm::Value *loaded_arg = builder.CreateConstInBoundsGEP1_32 (arg, i);
df230bb22ba6 jit: configure: Check if llvm::IRBuilder::CreateConstInBoundsGEP1_32 API
Julien Bect <jbect@users.sourceforge.net>
parents: 26539
diff changeset
1370 #endif
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1371 m_arguments[m_argument_vec[i].first] = loaded_arg;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1372 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1373
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1374 convert (blocks, constants);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1375 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1376 catch (const jit_fail_exception& e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1377 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1378 m_function->eraseFromParent ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1379 throw;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1380 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1381
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1382 return m_function;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1383 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1384
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1385 jit_function
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
1386 jit_convert_llvm::convert_function (const jit_module& module,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1387 const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1388 const std::list<jit_value *>& constants,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1389 octave_user_function& fcn,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1390 const std::vector<jit_type *>& args)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1391 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1392 m_converting_function = true;
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1393
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1394 jit_block *m_final_block = blocks.back ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1395 jit_return *ret = dynamic_cast<jit_return *> (m_final_block->back ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1396 assert (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1397
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1398 m_creating = jit_function (&module, jit_convention::internal,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1399 "foobar", ret->result_type (), args);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1400 m_function = m_creating.to_llvm ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1401
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1402 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1403 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1404 m_prelude = m_creating.new_block ("prelude");
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1405 builder.SetInsertPoint (m_prelude);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1406
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1407 tree_parameter_list *plist = fcn.parameter_list ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1408 if (plist)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1409 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1410 auto piter = plist->begin ();
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1411 auto pend = plist->end ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1412 for (size_t i = 0; i < args.size () && piter != pend; ++i, ++piter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1413 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1414 tree_decl_elt *elt = *piter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1415 std::string arg_name = elt->name ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1416 m_arguments[arg_name] = m_creating.argument (builder, i);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1417 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1418 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1419
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1420 convert (blocks, constants);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1421 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1422 catch (const jit_fail_exception& e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1423 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1424 m_function->eraseFromParent ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1425 throw;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1426 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1427
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1428 return m_creating;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1429 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1430
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1431 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1432 jit_convert_llvm::convert (const jit_block_list& blocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1433 const std::list<jit_value *>& constants)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1434 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1435 std::list<jit_block *>::const_iterator biter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1436 for (biter = blocks.begin (); biter != blocks.end (); ++biter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1437 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1438 jit_block *jblock = *biter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1439 llvm::BasicBlock *m_block = llvm::BasicBlock::Create (context,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1440 jblock->name (),
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1441 m_function);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1442 jblock->stash_llvm (m_block);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1443 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1444
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1445 jit_block *first = *blocks.begin ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1446 builder.CreateBr (first->to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1447
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1448 // constants aren't in the IR, we visit those first
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1449 for (auto iter = constants.begin (); iter != constants.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1450 if (! isa<jit_instruction> (*iter))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1451 visit (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1452
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1453 // convert all instructions
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1454 for (biter = blocks.begin (); biter != blocks.end (); ++biter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1455 visit (*biter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1456
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1457 // now finish phi nodes
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1458 for (biter = blocks.begin (); biter != blocks.end (); ++biter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1459 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1460 jit_block& m_block = **biter;
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1461 for (auto piter = m_block.begin ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1462 piter != m_block.end () && isa<jit_phi> (*piter); ++piter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1463 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1464 jit_instruction *phi = *piter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1465 finish_phi (static_cast<jit_phi *> (phi));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1466 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1467 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1468 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1469
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1470 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1471 jit_convert_llvm::finish_phi (jit_phi *phi)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1472 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1473 llvm::PHINode *llvm_phi = phi->to_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1474 for (size_t i = 0; i < phi->argument_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1475 {
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1476 llvm::BasicBlock *pred = phi->incoming_llvm (i);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1477 llvm_phi->addIncoming (phi->argument_llvm (i), pred);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1478 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1479 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1480
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1481 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1482 jit_convert_llvm::visit (jit_const_string& cs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1483 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1484 cs.stash_llvm (builder.CreateGlobalStringPtr (cs.value ()));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1485 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1486
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1487 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1488 jit_convert_llvm::visit (jit_const_bool& cb)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1489 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1490 cb.stash_llvm (llvm::ConstantInt::get (cb.type_llvm (), cb.value ()));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1491 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1492
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1493 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1494 jit_convert_llvm::visit (jit_const_scalar& cs)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1495 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1496 cs.stash_llvm (llvm::ConstantFP::get (cs.type_llvm (), cs.value ()));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1497 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1498
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1499 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1500 jit_convert_llvm::visit (jit_const_complex& cc)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1501 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1502 llvm::Type *scalar_t = jit_typeinfo::get_scalar_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1503 Complex value = cc.value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1504 llvm::Value *real = llvm::ConstantFP::get (scalar_t, value.real ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1505 llvm::Value *imag = llvm::ConstantFP::get (scalar_t, value.imag ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1506 cc.stash_llvm (jit_typeinfo::create_complex (real, imag));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1507 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1508
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1509 void jit_convert_llvm::visit (jit_const_index& ci)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1510 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1511 ci.stash_llvm (llvm::ConstantInt::get (ci.type_llvm (), ci.value ()));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1512 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1513
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1514 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1515 jit_convert_llvm::visit (jit_const_range& cr)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1516 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1517 llvm::StructType *stype = llvm::cast<llvm::StructType>(cr.type_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1518 llvm::Type *scalar_t = jit_typeinfo::get_scalar_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1519 llvm::Type *idx = jit_typeinfo::get_index_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1520 const jit_range& rng = cr.value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1521
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1522 llvm::Constant *constants[4];
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1523 constants[0] = llvm::ConstantFP::get (scalar_t, rng.m_base);
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1524 constants[1] = llvm::ConstantFP::get (scalar_t, rng.m_limit);
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1525 constants[2] = llvm::ConstantFP::get (scalar_t, rng.m_inc);
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1526 constants[3] = llvm::ConstantInt::get (idx, rng.m_nelem);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1527
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1528 llvm::Value *as_llvm;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1529 as_llvm = llvm::ConstantStruct::get (stype,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1530 llvm::makeArrayRef (constants, 4));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1531 cr.stash_llvm (as_llvm);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1532 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1533
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1534 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1535 jit_convert_llvm::visit (jit_block& b)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1536 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1537 llvm::BasicBlock *m_block = b.to_llvm ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1538 builder.SetInsertPoint (m_block);
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1539 for (auto iter = b.begin (); iter != b.end (); ++iter)
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
1540 visit (*iter);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1541 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1542
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1543 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1544 jit_convert_llvm::visit (jit_branch& b)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1545 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1546 b.stash_llvm (builder.CreateBr (b.successor_llvm ()));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1547 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1548
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1549 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1550 jit_convert_llvm::visit (jit_cond_branch& cb)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1551 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1552 llvm::Value *cond = cb.cond_llvm ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1553 llvm::Value *br;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1554 br = builder.CreateCondBr (cond, cb.successor_llvm (0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1555 cb.successor_llvm (1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1556 cb.stash_llvm (br);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1557 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1558
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1559 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1560 jit_convert_llvm::visit (jit_call& call)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1561 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1562 const jit_function& ol = call.overload ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1563
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1564 std::vector<jit_value *> args (call.arguments ().size ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1565 for (size_t i = 0; i < args.size (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1566 args[i] = call.argument (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1567
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1568 llvm::Value *ret = ol.call (builder, args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1569 call.stash_llvm (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1570 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1571
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1572 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1573 jit_convert_llvm::visit (jit_extract_argument& extract)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1574 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1575 llvm::Value *arg = m_arguments[extract.name ()];
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1576 assert (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1577
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1578 if (m_converting_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1579 extract.stash_llvm (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1580 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1581 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1582 arg = builder.CreateLoad (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1583
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1584 const jit_function& ol = extract.overload ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1585 extract.stash_llvm (ol.call (builder, arg));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1586 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1587 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1588
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1589 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1590 jit_convert_llvm::visit (jit_store_argument& store)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1591 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1592 const jit_function& ol = store.overload ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1593 llvm::Value *arg_value = ol.call (builder, store.result ());
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1594 llvm::Value *arg = m_arguments[store.name ()];
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1595 store.stash_llvm (builder.CreateStore (arg_value, arg));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1596 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1597
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1598 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1599 jit_convert_llvm::visit (jit_return& ret)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1600 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1601 jit_value *res = ret.result ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1602
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1603 if (m_converting_function)
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1604 m_creating.do_return (builder, res->to_llvm (), false);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1605 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1606 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1607 if (res)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1608 builder.CreateRet (res->to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1609 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1610 builder.CreateRetVoid ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1611 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1612 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1613
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1614 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1615 jit_convert_llvm::visit (jit_phi& phi)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1616 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1617 // we might not have converted all incoming branches, so we don't
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1618 // set incoming branches now
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1619 llvm::PHINode *node = llvm::PHINode::Create (phi.type_llvm (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1620 phi.argument_count ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1621 builder.Insert (node);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1622 phi.stash_llvm (node);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1623 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1624
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1625 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1626 jit_convert_llvm::visit (jit_variable&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1627 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1628 throw jit_fail_exception ("ERROR: SSA construction should remove all variables");
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1629 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1630
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1631 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1632 jit_convert_llvm::visit (jit_error_check& check)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1633 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1634 llvm::Value *cond;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1635
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1636 switch (check.check_variable ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1637 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1638 case jit_error_check::var_error_state:
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1639 cond = jit_typeinfo::insert_error_check (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1640 break;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1641 case jit_error_check::var_interrupt:
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1642 cond = jit_typeinfo::insert_interrupt_check (builder);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1643 break;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1644 default:
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1645 panic_impossible ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1646 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1647
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1648 llvm::Value *br = builder.CreateCondBr (cond, check.successor_llvm (0),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1649 check.successor_llvm (1));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1650 check.stash_llvm (br);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1651 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1652
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1653 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1654 jit_convert_llvm::visit (jit_assign& assign)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1655 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1656 jit_value *new_value = assign.src ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1657 assign.stash_llvm (new_value->to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1658
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1659 if (assign.artificial ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1660 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1661
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1662 jit_value *overwrite = assign.overwrite ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1663 if (isa<jit_assign_base> (overwrite))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1664 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1665 const jit_function& ol = jit_typeinfo::get_release (overwrite->type ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1666 if (ol.valid ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1667 ol.call (builder, overwrite);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1668 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1669 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1670
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1671 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1672 jit_convert_llvm::visit (jit_argument&)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1673 { }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1674
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1675 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1676 jit_convert_llvm::visit (jit_magic_end& me)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1677 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1678 const jit_function& ol = me.overload ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1679
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1680 jit_magic_end::context ctx = me.resolve_context ();
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1681 llvm::Value *ret = ol.call (builder, ctx.m_value, ctx.m_index,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1682 ctx.m_count);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1683 me.stash_llvm (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1684 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1685
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1686 // -------------------- jit_infer --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1687 jit_infer::jit_infer (jit_factory& afactory, jit_block_list& ablocks,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1688 const variable_map& avmap)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1689 : m_blocks (ablocks), m_factory (afactory), m_vmap (avmap) { }
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1690
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1691 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1692 jit_infer::infer (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1693 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1694 construct_ssa ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1695
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1696 // initialize the worklist to instructions derived from constants
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1697 const std::list<jit_value *>& constants = m_factory.constants ();
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1698 for (auto iter = constants.begin (); iter != constants.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1699 append_users (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1700
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1701 // the entry block terminator may be a regular branch statement
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1702 if (entry_block ().terminator ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1703 push_worklist (entry_block ().terminator ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1704
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1705 // FIXME: Describe algorithm here
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1706 while (m_worklist.size ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1707 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1708 jit_instruction *next = m_worklist.front ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1709 m_worklist.pop_front ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1710 next->stash_in_worklist (false);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1711
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1712 if (next->infer ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1713 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1714 // terminators need to be handles specially
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1715 if (jit_terminator *term = dynamic_cast<jit_terminator *> (next))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1716 append_users_term (term);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1717 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1718 append_users (next);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1719 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1720 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1721
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1722 remove_dead ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1723 m_blocks.label ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1724 place_releases ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1725 simplify_phi ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1726 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1727
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1728 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1729 jit_infer::append_users (jit_value *v)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1730 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1731 for (jit_use *use = v->first_use (); use; use = use->next ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1732 push_worklist (use->user ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1733 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1734
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1735 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1736 jit_infer::append_users_term (jit_terminator *term)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1737 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1738 for (size_t i = 0; i < term->successor_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1739 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1740 if (term->alive (i))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1741 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1742 jit_block *succ = term->successor (i);
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1743 for (auto iter = succ->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1744 iter != succ->end () && isa<jit_phi> (*iter); ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1745 push_worklist (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1746
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1747 jit_terminator *sterm = succ->terminator ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1748 if (sterm)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1749 push_worklist (sterm);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1750 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1751 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1752 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1753
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1754 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1755 jit_infer::construct_ssa (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1756 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1757 m_blocks.label ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1758 final_block ().compute_idom (entry_block ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1759 entry_block ().compute_df ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1760 entry_block ().create_dom_tree ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1761
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1762 // insert phi nodes where needed, this is done on a per variable basis
25343
4d7790d9793f use cbegin, crbegin, cend, and crend and auto decls where possible
John W. Eaton <jwe@octave.org>
parents: 25342
diff changeset
1763 for (auto iter = m_vmap.cbegin (); iter != m_vmap.cend (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1764 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1765 jit_block::df_set visited, added_phi;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1766 std::list<jit_block *> ssa_worklist;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1767 iter->second->use_blocks (visited);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1768 ssa_worklist.insert (ssa_worklist.begin (), visited.begin (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1769 visited.end ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1770
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1771 while (ssa_worklist.size ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1772 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1773 jit_block *b = ssa_worklist.front ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1774 ssa_worklist.pop_front ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1775
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1776 for (auto diter = b->df_begin (); diter != b->df_end (); ++diter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1777 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1778 jit_block *dblock = *diter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1779 if (! added_phi.count (dblock))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1780 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1781 jit_phi *phi = m_factory.create<jit_phi> (iter->second,
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1782 dblock->use_count ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1783 dblock->prepend (phi);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1784 added_phi.insert (dblock);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1785 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1786
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1787 if (! visited.count (dblock))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1788 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1789 ssa_worklist.push_back (dblock);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1790 visited.insert (dblock);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1791 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1792 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1793 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1794 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1795
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1796 do_construct_ssa (entry_block (), entry_block ().visit_count ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1797 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1798
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1799 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1800 jit_infer::do_construct_ssa (jit_block& ablock, size_t avisit_count)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1801 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1802 if (ablock.visited (avisit_count))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1803 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1804
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1805 // replace variables with their current SSA value
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1806 for (auto iter = ablock.begin (); iter != ablock.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1807 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1808 jit_instruction *instr = *iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1809 instr->construct_ssa ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1810 instr->push_variable ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1811 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1812
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1813 // finish phi nodes of successors
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1814 for (size_t i = 0; i < ablock.successor_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1815 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1816 jit_block *finish = ablock.successor (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1817
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1818 for (auto iter = finish->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1819 iter != finish->end () && isa<jit_phi> (*iter);)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1820 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1821 jit_phi *phi = static_cast<jit_phi *> (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1822 jit_variable *var = phi->dest ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1823 ++iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1824
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1825 if (var->has_top ())
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1826 phi->add_incoming (&ablock, var->top ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1827 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1828 {
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1829 // temporaries may have extraneous phi nodes which can be
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1830 // removed
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1831 assert (! phi->use_count ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1832 assert (var->name ().size () && var->name ()[0] == '#');
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1833 phi->remove ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1834 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1835 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1836 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1837
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1838 for (size_t i = 0; i < ablock.dom_successor_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1839 do_construct_ssa (*ablock.dom_successor (i), avisit_count);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1840
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1841 ablock.pop_all ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1842 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1843
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1844 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1845 jit_infer::place_releases (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1846 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1847 std::set<jit_value *> temporaries;
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1848 for (auto iter = m_blocks.begin (); iter != m_blocks.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1849 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1850 jit_block& ablock = **iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1851 if (ablock.id () != jit_block::NO_ID)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1852 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1853 release_temp (ablock, temporaries);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1854 release_dead_phi (ablock);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1855 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1856 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1857 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1858
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1859 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1860 jit_infer::push_worklist (jit_instruction *instr)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1861 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1862 if (! instr->in_worklist ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1863 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1864 instr->stash_in_worklist (true);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1865 m_worklist.push_back (instr);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1866 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1867 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1868
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1869 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1870 jit_infer::remove_dead ()
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1871 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1872 jit_block_list::iterator biter;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1873 for (biter = m_blocks.begin (); biter != m_blocks.end (); ++biter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1874 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1875 jit_block *b = *biter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1876 if (b->alive ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1877 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1878 for (auto iter = b->begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1879 iter != b->end () && isa<jit_phi> (*iter);)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1880 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1881 jit_phi *phi = static_cast<jit_phi *> (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1882 if (phi->prune ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1883 iter = b->remove (iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1884 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1885 ++iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1886 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1887 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1888 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1889
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1890 for (biter = m_blocks.begin (); biter != m_blocks.end ();)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1891 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1892 jit_block *b = *biter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1893 if (b->alive ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1894 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1895 // FIXME: A special case for jit_error_check, if we generalize to
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1896 // we will need to change!
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1897 jit_terminator *term = b->terminator ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1898 if (term && term->successor_count () == 2 && ! term->alive (0))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1899 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1900 jit_block *succ = term->successor (1);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1901 term->remove ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1902 jit_branch *abreak = m_factory.create<jit_branch> (succ);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1903 b->append (abreak);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1904 abreak->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1905 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1906
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1907 ++biter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1908 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1909 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1910 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1911 jit_terminator *term = b->terminator ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1912 if (term)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1913 term->remove ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1914 biter = m_blocks.erase (biter);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1915 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1916 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1917 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1918
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1919 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1920 jit_infer::release_dead_phi (jit_block& ablock)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1921 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1922 auto iter = ablock.begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1923 while (iter != ablock.end () && isa<jit_phi> (*iter))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1924 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1925 jit_phi *phi = static_cast<jit_phi *> (*iter);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1926 ++iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1927
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1928 jit_use *use = phi->first_use ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1929 if (phi->use_count () == 1 && isa<jit_assign> (use->user ()))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1930 {
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1931 // instead of releasing on assign, release on all incoming
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1932 // branches, this can get rid of casts inside loops
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1933 for (size_t i = 0; i < phi->argument_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1934 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1935 jit_value *arg = phi->argument (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1936 if (! arg->needs_release ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1937 continue;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1938
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
1939 jit_block *inc = phi->incoming (i);
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1940 jit_block *split = inc->maybe_split (m_factory, m_blocks,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1941 ablock);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1942 jit_terminator *term = split->terminator ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1943 jit_call *release
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1944 = m_factory.create<jit_call> (jit_typeinfo::release, arg);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1945 release->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1946 split->insert_before (term, release);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1947 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1948
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1949 phi->replace_with (0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1950 phi->remove ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1951 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1952 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1953 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1954
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1955 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1956 jit_infer::release_temp (jit_block& ablock, std::set<jit_value *>& temp)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1957 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
1958 for (auto iter = ablock.begin (); iter != ablock.end (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1959 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1960 jit_instruction *instr = *iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1961
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1962 // check for temporaries that require release and live across
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1963 // multiple blocks
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1964 if (instr->needs_release ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1965 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1966 jit_block *fu_block = instr->first_use_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1967 if (fu_block && fu_block != &ablock && instr->needs_release ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1968 temp.insert (instr);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1969 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1970
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1971 if (isa<jit_call> (instr))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1972 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1973 // place releases for temporary arguments
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1974 for (size_t i = 0; i < instr->argument_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1975 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1976 jit_value *arg = instr->argument (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1977 if (! arg->needs_release ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1978 continue;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1979
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1980 jit_call *release
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
1981 = m_factory.create<jit_call> (&jit_typeinfo::release, arg);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1982 release->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1983 ablock.insert_after (iter, release);
15191
ed4f4fb78586 Move type inference from jit_convert to jit_infer
Max Brister <max@2bass.com>
parents: 15182
diff changeset
1984 ++iter;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1985 temp.erase (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1986 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1987 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1988 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1989
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1990 if (! temp.size () || ! isa<jit_error_check> (ablock.terminator ()))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1991 return;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1992
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1993 // FIXME: If we support try/catch or unwind_protect final_block
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1994 // may not be the destination
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1995 jit_block *split = ablock.maybe_split (m_factory, m_blocks,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
1996 final_block ());
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1997 jit_terminator *term = split->terminator ();
25343
4d7790d9793f use cbegin, crbegin, cend, and crend and auto decls where possible
John W. Eaton <jwe@octave.org>
parents: 25342
diff changeset
1998 for (auto iter = temp.cbegin (); iter != temp.cend (); ++iter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
1999 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2000 jit_value *value = *iter;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2001 jit_call *release
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2002 = m_factory.create<jit_call> (&jit_typeinfo::release, value);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2003 split->insert_before (term, release);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2004 release->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2005 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2006 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2007
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2008 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2009 jit_infer::simplify_phi (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2010 {
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
2011 for (auto biter = m_blocks.begin (); biter != m_blocks.end (); ++biter)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2012 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2013 jit_block &ablock = **biter;
25337
3ff9192b676e use auto keyword to declare iterator variables where possible
John W. Eaton <jwe@octave.org>
parents: 25336
diff changeset
2014 for (auto iter = ablock.begin ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2015 iter != ablock.end () && isa<jit_phi> (*iter); ++iter)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2016 simplify_phi (*static_cast<jit_phi *> (*iter));
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2017 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2018 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2019
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2020 void
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2021 jit_infer::simplify_phi (jit_phi& phi)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2022 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2023 jit_block& pblock = *phi.parent ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2024 const jit_operation& cast_fn = jit_typeinfo::cast (phi.type ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2025 jit_variable *dest = phi.dest ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2026 for (size_t i = 0; i < phi.argument_count (); ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2027 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2028 jit_value *arg = phi.argument (i);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2029 if (arg->type () != phi.type ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2030 {
24847
fa4e852dae1e use m_ prefix consistently in jit compiler classes in the parser
John W. Eaton <jwe@octave.org>
parents: 24846
diff changeset
2031 jit_block *pred = phi.incoming (i);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2032 jit_block *split = pred->maybe_split (m_factory, m_blocks, pblock);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2033 jit_terminator *term = split->terminator ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2034 jit_instruction *cast = m_factory.create<jit_call> (cast_fn, arg);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2035 jit_assign *assign = m_factory.create<jit_assign> (dest, cast);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2036
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2037 split->insert_before (term, cast);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2038 split->insert_before (term, assign);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2039 cast->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2040 assign->infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2041 phi.stash_argument (i, assign);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2042 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2043 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2044 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2045
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2046
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2047 // ---------------- jit_memory_manager ------------------
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2048
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2049 // A simple memory manager for our LLVM engines,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2050 // based on LLVM's Kaleidoscope example
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2051
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2052 class jit_memory_manager : public llvm::SectionMemoryManager
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2053 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2054 jit_memory_manager (const jit_memory_manager&) = delete;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2055 void operator= (const jit_memory_manager&) = delete;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2056 public:
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2057 jit_memory_manager () { }
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2058 virtual ~jit_memory_manager () { }
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2059
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2060 // The Kaleidoscope example in LLVM 3.8 indicates that
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2061 // getPointerToNamedFunction has to be overloaded, but actually it is
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2062 // getSymbolAddress that must be overloaded.
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2063 virtual uint64_t getSymbolAddress (const std::string &name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2064
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2065 // Is it still useful to overload getPointerToNamedFunction to support
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2066 // some older version of LLVM? Are there others virtual functions
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2067 // that must be overloaded?
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2068 virtual void* getPointerToNamedFunction (const std::string& name, bool
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2069 abort_on_failure);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2070 };
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2071
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2072 void*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2073 jit_memory_manager::getPointerToNamedFunction (const std::string& name,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2074 bool abort_on_failure)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2075 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2076 // Try the standard symbol resolution first, but ask it not to abort
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2077 void *pfn = llvm::RTDyldMemoryManager::getPointerToNamedFunction (name,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2078 false);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2079 if (pfn)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2080 return pfn;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2081
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2082 pfn = tree_jit::getPointerToNamedFunction (name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2083 if ((pfn == nullptr) && abort_on_failure)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2084 llvm::report_fatal_error ("Program used external function '" + name +
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2085 "' which could not be resolved!");
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2086 return pfn;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2087 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2088
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2089 uint64_t
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2090 jit_memory_manager::getSymbolAddress (const std::string &name)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2091 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2092 uint64_t addr = llvm::SectionMemoryManager::getSymbolAddress (name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2093 if (addr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2094 return addr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2095
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2096 addr = tree_jit::getSymbolAddress (name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2097 if (addr == 0)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2098 llvm::report_fatal_error ("Program used extern function '" + name +
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2099 "' which could not be resolved!");
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2100
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2101 return addr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2102 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2103
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2104
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2105 // -------------------- tree_jit --------------------
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2106
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2107 bool tree_jit::initialized = false;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2108
26535
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26403
diff changeset
2109 llvm::LLVMContext tree_jit::llvm_context;
d68381feb6cb jit: Avoid the use of llvm::getGlobalContext, removed in LLVM 3.9
Julien Bect <jbect@users.sourceforge.net>
parents: 26403
diff changeset
2110
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2111 int tree_jit::next_forloop_number = 0;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2112 int tree_jit::next_function_number = 0;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2113 int tree_jit::next_module_number = 0;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2114
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2115 tree_jit::tree_jit (void)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2116 : target_machine (nullptr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2117 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2118 // target_machine will be truly initialized by tree_jit::do_initialize ()
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2119 }
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2120
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2121 tree_jit::~tree_jit (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2122 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2123 delete target_machine;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2124 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2125
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2126 tree_jit&
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2127 tree_jit::instance (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2128 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2129 static tree_jit ret; // singleton instance of tree_jit
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2130
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2131 if (! initialized)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2132 // Try to initialize the singleton instance
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2133 ret.do_initialize ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2134
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2135 return ret;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2136 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2137
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2138 jit::EngineOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2139 tree_jit::create_new_engine (jit::ModuleOwner module_owner)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2140 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2141 std::string err;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2142
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2143 llvm::ExecutionEngine *e = llvm::EngineBuilder (std::move (module_owner))
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2144 .setErrorStr (&err)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2145 .setMCJITMemoryManager(llvm::make_unique<jit_memory_manager> ())
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2146 .create ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2147
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2148 // Note: in some versions of LLVM, we should call .setUseMCJIT (true)
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2149 // before .create () ?
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2150 // FIXME: autconf this
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2151
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2152 if (e == nullptr)
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2153 error ("failed to create JIT engine: %s", err.c_str ());
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2154
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2155 return jit::EngineOwner (e);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2156 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2157
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2158 void
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2159 tree_jit::do_register_jit_module (jit_module* jm)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2160 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2161 jm_list.push_back (jm);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2162 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2163
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2164 void
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2165 tree_jit::do_unregister_jit_module (jit_module* jm)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2166 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2167 jm_list.remove (jm);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2168 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2169
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2170 void*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2171 tree_jit::do_getPointerToNamedFunction (const std::string &name) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2172 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2173 std::list<jit_module*>::const_iterator it;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2174
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2175 for (it = jm_list.begin (); it != jm_list.end (); it++)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2176 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2177 uint64_t addr = (*it)->getFunctionAddress (name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2178
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2179 if (addr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2180 return reinterpret_cast<void*> (addr);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2181 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2182
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2183 return nullptr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2184 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2185
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2186 uint64_t
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2187 tree_jit::do_getSymbolAddress(const std::string &name) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2188 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2189 std::list<jit_module*>::const_iterator it;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2190
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2191 for (it = jm_list.begin (); it != jm_list.end (); it++)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2192 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2193 uint64_t addr = (*it)->getFunctionAddress (name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2194
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2195 if (addr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2196 return addr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2197 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2198
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2199 return 0;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2200 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2201
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2202 bool
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2203 tree_jit::do_initialize (void)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2204 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2205 if (initialized)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2206 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2207
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2208 llvm::InitializeNativeTarget ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2209 llvm::InitializeNativeTargetAsmPrinter ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2210 llvm::InitializeNativeTargetAsmParser ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2211 // FIXME: Check that these three initializations succeed
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2212
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2213 if (target_machine == nullptr)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2214 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2215 target_machine = llvm::EngineBuilder ().selectTarget ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2216 if (target_machine == nullptr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2217 return false;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2218 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2219
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2220 return (initialized = true);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2221 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2222
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2223 jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2224 tree_jit::open_new_module (const std::string& module_name)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2225 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2226 return instance ().do_open_new_module (module_name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2227 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2228
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2229 jit::ModuleOwner
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2230 tree_jit::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: 24245
diff changeset
2231 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2232 if (! initialized)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2233 return nullptr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2234
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2235 jit::ModuleOwner m (new llvm::Module (module_name, context));
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2236
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2237
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2238 if (m != nullptr)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2239 m->setDataLayout (target_machine->createDataLayout ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2240
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2241 return m;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2242 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2243
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2244 bool
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2245 tree_jit::do_execute (tree_simple_for_command& cmd,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2246 const octave_value& bounds)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2247 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2248 size_t tc = trip_count (bounds);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2249 if (! tc || ! initialized || ! enabled ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2250 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2251
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2252 jit_info::vmap extra_vars;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2253 extra_vars["#for_bounds0"] = &bounds;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2254
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2255 jit_info *info = cmd.get_info ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2256
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2257 if (! info || ! info->match (extra_vars))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2258 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2259 if (tc < static_cast<size_t> (Vjit_startcnt))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2260 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2261
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2262 delete info;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2263
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2264 info = new jit_info (cmd, bounds);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2265
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2266 cmd.stash_info (info);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2267 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2268
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2269 return info->execute (extra_vars);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2270 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2271
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2272 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2273 tree_jit::do_execute (tree_while_command& cmd)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2274 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2275 if (! initialized || ! enabled ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2276 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2277
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2278 jit_info *info = cmd.get_info ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2279 if (! info || ! info->match ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2280 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2281 delete info;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2282 info = new jit_info (cmd);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2283 cmd.stash_info (info);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2284 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2285
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2286 return info->execute ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2287 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2288
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2289 bool
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2290 tree_jit::do_execute (octave_user_function& fcn,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2291 const octave_value_list& args,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2292 octave_value_list& retval)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2293 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2294 if (! initialized || ! enabled ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2295 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2296
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2297 jit_function_info *info = fcn.get_info ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2298 if (! info || ! info->match (args))
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2299 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2300 delete info;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2301 info = new jit_function_info (fcn, args);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2302 fcn.stash_info (info);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2303 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2304
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2305 return info->execute (args, retval);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2306 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2307
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2308 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2309 tree_jit::enabled (void)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2310 {
25336
389757b7b6af eliminate redundant octave:: namespace tags
John W. Eaton <jwe@octave.org>
parents: 25117
diff changeset
2311 bp_table& bptab = __get_bp_table__ ("tree_jit::enabled");
24738
3695c2cd69b8 don't use singleton pattern for bp_table
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
2312
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2313 // Ideally, we should only disable JIT if there is a breakpoint in the code
27929
265b386f8b20 maint: Use two spaces between sentences in code comments.
Rik <rik@octave.org>
parents: 27923
diff changeset
2314 // we are about to run. However, we can't figure this out in O(1) time, so
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2315 // we conservatively check for the existence of any breakpoints.
24738
3695c2cd69b8 don't use singleton pattern for bp_table
John W. Eaton <jwe@octave.org>
parents: 24534
diff changeset
2316 return (Vjit_enable && ! bptab.have_breakpoints ()
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2317 && ! Vdebug_on_interrupt && ! Vdebug_on_error);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2318 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2319
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2320 size_t
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2321 tree_jit::trip_count (const octave_value& bounds) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2322 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2323 if (bounds.is_range ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2324 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2325 Range rng = bounds.range_value ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2326 return rng.numel ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2327 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2328
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2329 // unsupported type
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2330 return 0;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2331 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2332
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2333
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2334 // -------------------- jit_module --------------------
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2335
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2336 jit_module::jit_module (const std::string& module_name)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2337 : m_module (nullptr), m_engine (nullptr)
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2338 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2339 jit::ModuleOwner module_owner = tree_jit::open_new_module (module_name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2340 // FIXME: what if this fails? exception?
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2341
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2342 // Get a pointer to the module before ownership is transfered to engine
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2343 m_module = module_owner.get ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2344
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2345 jit::EngineOwner engine_owner = std::move
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2346 (tree_jit::create_new_engine (std::move (module_owner)));
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2347 // FIXME: what if this fails? exception?
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2348
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2349 // TODO?: Consider creating the engine just before jitting
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2350
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2351 // We take responsibility for deleting the engine
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2352 m_engine = engine_owner.get ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2353 engine_owner.release ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2354
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2355 tree_jit::register_jit_module (this);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2356 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2357
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2358 jit_module::~jit_module ()
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2359 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2360 tree_jit::unregister_jit_module (this);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2361
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2362 delete m_engine;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2363 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2364
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2365 // 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: 24245
diff changeset
2366 llvm::Function*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2367 jit_module::create_llvm_function (llvm::FunctionType *ftype,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2368 const llvm::Twine &name) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2369 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2370 // we mark all functinos as external linkage because this prevents
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2371 // llvm from getting rid of always inline functions
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2372
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2373 return llvm::Function::Create (ftype, llvm::Function::ExternalLinkage,
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2374 name, m_module);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2375 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2376
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2377 // Create or insert an LLVM Function declaration for an intrinsic and return
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2378 // it
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2379 llvm::Function*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2380 jit_module::get_intrinsic_declaration (size_t id,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2381 std::vector<llvm::Type*> types) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2382 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2383 return llvm::Intrinsic::getDeclaration
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2384 (m_module, static_cast<llvm::Intrinsic::ID> (id), types);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2385 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2386
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2387 // Create a global in the module
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2388 llvm::GlobalVariable*
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2389 jit_module::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: 24245
diff changeset
2390 const llvm::Twine& name) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2391 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2392 return new llvm::GlobalVariable (*m_module, type, is_constant,
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2393 llvm::GlobalValue::ExternalLinkage,
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2394 nullptr, name);
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2395 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2396
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2397 void
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2398 jit_module::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: 24245
diff changeset
2399 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2400 assert (gv);
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2401 m_engine->addGlobalMapping (gv, p);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2402 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2403
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2404 // Return the address of the specified function.
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2405 uint64_t
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2406 jit_module::getFunctionAddress (const std::string &name) const
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2407 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2408 return m_engine->getFunctionAddress (name);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2409 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2410
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2411 void
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2412 jit_module::optimize (llvm::Function *fn) const
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2413 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2414 if (Vdebug_jit)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2415 llvm::verifyModule (*m_module);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2416
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2417 // DOCUMENT-ME: Why do we need two separate pass managers?
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2418
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2419 jit::PassManager *module_pass_manager = new jit::PassManager ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2420 jit::FunctionPassManager *pass_manager = new jit::FunctionPassManager (m_module);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2421
26538
ea25fc64c275 jit: configure: Check if llvm::createAlwaysInlinerPass exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26537
diff changeset
2422 #if defined (LLVM_HAS_CREATEALWAYSINLINERPASS)
ea25fc64c275 jit: configure: Check if llvm::createAlwaysInlinerPass exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26537
diff changeset
2423 // This pass has been removed from LLVM's C++ API after 3.9.0
ea25fc64c275 jit: configure: Check if llvm::createAlwaysInlinerPass exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26537
diff changeset
2424 // FIXME: Provide a meaningful replacement instead of simply skipping it?
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2425 module_pass_manager->add (llvm::createAlwaysInlinerPass ());
26538
ea25fc64c275 jit: configure: Check if llvm::createAlwaysInlinerPass exists
Julien Bect <jbect@users.sourceforge.net>
parents: 26537
diff changeset
2426 #endif
26617
98afb8bbd1f6 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 26544
diff changeset
2427
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2428 // In 3.6, a pass was inserted in the pipeline to make the DataLayout accessible:
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2429 // MyPassManager->add(new DataLayoutPass(MyTargetMachine->getDataLayout()));
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2430 // In 3.7, you don’t need a pass, you set the DataLayout on the Module:
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2431 // MyModule->setDataLayout(MyTargetMachine->createDataLayout());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2432 //
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2433 // FIXME: autoconf to support <= 3.6
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2434 //
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2435 // #if defined (HAVE_LLVM_DATALAYOUT)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2436 // pass_manager->add (new llvm::DataLayout (*m_engine->getDataLayout ()));
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2437 // #else
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2438 // // For very old LLVM releases ???
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2439 // pass_manager->add (new llvm::TargetData (*m_engine->getTargetData ()));
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2440 // #endif
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2441
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2442 // DOCUMENT-ME: What does each of these passes actually do?
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2443
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2444 pass_manager->add (llvm::createCFGSimplificationPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2445
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2446 #if defined (HAVE_LLVM_ANALYSIS_BASICALIASANALYSIS_H)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2447 pass_manager->add (llvm::createBasicAAWrapperPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2448 #else
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2449 pass_manager->add (llvm::createBasicAliasAnalysisPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2450 #endif
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2451
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2452 pass_manager->add (llvm::createPromoteMemoryToRegisterPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2453 pass_manager->add (llvm::createInstructionCombiningPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2454 pass_manager->add (llvm::createReassociatePass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2455 pass_manager->add (llvm::createGVNPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2456 pass_manager->add (llvm::createCFGSimplificationPass ());
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2457 pass_manager->doInitialization ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2458
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2459 module_pass_manager->run (*m_module);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2460 pass_manager->run (*fn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2461
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2462 delete module_pass_manager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2463 delete pass_manager;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2464
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2465 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2466 {
24244
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2467 // This should be OK in LLVM 3.6 -- 3.8 (and later ?)
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2468 std::error_code ec;
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2469 llvm::raw_fd_ostream fout ("test.bc", ec, llvm::sys::fs::F_None);
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2470
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2471 // std::string error;
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2472 //#if defined (RAW_FD_OSTREAM_ARG_IS_LLVM_SYS_FS)
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2473 // llvm::raw_fd_ostream fout ("test.bc", error, llvm::sys::fs::F_Binary);
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2474 //#else
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2475 // llvm::raw_fd_ostream fout ("test.bc", error, llvm::raw_fd_ostream::F_Binary);
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2476 //#endif
9eef7983b9bc jit: pt-jit.cc: Fix llvm::raw_fd_ostream syntax
Julien Bect <jbect@users.sourceforge.net>
parents: 24243
diff changeset
2477
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2478 llvm::WriteBitcodeToFile (m_module, fout);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2479 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2480 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2481
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2482 void
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2483 jit_module::finalizeObject (void)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2484 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2485 m_engine->finalizeObject ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2486 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2487
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2488
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2489 // -------------------- jit_function_info --------------------
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2490 jit_function_info::jit_function_info (octave_user_function& fcn,
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2491 const octave_value_list& ov_args)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2492 : m_llvm_function_name (""),
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2493 m_function (nullptr),
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2494 m_argument_types (ov_args.length ())
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2495 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2496 size_t nargs = ov_args.length ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2497 for (size_t i = 0; i < nargs; ++i)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2498 m_argument_types[i] = jit_typeinfo::type_of (ov_args(i));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2499
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2500 jit_function raw_fn;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2501 jit_function wrapper;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2502
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2503 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2504 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2505 jit_convert conv (fcn, m_argument_types);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2506 jit_infer infer (conv.get_factory (), conv.get_blocks (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2507 conv.get_variable_map ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2508 infer.infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2509
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2510 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2511 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2512 jit_block_list& blocks = infer.get_blocks ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2513 blocks.label ();
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2514 octave_stdout << "-------------------- Compiling function ";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2515 octave_stdout << "--------------------\n";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2516
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2517 tree_print_code tpc (octave_stdout);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2518 tpc.visit_octave_user_function_header (fcn);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2519 tpc.visit_statement_list (*fcn.body ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2520 tpc.visit_octave_user_function_trailer (fcn);
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2521 blocks.print (octave_stdout, "octave jit ir");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2522 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2523
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2524 jit_factory& factory = conv.get_factory ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2525 jit_convert_llvm to_llvm;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2526 raw_fn = to_llvm.convert_function (*this, infer.get_blocks (),
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2527 factory.constants (), fcn,
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2528 m_argument_types);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2529
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2530 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2531 {
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2532 octave_stdout << "-------------------- raw function ";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2533 octave_stdout << "--------------------\n";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2534 octave_stdout << *raw_fn.to_llvm () << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2535 llvm::verifyFunction (*raw_fn.to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2536 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2537
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2538 m_llvm_function_name = fcn.name () + "_wrapper";
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2539 jit_type *any_t = jit_typeinfo::get_any ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2540 std::vector<jit_type *> wrapper_args (1, jit_typeinfo::get_any_ptr ());
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2541 wrapper = jit_function (this, jit_convention::internal,
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2542 m_llvm_function_name, any_t, wrapper_args);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2543
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2544 llvm::BasicBlock *wrapper_body = wrapper.new_block ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2545 builder.SetInsertPoint (wrapper_body);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2546
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2547 llvm::Value *wrapper_arg = wrapper.argument (builder, 0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2548 std::vector<llvm::Value *> raw_args (nargs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2549 for (size_t i = 0; i < nargs; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2550 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2551 llvm::Value *arg;
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2552 // LLVM <= 3.6
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2553 // arg = builder.CreateConstInBoundsGEP1_32 (wrapper_arg, i);
25117
98596e4522bc * pt-jit.cc: Fix typo from cset 078b795c5219.
John W. Eaton <jwe@octave.org>
parents: 25115
diff changeset
2554 // LLVM >= 3.7
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2555 arg = builder.CreateConstInBoundsGEP1_32 (any_t->to_llvm (),
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2556 wrapper_arg, i);
25115
e512eaba5206 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25103
diff changeset
2557
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2558 arg = builder.CreateLoad (arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2559
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2560 jit_type *arg_type = m_argument_types[i];
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2561 const jit_function& cast = jit_typeinfo::cast (arg_type, any_t);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2562 raw_args[i] = cast.call (builder, arg);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2563 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2564
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2565 llvm::Value *result = raw_fn.call (builder, raw_args);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2566 if (raw_fn.result ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2567 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2568 jit_type *raw_result_t = raw_fn.result ();
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2569 const jit_function& cast = jit_typeinfo::cast (any_t,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2570 raw_result_t);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2571 result = cast.call (builder, result);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2572 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2573 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2574 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2575 llvm::Value *zero = builder.getInt32 (0);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2576 result = builder.CreateBitCast (zero, any_t->to_llvm ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2577 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2578
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2579 wrapper.do_return (builder, result);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2580
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2581 llvm::Function *llvm_function = wrapper.to_llvm ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2582 optimize (llvm_function);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2583
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2584 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2585 {
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2586 octave_stdout << "-------------------- optimized and wrapped ";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2587 octave_stdout << "--------------------\n";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2588 octave_stdout << *llvm_function << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2589 llvm::verifyFunction (*llvm_function);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2590 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2591
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2592 finalizeObject ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2593
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2594 uint64_t void_fn = getFunctionAddress (m_llvm_function_name);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2595
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2596 if (void_fn == 0)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2597 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2598 llvm_function->eraseFromParent ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2599 llvm_function = nullptr;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2600 m_function = nullptr;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2601 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2602 else
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2603 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2604 m_function = reinterpret_cast<jited_function> (void_fn);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2605 }
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2606 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2607 catch (const jit_fail_exception& e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2608 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2609 m_argument_types.clear ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2610
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2611 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2612 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2613 if (e.known ())
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2614 octave_stdout << "jit fail: " << e.what () << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2615 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2616
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2617 Vjit_failcnt++;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2618
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2619 wrapper.erase ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2620 raw_fn.erase ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2621 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2622 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2623
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2624 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2625 jit_function_info::execute (const octave_value_list& ov_args,
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2626 octave_value_list& retval) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2627 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2628 if (! m_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2629 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2630
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2631 // FIXME: figure out a way to delete ov_args so we avoid duplicating
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2632 // refcount
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2633 size_t nargs = ov_args.length ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2634 std::vector<octave_base_value *> args (nargs);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2635 for (size_t i = 0; i < nargs; ++i)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2636 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2637 octave_base_value *obv = ov_args(i).internal_rep ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2638 obv->grab ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2639 args[i] = obv;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2640 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2641
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2642 octave_base_value *ret = m_function (&args[0]);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2643 if (ret)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2644 retval(0) = octave_value (ret);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2645
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2646 octave_quit ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2647
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
2648 return true;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2649 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2650
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2651 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2652 jit_function_info::match (const octave_value_list& ov_args) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2653 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2654 if (! m_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2655 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2656
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2657 size_t nargs = ov_args.length ();
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2658 if (nargs != m_argument_types.size ())
15337
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
2659 return false;
3f43e9d6d86e JIT compile anonymous functions
Max Brister <max@2bass.com>
parents: 15334
diff changeset
2660
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2661 for (size_t i = 0; i < nargs; ++i)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2662 if (jit_typeinfo::type_of (ov_args(i)) != m_argument_types[i])
14917
232d8ab07932 Rewrite pt-jit.* adding new low level octave IR
Max Brister <max@2bass.com>
parents: 14915
diff changeset
2663 return false;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2664
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2665 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2666 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2667
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2668
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2669 // -------------------- jit_info --------------------
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2670 jit_info::jit_info (tree& tee)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2671 : m_llvm_function_name (tree_jit::generate_unique_function_name ()),
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2672 m_function (nullptr)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2673 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2674 compile (tee);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2675 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2676
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2677 jit_info::jit_info (tree& tee, const octave_value& for_bounds)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2678 : m_llvm_function_name (tree_jit::generate_unique_function_name ()),
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2679 m_function (nullptr)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2680 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2681 compile (tee, jit_typeinfo::type_of (for_bounds));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2682 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2683
25103
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2684 jit_info::jit_info (tree_simple_for_command& tee,
078b795c5219 maint: style check C++ ahead of 4.4 release.
Rik <rik@octave.org>
parents: 25054
diff changeset
2685 const octave_value& for_bounds)
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2686 : m_llvm_function_name (tree_jit::generate_unique_forloop_name ()),
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2687 m_function (nullptr)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2688 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2689 compile (tee, jit_typeinfo::type_of (for_bounds));
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2690 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2691
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2692 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2693 jit_info::execute (const vmap& extra_vars) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2694 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2695 if (! m_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2696 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2697
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2698 std::vector<octave_base_value *> real_arguments (m_arguments.size ());
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2699 for (size_t i = 0; i < m_arguments.size (); ++i)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2700 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2701 if (m_arguments[i].second)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2702 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2703 octave_value current = find (extra_vars, m_arguments[i].first);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2704 octave_base_value *obv = current.internal_rep ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2705
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2706 obv->grab ();
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2707
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2708 real_arguments[i] = obv;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2709 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2710 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2711
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2712 m_function (&real_arguments[0]);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2713
24361
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24356
diff changeset
2714 symbol_scope scope = __require_current_scope__ ("jit_info::execute");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2715
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2716 for (size_t i = 0; i < m_arguments.size (); ++i)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2717 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2718 const std::string& name = m_arguments[i].first;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2719
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2720 // do not store for loop bounds temporary
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2721 if (name.size () && name[0] != '#')
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2722 scope.assign (m_arguments[i].first, real_arguments[i]);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2723 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2724
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2725 octave_quit ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2726
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2727 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2728 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2729
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2730 bool
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2731 jit_info::match (const vmap& extra_vars) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2732 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2733 if (! m_function)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2734 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2735
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2736 for (size_t i = 0; i < m_bounds.size (); ++i)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2737 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2738 const std::string& arg_name = m_bounds[i].second;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2739 octave_value value = find (extra_vars, arg_name);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2740 jit_type *type = jit_typeinfo::type_of (value);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2741
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2742 // FIXME: Check for a parent relationship
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2743 if (type != m_bounds[i].first)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2744 return false;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2745 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2746
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2747 return true;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2748 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2749
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2750 void
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2751 jit_info::compile (tree& tee, jit_type *for_bounds)
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2752 {
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2753 llvm::Function * llvm_function = nullptr;
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2754
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2755 try
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2756 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2757 jit_convert conv (tee, for_bounds);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2758 jit_infer infer (conv.get_factory (), conv.get_blocks (),
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2759 conv.get_variable_map ());
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2760
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2761 infer.infer ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2762
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2763 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2764 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2765 jit_block_list& blocks = infer.get_blocks ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2766 blocks.label ();
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2767 octave_stdout << "-------------------- Compiling tree --------------------\n";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2768 octave_stdout << tee.str_print_code () << std::endl;
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2769 blocks.print (octave_stdout, "octave jit ir");
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2770 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2771
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2772 jit_factory& factory = conv.get_factory ();
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2773 jit_convert_llvm to_llvm;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2774
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2775 llvm_function = to_llvm.convert_loop (*this, infer.get_blocks (),
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2776 factory.constants (),
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2777 m_llvm_function_name);
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2778
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2779 m_arguments = to_llvm.get_arguments ();
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2780
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2781 m_bounds = conv.get_bounds ();
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2782 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2783 catch (const jit_fail_exception& e)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2784 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2785 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2786 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2787 if (e.known ())
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2788 octave_stdout << "jit fail: " << e.what () << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2789 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2790
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2791 Vjit_failcnt++;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2792
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2793 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2794
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2795 if (llvm_function)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2796 {
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2797 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2798 {
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2799 octave_stdout << "-------------------- llvm ir --------------------";
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2800 octave_stdout << *llvm_function << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2801 llvm::verifyFunction (*llvm_function);
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2802 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2803
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2804 optimize (llvm_function);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2805
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2806 if (Vdebug_jit)
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2807 {
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2808 octave_stdout << "-------------------- optimized llvm ir "
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2809 << "--------------------\n";
26003
c60a5493688a avoid std::cout in JIT compiler code
John W. Eaton <jwe@octave.org>
parents: 25438
diff changeset
2810 octave_stdout << *llvm_function << std::endl;
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2811 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2812
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2813 finalizeObject ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2814
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2815 uint64_t void_fn = getFunctionAddress (m_llvm_function_name);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2816
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2817 if (void_fn == 0)
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2818 {
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2819 llvm_function->eraseFromParent ();
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2820 llvm_function = nullptr;
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2821 m_function = nullptr;
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2822 }
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2823 else
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2824 {
24846
7620f1f5290d use m_ prefix for member variables in parse tree classes
John W. Eaton <jwe@octave.org>
parents: 24738
diff changeset
2825 m_function = reinterpret_cast<jited_function> (void_fn);
24249
790b4389cfb4 jit: Use MJCIT instead of the old JIT
Julien Bect <jbect@users.sourceforge.net>
parents: 24245
diff changeset
2826 }
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2827 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2828 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2829
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2830 octave_value
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2831 jit_info::find (const vmap& extra_vars, const std::string& vname) const
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2832 {
25342
416856765a55 be more careful with using auto in place of explicit const iterator decls
John W. Eaton <jwe@octave.org>
parents: 25337
diff changeset
2833 vmap::const_iterator iter = extra_vars.find (vname);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2834
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2835 if (iter == extra_vars.end ())
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2836 {
24361
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24356
diff changeset
2837 symbol_scope scope = __require_current_scope__ ("jit_convert::find");
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24356
diff changeset
2838
8bcfddad15ec use shared_ptr to manage symbol_scope objects
John W. Eaton <jwe@octave.org>
parents: 24356
diff changeset
2839 return scope.varval (vname);
24239
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2840 }
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2841 else
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2842 return *iter->second;
51e408a7d38f jit: Move everything inside the octave namespace
Julien Bect <jbect@users.sourceforge.net>
parents: 24237
diff changeset
2843 }
15027
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
2844 }
741d2dbcc117 Check trip count before compiling for loops.
Max Brister <max@2bass.com>
parents: 15023
diff changeset
2845
14932
1f914446157d Locate and link with LLVM properly
Max Brister <max@2bass.com>
parents: 14928
diff changeset
2846 #endif
15014
094bc0a145a1 Take into account different calling conventions
Max Brister <max@2bass.com>
parents: 14992
diff changeset
2847
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2848 DEFUN (jit_failcnt, args, nargout,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2849 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2850 @deftypefn {} {@var{val} =} jit_failcnt ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2851 @deftypefnx {} {@var{old_val} =} jit_failcnt (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2852 @deftypefnx {} {} jit_failcnt (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2853 Query or set the internal variable that counts the number of JIT fail
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2854 exceptions for Octave's JIT compiler.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2855
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2856 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2857 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2858 The original variable value is restored when exiting the function.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2859 @seealso{jit_enable, jit_startcnt, debug_jit}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2860 @end deftypefn */)
18321
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2861 {
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2862 #if defined (HAVE_LLVM)
19836
9cf91ecdc6f7 Rename jit_failure_count() to jit_failcnt().
Rik <rik@octave.org>
parents: 19697
diff changeset
2863 return SET_INTERNAL_VARIABLE (jit_failcnt);
18321
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2864 #else
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2865 octave_unused_parameter (args);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2866 octave_unused_parameter (nargout);
21109
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2867 warn_disabled_feature ("jit_failcnt", "JIT compiling");
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2868 return ovl ();
18321
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2869 #endif
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2870 }
efa4572997ba jit compiler: Add counter of jit_fail_exceptions to check if jit compilation fails
Stefan Mahr <dac922@gmx.de>
parents: 17856
diff changeset
2871
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2872 DEFUN (debug_jit, args, nargout,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2873 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2874 @deftypefn {} {@var{val} =} debug_jit ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2875 @deftypefnx {} {@var{old_val} =} debug_jit (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2876 @deftypefnx {} {} debug_jit (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2877 Query or set the internal variable that determines whether
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2878 debugging/tracing is enabled for Octave's JIT compiler.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2879
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2880 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2881 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2882 The original variable value is restored when exiting the function.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2883 @seealso{jit_enable, jit_startcnt}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2884 @end deftypefn */)
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2885 {
15346
6bdf379592d9 Remove --enable-jit-debug configure option
Max Brister <max@2bass.com>
parents: 15339
diff changeset
2886 #if defined (HAVE_LLVM)
16877
5482cd26311a Rename enable_jit_compiler to jit_enable, enable_jit_debugging to debug_jit.
Rik <rik@octave.org>
parents: 16768
diff changeset
2887 return SET_INTERNAL_VARIABLE (debug_jit);
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2888 #else
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2889 octave_unused_parameter (args);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2890 octave_unused_parameter (nargout);
21109
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2891 warn_disabled_feature ("debug_jit", "JIT");
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2892 return ovl ();
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2893 #endif
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2894 }
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2895
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2896 DEFUN (jit_enable, args, nargout,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2897 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2898 @deftypefn {} {@var{val} =} jit_enable ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2899 @deftypefnx {} {@var{old_val} =} jit_enable (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2900 @deftypefnx {} {} jit_enable (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2901 Query or set the internal variable that enables Octave's JIT compiler.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2902
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2903 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2904 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2905 The original variable value is restored when exiting the function.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2906 @seealso{jit_startcnt, debug_jit}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2907 @end deftypefn */)
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2908 {
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2909 #if defined (HAVE_LLVM)
16877
5482cd26311a Rename enable_jit_compiler to jit_enable, enable_jit_debugging to debug_jit.
Rik <rik@octave.org>
parents: 16768
diff changeset
2910 return SET_INTERNAL_VARIABLE (jit_enable);
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2911 #else
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2912 octave_unused_parameter (args);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2913 octave_unused_parameter (nargout);
21109
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2914 warn_disabled_feature ("jit_enable", "JIT");
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2915 return ovl ();
15310
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2916 #endif
b055fc077224 allow jit compiler to be enabled at run-time
John W. Eaton <jwe@octave.org>
parents: 15245
diff changeset
2917 }
15014
094bc0a145a1 Take into account different calling conventions
Max Brister <max@2bass.com>
parents: 14992
diff changeset
2918
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2919 DEFUN (jit_startcnt, args, nargout,
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2920 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2921 @deftypefn {} {@var{val} =} jit_startcnt ()
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2922 @deftypefnx {} {@var{old_val} =} jit_startcnt (@var{new_val})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2923 @deftypefnx {} {} jit_startcnt (@var{new_val}, "local")
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2924 Query or set the internal variable that determines whether JIT compilation
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2925 will take place for a specific loop.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2926
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2927 Because compilation is a costly operation it does not make sense to employ
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2928 JIT when the loop count is low. By default only loops with greater than
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2929 1000 iterations will be accelerated.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2930
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2931 When called from inside a function with the @qcode{"local"} option, the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2932 variable is changed locally for the function and any subroutines it calls.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2933 The original variable value is restored when exiting the function.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2934 @seealso{jit_enable, jit_failcnt, debug_jit}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2935 @end deftypefn */)
16941
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2936 {
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2937 #if defined (HAVE_LLVM)
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2938 return SET_INTERNAL_VARIABLE_WITH_LIMITS (jit_startcnt, 1,
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2939 std::numeric_limits<int>::max ());
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2940 #else
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2941 octave_unused_parameter (args);
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
2942 octave_unused_parameter (nargout);
26403
6c65dafb72ca pt-jit.cc: Fix static analyzer detected issues (bug #55347).
Rik <rik@octave.org>
parents: 26376
diff changeset
2943 warn_disabled_feature ("jit_startcnt", "JIT");
21109
bd1752782e56 Use err_disabled_feature, warn_disabled_feature throughout code base.
Rik <rik@octave.org>
parents: 21040
diff changeset
2944 return ovl ();
16941
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2945 #endif
e6ddaa65a777 Add new function jit_startcnt to control JIT acceleration.
Rik <rik@octave.org>
parents: 16930
diff changeset
2946 }