author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Tue, 30 Aug 2016 16:57:29 +0100 | |
changeset 78 | 7a4c769a9fea |
parent 76 | a1cd10a34b21 |
permissions | -rw-r--r-- |
14
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
1 |
" |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
2 |
Copyright (C) 2015-now Jan Vrany |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
3 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
4 |
This code is not an open-source (yet). You may use this code |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
5 |
for your own experiments and projects, given that: |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
6 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
7 |
* all modification to the code will be sent to the |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
8 |
original author for inclusion in future releases |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
9 |
* this is not used in any commercial software |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
10 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
11 |
This license is provisional and may (will) change in |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
12 |
a future. |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
13 |
" |
12
f98e97fd02ef
Package renamed from jv:libllvms to jv:llvm_s
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
10
diff
changeset
|
14 |
"{ Package: 'jv:llvm_s' }" |
8 | 15 |
|
16 |
"{ NameSpace: Smalltalk }" |
|
17 |
||
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
18 |
TestCase subclass:#LLVMExamples |
8 | 19 |
instanceVariableNames:'' |
20 |
classVariableNames:'' |
|
78
7a4c769a9fea
llvm_c_ext: Improved `LLVMSetMetadata2()` to support also function values
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
76
diff
changeset
|
21 |
poolDictionaries:'LLVMIntPredicate LLVMDWARFEncoding LLVMDWARFLamguage |
7a4c769a9fea
llvm_c_ext: Improved `LLVMSetMetadata2()` to support also function values
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
76
diff
changeset
|
22 |
LLVMMetadataID' |
13
fa967c0e1827
Renamed class categories to begin with LLVM-S
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
12
diff
changeset
|
23 |
category:'LLVM-S-Core-Examples' |
8 | 24 |
! |
25 |
||
14
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
26 |
!LLVMExamples class methodsFor:'documentation'! |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
27 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
28 |
copyright |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
29 |
" |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
30 |
Copyright (C) 2015-now Jan Vrany |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
31 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
32 |
This code is not an open-source (yet). You may use this code |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
33 |
for your own experiments and projects, given that: |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
34 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
35 |
* all modification to the code will be sent to the |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
36 |
original author for inclusion in future releases |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
37 |
* this is not used in any commercial software |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
38 |
|
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
39 |
This license is provisional and may (will) change in |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
40 |
a future. |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
41 |
" |
c7dea3fcc5a7
Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
13
diff
changeset
|
42 |
! ! |
8 | 43 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
44 |
!LLVMExamples class methodsFor:'accessing'! |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
45 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
46 |
isTestSelector:aSelector |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
47 |
^ (super isTestSelector:aSelector) or:[ aSelector startsWith: 'example' ] |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
48 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
49 |
"Created: / 03-08-2015 / 09:25:22 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
50 |
! ! |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
51 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
52 |
!LLVMExamples methodsFor:'examples'! |
8 | 53 |
|
54 |
example1_sum |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
55 |
" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
56 |
Creates a simple function taking two arguments (as intptr_t) and returning |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
57 |
their sum (as intptr_t). |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
58 |
" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
59 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
60 |
| module functionType function asm jit externalFunction | |
8 | 61 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
62 |
"/ 1) create a module to which the function would belong. A module is |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
63 |
"/ a set of functions and globals that are compiled at once by the MCJIT. Once |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
64 |
"/ module is compiled, no more methods or clobals can be added. |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
65 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
66 |
module := LLVMModule newWithName: testSelector. |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
67 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
68 |
"/ 2) Define a function within the module with type (intptr_t, intptr_t) -> intptr_t |
8 | 69 |
functionType := LLVMType function: { LLVMType intptr . LLVMType intptr } returning: LLVMType intptr. |
70 |
function := module addFunctionNamed: 'sum' type: functionType. |
|
71 |
||
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
72 |
"/ 2) To emit LLVM IR, get an IR builder for the function. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
73 |
"/ The LLVMFunction>>builder returns a builder on |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
74 |
"/ function's entry point (basic block, strictly speaking) |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
75 |
asm := function builder. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
76 |
asm ret: (asm add:(function parameterAt:1) _:(function parameterAt:2)). |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
77 |
"/ Now, the module should look like |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
78 |
self assert: (module dumpString = |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
79 |
'; ModuleID = ''example1_sum'' |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
80 |
source_filename = "example1_sum" |
8 | 81 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
82 |
define i64 @sum(i64, i64) { |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
83 |
entry: |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
84 |
%2 = add i64 %0, %1 |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
85 |
ret i64 %2 |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
86 |
} |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
87 |
'). |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
88 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
89 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
90 |
"/ 3) To compile a function (strictly speaking, whole module) at runtime, |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
91 |
"/ create a jit object (called ExecutionEngine in LLVM) |
8 | 92 |
jit := LLVMExecutionEngine newForModule: module. |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
93 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
94 |
"/ 4) Finally, obtain a reference to the function. This cause |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
95 |
"/ the module to be closed and compiled to machine code. |
8 | 96 |
externalFunction := jit externalOfFunction: function. |
97 |
||
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
98 |
self assert: (externalFunction callWith: 3 with: 4) == 7 |
8 | 99 |
|
100 |
" |
|
101 |
LLVMExamples example1_sum |
|
102 |
" |
|
103 |
||
104 |
"Created: / 17-07-2015 / 11:47:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
105 |
"Modified: / 11-08-2016 / 09:06:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
106 |
! |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
107 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
108 |
example2_function_call |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
109 |
" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
110 |
Creates a module with two functions, @sum and @sum_caller. The latter |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
111 |
calls the former. |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
112 |
" |
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
113 |
| module calleeFunctionType calleeFunction callerFunctionType callerFunction asm jit externalFunction | |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
114 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
115 |
module := LLVMModule newWithName: testSelector. |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
116 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
117 |
calleeFunctionType := LLVMType function: { LLVMType intptr . LLVMType intptr } returning: LLVMType intptr. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
118 |
calleeFunction := module addFunctionNamed: 'sum' type: calleeFunctionType. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
119 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
120 |
asm := calleeFunction builder. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
121 |
asm ret: (asm add:(calleeFunction parameterAt:1) _:(calleeFunction parameterAt:2)). |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
122 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
123 |
callerFunctionType := LLVMType function: { LLVMType intptr . LLVMType intptr } returning: LLVMType intptr. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
124 |
callerFunction := module addFunctionNamed: 'sum_caller' type: callerFunctionType. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
125 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
126 |
asm := callerFunction builder. |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
127 |
asm ret: (asm call: calleeFunction _: { (callerFunction parameterAt: 1) . (callerFunction parameterAt: 2) }). |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
128 |
self assert: (module dumpString = |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
129 |
'; ModuleID = ''example2_function_call'' |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
130 |
source_filename = "example2_function_call" |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
131 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
132 |
define i64 @sum(i64, i64) { |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
133 |
entry: |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
134 |
%2 = add i64 %0, %1 |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
135 |
ret i64 %2 |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
136 |
} |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
137 |
|
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
138 |
define i64 @sum_caller(i64, i64) { |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
139 |
entry: |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
140 |
%2 = call i64 @sum(i64 %0, i64 %1) |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
141 |
ret i64 %2 |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
142 |
} |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
143 |
'). |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
144 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
145 |
jit := LLVMExecutionEngine newForModule: module. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
146 |
externalFunction := jit externalOfFunction: callerFunction. |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
147 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
148 |
self assert: (externalFunction callWith: 3 with: 4) == 7. |
9
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
149 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
150 |
" |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
151 |
LLVMExamples example2_function_call |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
152 |
" |
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
153 |
|
540c1c31a33d
Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
8
diff
changeset
|
154 |
"Created: / 17-07-2015 / 12:45:08 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
155 |
"Modified: / 11-08-2016 / 09:06:29 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
156 |
! |
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
157 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
158 |
example3_hello_world |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
159 |
" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
160 |
Creates a function @main() which calls @printf() to print |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
161 |
a famous 'Hello World!!' message on stdout |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
162 |
" |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
163 |
|
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
164 |
| module printfFunctionType printfFunction |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
165 |
helloWorldString |
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
166 |
mainFunctionType mainFunction |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
167 |
asm jit externalFunction | |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
168 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
169 |
module := LLVMModule newWithName: testSelector. |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
170 |
|
19
706be0fcef22
Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
18
diff
changeset
|
171 |
printfFunctionType := LLVMType function: { LLVMType char pointer } varargs: true returning: LLVMType int32. |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
172 |
printfFunction := module addFunctionNamed: 'printf' type: printfFunctionType. |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
173 |
|
18
6e80a93f4251
Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
16
diff
changeset
|
174 |
helloWorldString := module addGlobalNamed: '.str' value: (LLVMConstant string: 'Hello World!!' , Character lf). |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
175 |
|
18
6e80a93f4251
Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
16
diff
changeset
|
176 |
mainFunctionType := LLVMType function: #() returning: LLVMType int32. |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
177 |
mainFunction := module addFunctionNamed: 'main' type: mainFunctionType. |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
178 |
|
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
179 |
asm := mainFunction builder. |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
180 |
asm call: printfFunction _: { asm gep: helloWorldString at: #(0 0) }. |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
181 |
asm ret: (LLVMConstant sint32: 0). |
19
706be0fcef22
Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
18
diff
changeset
|
182 |
" |
706be0fcef22
Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
18
diff
changeset
|
183 |
module writeBitcodeToFile: '/tmp/main.bc' |
706be0fcef22
Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
18
diff
changeset
|
184 |
" |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
185 |
jit := LLVMExecutionEngine newForModule: module. |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
186 |
externalFunction := jit externalOfFunction: mainFunction. |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
187 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
188 |
externalFunction call. |
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
189 |
Stdout flush |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
190 |
|
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
191 |
" |
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
192 |
LLVMExamples example3_hello_world |
10
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
193 |
" |
8998c2d4e53a
Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
9
diff
changeset
|
194 |
|
16
23e82cf19788
Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
14
diff
changeset
|
195 |
"Created: / 03-08-2015 / 10:28:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
196 |
"Modified: / 10-08-2015 / 18:58:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
22
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
197 |
! |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
198 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
199 |
example4_cond |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
200 |
" |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
201 |
Creates a function @even(intpr) which returns |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
202 |
1 if the parameter is even or 0 if not. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
203 |
" |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
204 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
205 |
| module |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
206 |
functionType function asm isOdd ifOdd ifEven jit externalFunction | |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
207 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
208 |
module := LLVMModule newWithName: testSelector. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
209 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
210 |
functionType := LLVMType function: { LLVMType intptr } returning: LLVMType intptr. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
211 |
function := module addFunctionNamed: 'even' type: functionType. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
212 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
213 |
asm := function builder. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
214 |
isOdd := asm icmp: (asm and: (function parameterAt: 1) _: (LLVMConstant uintptr: 1)) _: (LLVMConstant uintptr: 1) cond: LLVMIntEQ. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
215 |
ifOdd := function addBasicBlock. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
216 |
ifOdd builder |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
217 |
ret: (LLVMConstant uintptr: 0). |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
218 |
ifEven := function addBasicBlock. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
219 |
ifEven builder |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
220 |
ret: (LLVMConstant uintptr: 1). |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
221 |
asm if: isOdd then: ifOdd else: ifEven. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
222 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
223 |
jit := LLVMExecutionEngine newForModule: module. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
224 |
externalFunction := jit externalOfFunction: function. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
225 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
226 |
self assert: (externalFunction callWith: 10) == 1. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
227 |
self assert: (externalFunction callWith: 11) == 0. |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
228 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
229 |
" |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
230 |
LLVMExamples example3_cond |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
231 |
" |
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
232 |
|
789a35bd30ac
Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
19
diff
changeset
|
233 |
"Created: / 08-08-2015 / 04:16:25 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
234 |
! |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
235 |
|
62
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
236 |
example4_cond_easy |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
237 |
" |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
238 |
Creates a function @even(intpr) which returns |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
239 |
1 if the parameter is even or 0 if not. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
240 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
241 |
This demonstrate usage of blocks with |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
242 |
LLVMIRBuilder>>if:then:else: which is easier to use |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
243 |
than fiddling about basic blocks manually. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
244 |
" |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
245 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
246 |
| module |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
247 |
functionType function asm isOdd jit externalFunction | |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
248 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
249 |
module := LLVMModule newWithName: testSelector. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
250 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
251 |
functionType := LLVMType function: { LLVMType intptr } returning: LLVMType intptr. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
252 |
function := module addFunctionNamed: 'even' type: functionType. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
253 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
254 |
asm := function builder. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
255 |
isOdd := asm icmp: (asm and: (function parameterAt: 1) _: (LLVMConstant uintptr: 1)) _: (LLVMConstant uintptr: 1) cond: LLVMIntEQ. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
256 |
asm if: isOdd then: [ |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
257 |
asm ret: (LLVMConstant uintptr: 0). |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
258 |
] else: [ |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
259 |
asm ret: (LLVMConstant uintptr: 1). |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
260 |
]. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
261 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
262 |
jit := LLVMExecutionEngine newForModule: module. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
263 |
externalFunction := jit externalOfFunction: function. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
264 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
265 |
self assert: (externalFunction callWith: 10) == 1. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
266 |
self assert: (externalFunction callWith: 11) == 0. |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
267 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
268 |
" |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
269 |
LLVMExamples example3_cond |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
270 |
" |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
271 |
|
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
272 |
"Created: / 22-04-2016 / 10:22:05 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
273 |
! |
2936ec426df6
Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
61
diff
changeset
|
274 |
|
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
275 |
example5_factorial |
61
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
276 |
"A simple factorial using iterative algorithm. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
277 |
No overflow or negative value checks" |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
278 |
|
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
279 |
| module functionType function asm |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
280 |
"Variables" result i |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
281 |
"Blocks" entry loop loopBody exit jit externalFunction | |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
282 |
|
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
283 |
module := LLVMModule newWithName:testSelector. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
284 |
functionType := LLVMType function:{ LLVMType intptr } returning:LLVMType intptr. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
285 |
function := module addFunctionNamed:'factorial' type:functionType. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
286 |
asm := LLVMIRBuilder new. |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
287 |
entry := function entry. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
288 |
loop := function addBasicBlockNamed:'loop'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
289 |
loopBody := function addBasicBlockNamed:'loopBody'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
290 |
exit := function addBasicBlockNamed:'exit'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
291 |
|
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
292 |
"/ Generate function setup |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
293 |
"/ |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
294 |
"/ 03 function f(v) { |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
295 |
"/ 04 var result; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
296 |
"/ 05 var i; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
297 |
"/ 06 result = 0; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
298 |
"/ 07 i := v; |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
299 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
300 |
asm block:entry. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
301 |
result := asm alloca:LLVMType intptr as:'result'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
302 |
i := asm alloca:LLVMType intptr as:'i'. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
303 |
asm store:(function parameterAt:1) at:i. |
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
304 |
asm store:(LLVMConstant sintptr: 1) at:result. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
305 |
asm br:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
306 |
|
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
307 |
"/ Generate loop that computes the factorial |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
308 |
"/ |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
309 |
"/ 08 while ( i > 1 ) { |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
310 |
"/ 09 result = result * i; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
311 |
"/ 10 i = i - 1. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
312 |
"/ 11 } |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
313 |
"/ |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
314 |
"/ Note, that unlike 'traditional' assemblers, there's no |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
315 |
"/ fall-through instruction, so we have to introduce a block |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
316 |
"/ loop's body which will become a target for conditional's |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
317 |
"/ then-branch. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
318 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
319 |
asm block:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
320 |
asm |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
321 |
if:(asm |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
322 |
icmp:(asm load:i) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
323 |
_:(LLVMConstant sintptr:1) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
324 |
cond:LLVMIntSGT) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
325 |
then:loopBody |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
326 |
else:exit. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
327 |
asm block:loopBody. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
328 |
asm store:(asm mul:(asm load:result) _:(asm load:i)) at:result. |
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
329 |
asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) at:i. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
330 |
asm br:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
331 |
|
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
332 |
"/ Generate return from function |
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
333 |
"/ |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
334 |
"/ 12 return result; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
335 |
"/ 13 } |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
336 |
"/ |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
337 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
338 |
asm block:exit. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
339 |
asm ret:(asm load:result). |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
340 |
jit := LLVMExecutionEngine newForModule:module. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
341 |
externalFunction := jit externalOfFunction:function. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
342 |
self assert:(externalFunction callWith:5) == 120. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
343 |
self assert:(externalFunction callWith:1) == 1. |
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
344 |
|
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
345 |
" |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
346 |
LLVMExamples run: example5_factorial_with_debug_info |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
347 |
" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
348 |
|
23
0744cd9c0acc
Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
22
diff
changeset
|
349 |
"Created: / 10-08-2015 / 09:46:29 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
350 |
"Modified: / 11-08-2016 / 09:06:54 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
61
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
351 |
! |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
352 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
353 |
example5_factorial_phi |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
354 |
"A simple factorial using recursive algorithm. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
355 |
No overflow or negative value checks. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
356 |
Demonstrates usage of phi node" |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
357 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
358 |
| module functionType function asm |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
359 |
"Values" paramIsOneVal paramIsNotOneVal |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
360 |
"Blocks" entry paramIsOne paramIsNotOne exit jit externalFunction | |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
361 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
362 |
module := LLVMModule newWithName:testSelector. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
363 |
functionType := LLVMType function:{ LLVMType intptr } returning:LLVMType intptr. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
364 |
function := module addFunctionNamed:'factorial' type:functionType. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
365 |
asm := LLVMIRBuilder new. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
366 |
entry := function entry. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
367 |
paramIsOne := function addBasicBlockNamed:'paramIsOne'. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
368 |
paramIsNotOne := function addBasicBlockNamed:'paramIsNotOne'. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
369 |
exit := function addBasicBlockNamed:'exit'. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
370 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
371 |
"/ Generate function setup |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
372 |
"/ |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
373 |
"/ 03 function f(v) { |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
374 |
"/ 04 return (v == 1 |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
375 |
"/ 05 ? 1 |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
376 |
"/ 07 : v * f(v - 1) |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
377 |
"/ 08 ) |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
378 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
379 |
asm block:entry. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
380 |
asm if: (asm icmp:(function parameterAt: 1) _:(LLVMConstant sintptr:1) cond:LLVMIntEQ) |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
381 |
then: paramIsOne |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
382 |
else: paramIsNotOne. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
383 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
384 |
asm block: paramIsOne. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
385 |
paramIsOneVal := LLVMConstant sintptr: 1. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
386 |
asm br: exit. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
387 |
asm block: paramIsNotOne. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
388 |
paramIsNotOneVal := asm mul: (asm call: function _: { asm sub: (function parameterAt: 1) _: (LLVMConstant sintptr: 1) }) |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
389 |
_: (function parameterAt: 1). |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
390 |
asm br: exit. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
391 |
asm block: exit. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
392 |
asm ret: (asm phi: { paramIsOne -> paramIsOneVal . paramIsNotOneVal }). |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
393 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
394 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
395 |
jit := LLVMExecutionEngine newForModule:module. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
396 |
externalFunction := jit externalOfFunction:function. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
397 |
self assert:(externalFunction callWith:5) == 120. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
398 |
self assert:(externalFunction callWith:1) == 1. |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
399 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
400 |
" |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
401 |
LLVMExamples run: example5_factorial_with_debug_info |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
402 |
" |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
403 |
|
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
404 |
"Created: / 21-04-2016 / 22:14:30 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
405 |
"Modified: / 22-04-2016 / 09:10:21 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
406 |
! |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
407 |
|
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
408 |
example6_factorial_with_overflow |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
409 |
" |
61
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
410 |
Simple factorial using iterative algorithm. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
411 |
This one checks for overflow, if overflow happens, |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
412 |
return -1" |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
413 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
414 |
| module functionType function asm "Variables" |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
415 |
result i "Blocks" |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
416 |
entry loop loopBody1 loopBody2 exit overflow smulWithOverflow smulWithOverflowValue jit externalFunction | |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
417 |
|
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
418 |
module := LLVMModule newWithName:testSelector. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
419 |
functionType := LLVMType function:{ |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
420 |
LLVMType intptr |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
421 |
} |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
422 |
returning:LLVMType intptr. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
423 |
function := module addFunctionNamed:'factorial' type:functionType. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
424 |
asm := LLVMIRBuilder new. |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
425 |
entry := function entry. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
426 |
loop := function addBasicBlockNamed:'loop'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
427 |
loopBody1 := function addBasicBlockNamed:'loopBody1'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
428 |
loopBody2 := function addBasicBlockNamed:'loopBody2'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
429 |
exit := function addBasicBlockNamed:'exit'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
430 |
overflow := function addBasicBlockNamed:'overflow'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
431 |
|
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
432 |
"/ Generate function setup |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
433 |
"/ |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
434 |
"/ function f(v) { |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
435 |
"/ var result; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
436 |
"/ var i; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
437 |
"/ result = 0; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
438 |
"/ i := v; |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
439 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
440 |
asm block:entry. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
441 |
result := asm alloca:LLVMType intptr as:'result'. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
442 |
i := asm alloca:LLVMType intptr as:'i'. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
443 |
asm store:(function parameterAt:1) at:i. |
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
444 |
asm store:(LLVMConstant sintptr: 1) at:result. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
445 |
asm br:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
446 |
|
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
447 |
"/ Generate loop that computes the factorial |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
448 |
"/ |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
449 |
"/ while ( i > 1 ) { |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
450 |
"/ result = result * i if overflow goto overflow; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
451 |
"/ i = i - 1. |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
452 |
"/ } |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
453 |
"/ |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
454 |
"/ First, get the llvm.smul.with.overflow intrinsic: |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
455 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
456 |
smulWithOverflow := module getIntrinsicNamed:'llvm.smul.with.overflow' |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
457 |
types:{ |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
458 |
LLVMType intptr |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
459 |
}. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
460 |
|
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
461 |
"/ Now code the loop |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
462 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
463 |
asm block:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
464 |
asm |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
465 |
if:(asm |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
466 |
icmp:(asm load:i) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
467 |
_:(LLVMConstant sintptr:1) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
468 |
cond:LLVMIntSGT) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
469 |
then:loopBody1 |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
470 |
else:exit. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
471 |
asm block:loopBody1. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
472 |
smulWithOverflowValue := asm call:smulWithOverflow |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
473 |
_:{ |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
474 |
(asm load:result). |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
475 |
(asm load:i) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
476 |
}. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
477 |
asm |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
478 |
if:(asm extractvalue:smulWithOverflowValue at:1) |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
479 |
then:overflow |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
480 |
else:loopBody2. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
481 |
asm block:loopBody2. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
482 |
asm store:(asm extractvalue:smulWithOverflowValue at:0) at:result. |
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
483 |
asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) at:i. |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
484 |
asm br:loop. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
485 |
|
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
486 |
"/ Generate return from function |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
487 |
"/ |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
488 |
"/ return result; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
489 |
"/ |
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
490 |
|
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
491 |
asm block:exit. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
492 |
asm ret:(asm load:result). |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
493 |
|
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
494 |
"/ Generate overflow handler |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
495 |
"/ overflow: |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
496 |
"/ return -1; |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
497 |
"/ |
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
498 |
|
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
499 |
asm block:overflow. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
500 |
asm ret:(LLVMConstant sintptr:-1). |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
501 |
jit := LLVMExecutionEngine newForModule:module. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
502 |
externalFunction := jit externalOfFunction:function. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
503 |
self assert:(externalFunction callWith:5) == 120. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
504 |
self assert:(externalFunction callWith:1) == 1. |
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
505 |
self assert:(externalFunction callWith:120) == -1. |
24
7e7ddd55174c
Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23
diff
changeset
|
506 |
|
28
97013ae2abae
Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
24
diff
changeset
|
507 |
"sly LLVMExamples example3_cond" |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
508 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
509 |
"Created: / 14-08-2015 / 06:46:31 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
510 |
"Modified: / 10-08-2016 / 23:01:35 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
511 |
! |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
512 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
513 |
example7_factorial_with_debug_info |
61
c2e287d54de5
Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
57
diff
changeset
|
514 |
"A simple factorial using iterative algorithm |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
515 |
with debug info attached. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
516 |
" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
517 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
518 |
| module functionType function asm |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
519 |
"Variables" result i |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
520 |
"Blocks" entry loop loopBody exit |
42
23ae490859cd
Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
33
diff
changeset
|
521 |
"Debug Info Metadata" dib fileDI compilationUnitDI functionTypeDI functionDI intptrDI resultDI iDI |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
522 |
jit externalFunction | |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
523 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
524 |
module := LLVMModule newWithName:testSelector. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
525 |
dib := module debugInfoBuilder. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
526 |
|
42
23ae490859cd
Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
33
diff
changeset
|
527 |
fileDI := dib createFile: Filename currentDirectory / 'factorial.lang'. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
528 |
compilationUnitDI := dib createCompilationUnit: Filename currentDirectory / 'factorial.lang' language: LLVM_DW_LANG_lo_user + 10 producer: self class name. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
529 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
530 |
functionType := LLVMType function:{ LLVMType intptr } returning:LLVMType intptr. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
531 |
intptrDI := dib createTypeScalar: 'intptr' type: LLVMType intptr encoding: LLVM_DW_ATE_signed. |
55
41b3437f1fc7
LLVM C API Extensions: Updated Smalltalk API to reflect LLVM 3.9 API.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
42
diff
changeset
|
532 |
functionTypeDI := dib createTypeFunction: { intptrDI }. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
533 |
function := module addFunctionNamed:'factorial' type:functionType. |
55
41b3437f1fc7
LLVM C API Extensions: Updated Smalltalk API to reflect LLVM 3.9 API.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
42
diff
changeset
|
534 |
functionDI := dib createFunction: 'factorial' in: compilationUnitDI file: fileDI line: 03 type: functionTypeDI local: false definition: true optimized: false. |
78
7a4c769a9fea
llvm_c_ext: Improved `LLVMSetMetadata2()` to support also function values
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
76
diff
changeset
|
535 |
function metadataAt: MD_dbg put: functionDI. |
42
23ae490859cd
Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
33
diff
changeset
|
536 |
dib createParameterVariable: 'v' in: functionDI file: fileDI line: 03 type: intptrDI flags: 0 index: 1. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
537 |
asm := LLVMIRBuilder new. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
538 |
entry := function entry. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
539 |
loop := function addBasicBlockNamed:'loop'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
540 |
loopBody := function addBasicBlockNamed:'loopBody'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
541 |
exit := function addBasicBlockNamed:'exit'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
542 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
543 |
"/ Generate function setup |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
544 |
"/ |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
545 |
"/ 03 function f(v) { |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
546 |
"/ 04 var result; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
547 |
"/ 05 var i; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
548 |
"/ 06 result = 0; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
549 |
"/ 07 i := v; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
550 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
551 |
asm block:entry. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
552 |
asm line: 4 column: 3 scope: functionDI. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
553 |
result := asm alloca:LLVMType intptr as:'result'. |
42
23ae490859cd
Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
33
diff
changeset
|
554 |
resultDI := dib createAutomaticVariable: 'result' in: functionDI file: fileDI line: 4 type: intptrDI. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
555 |
dib insertDeclare: result variable: resultDI expression: dib createExpression location: asm location atEndOf: entry. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
556 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
557 |
asm line: 5 column: 3 scope: functionDI. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
558 |
i := asm alloca:LLVMType intptr as:'i'. |
42
23ae490859cd
Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
33
diff
changeset
|
559 |
iDI := dib createAutomaticVariable: 'i' in: functionDI file: fileDI line: 4 type: intptrDI. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
560 |
dib insertDeclare: i variable: iDI expression: dib createExpression location: asm location atEndOf: entry. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
561 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
562 |
asm line: 6 column: 3 scope: functionDI. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
563 |
asm store:(function parameterAt:1) at:i. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
564 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
565 |
asm line: 7 column: 3 scope: functionDI. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
566 |
asm store:(LLVMConstant sintptr: 1) at:result. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
567 |
asm br:loop. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
568 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
569 |
"/ Generate loop that computes the factorial |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
570 |
"/ |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
571 |
"/ 08 while ( i > 1 ) { |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
572 |
"/ 09 result = result * i; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
573 |
"/ 10 i = i - 1. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
574 |
"/ 11 } |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
575 |
"/ |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
576 |
"/ Note, that unlike 'traditional' assemblers, there's no |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
577 |
"/ fall-through instruction, so we have to introduce a block |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
578 |
"/ loop's body which will become a target for conditional's |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
579 |
"/ then-branch. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
580 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
581 |
asm block:loop. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
582 |
asm line: 8 column: 3 scope: functionDI. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
583 |
asm |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
584 |
if:(asm |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
585 |
icmp:(asm load:i) |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
586 |
_:(LLVMConstant sintptr:1) |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
587 |
cond:LLVMIntSGT) |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
588 |
then:loopBody |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
589 |
else:exit. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
590 |
asm block:loopBody. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
591 |
asm line: 9 column: 3 scope: functionDI. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
592 |
asm store:(asm mul:(asm load:result) _:(asm load:i)) at:result. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
593 |
asm line: 10 column: 3 scope: functionDI. |
73
466c492b0062
Oops, fixed examples after a rename #store:_: to #store:at:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
71
diff
changeset
|
594 |
asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) at:i. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
595 |
asm line: 11 column: 3 scope: functionDI. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
596 |
asm br:loop. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
597 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
598 |
"/ Generate return from function |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
599 |
"/ |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
600 |
"/ 12 return result; |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
601 |
"/ 13 } |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
602 |
"/ |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
603 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
604 |
asm block:exit. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
605 |
asm line: 12 column: 3 scope: functionDI. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
606 |
asm ret:(asm load:result). |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
607 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
608 |
dib finish. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
609 |
self halt. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
610 |
" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
611 |
To generate stand-alone executable do the following: |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
612 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
613 |
1) Execute following to write LLVM IR to /tmp/factorial.ll |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
614 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
615 |
module writeBitcodeToFile: '/tmp/factorial.bc' |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
616 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
617 |
2) Compile it into an object file |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
618 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
619 |
llc-3.8 --filetype=obj factorial.bc |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
620 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
621 |
3) Write a simple main.c to call factorial(): |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
622 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
623 |
'/tmp/main.c' asFilename writingFileDo:[:f | f nextPutAll: 'int main(int argc, char **argv) { factorial(5); exit(0); }' ]. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
624 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
625 |
4) Compile main.c and link it with factorial.o |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
626 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
627 |
gcc -o main main.c factorial.o |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
628 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
629 |
To actually debug it, first write the pseudo-code for the factorial: |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
630 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
631 |
'/tmp/factorial.lang' asFilename writingFileDo:[ :f| |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
632 |
f nextPutLine: ''. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
633 |
f nextPutLine: ''. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
634 |
f nextPutLine: 'function factorial(v) {'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
635 |
f nextPutLine: ' var result;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
636 |
f nextPutLine: ' var i;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
637 |
f nextPutLine: ' result = 0;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
638 |
f nextPutLine: ' i := v;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
639 |
f nextPutLine: ' while ( i > 1 ) {'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
640 |
f nextPutLine: ' result = result * i;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
641 |
f nextPutLine: ' i = i - 1.'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
642 |
f nextPutLine: ' }'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
643 |
f nextPutLine: ' return result;'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
644 |
f nextPutLine: '}'. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
645 |
] |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
646 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
647 |
Then debug it using gdb: |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
648 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
649 |
gdb main |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
650 |
" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
651 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
652 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
653 |
jit := LLVMExecutionEngine newForModule:module. |
76
a1cd10a34b21
llvm_c_ext: Added LLVMSetProcessAllSections()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
73
diff
changeset
|
654 |
jit processAllSections: true. |
33
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
655 |
externalFunction := jit externalOfFunction:function. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
656 |
self assert:(externalFunction callWith:5) == 120. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
657 |
self assert:(externalFunction callWith:1) == 1. |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
658 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
659 |
" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
660 |
LLVMExamples example7_factorial_with_debug_info" |
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
661 |
|
feabf14b6c1d
Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
28
diff
changeset
|
662 |
"Created: / 14-08-2015 / 06:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
78
7a4c769a9fea
llvm_c_ext: Improved `LLVMSetMetadata2()` to support also function values
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
76
diff
changeset
|
663 |
"Modified: / 30-08-2016 / 23:28:45 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
57
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
664 |
! |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
665 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
666 |
example8_data_at_fixed_address |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
667 |
" |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
668 |
Creates a function that returns an int value at fixed address |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
669 |
(known at compilation time) |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
670 |
" |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
671 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
672 |
| module |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
673 |
functionType function asm glb val | |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
674 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
675 |
module := LLVMModule newWithName: testSelector. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
676 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
677 |
functionType := LLVMType function: { } returning: LLVMType int32. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
678 |
function := module addFunctionNamed: 'test' type: functionType. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
679 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
680 |
asm := function builder. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
681 |
glb := asm int: (LLVMConstant uintptr: 1234) toPtr: LLVMType int32 pointer. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
682 |
val := asm load: (asm gep: glb at: #(1)). |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
683 |
asm ret: val. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
684 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
685 |
self halt. |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
686 |
" |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
687 |
LLVMExamples new example8_data_at_fixed_address |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
688 |
" |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
689 |
|
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
690 |
"Created: / 11-02-2016 / 20:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
4ca7c3a327a2
LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
55
diff
changeset
|
691 |
"Modified: / 12-02-2016 / 11:11:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
70
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
692 |
! |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
693 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
694 |
example9_memset |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
695 |
" |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
696 |
Creates a function that clears alloca()ted structure, |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
697 |
Shows use of llvm.memset intrinsic. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
698 |
" |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
699 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
700 |
| module functionType function asm pointTy point | |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
701 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
702 |
module := LLVMModule newWithName: testSelector ? 'test'. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
703 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
704 |
pointTy := LLVMType named: 'point_t'. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
705 |
pointTy elementTypes: { LLVMType int32 . LLVMType int32 }. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
706 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
707 |
functionType := LLVMType function: { } returning: LLVMType void. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
708 |
function := module addFunctionNamed: 'test' type: functionType. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
709 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
710 |
asm := function builder. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
711 |
point := asm alloca: pointTy as: 'point'. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
712 |
asm memset: point _: (LLVMConstant uint8: 0) _: (LLVMConstant uint64: (LLVMType int32 sizeInBytes * 2)) _: 1 _: false. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
713 |
asm ret. |
71
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
714 |
|
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
715 |
module verify. |
70
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
716 |
self halt. |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
717 |
" |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
718 |
LLVMExamples new example9_memset |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
719 |
" |
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
720 |
|
ced2a5c16e70
Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
62
diff
changeset
|
721 |
"Created: / 06-07-2016 / 00:01:45 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
71
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
722 |
"Modified: / 08-07-2016 / 15:44:49 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
8 | 723 |
! ! |
724 |
||
71
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
725 |
!LLVMExamples class methodsFor:'documentation'! |
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
726 |
|
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
727 |
version_HG |
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
728 |
|
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
729 |
^ '$Changeset: <not expanded> $' |
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
730 |
! ! |
ab03b0a6d037
Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
70
diff
changeset
|
731 |