LLVMExamples.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 26 Aug 2016 21:50:03 +0100
changeset 76 a1cd10a34b21
parent 73 466c492b0062
child 78 7a4c769a9fea
permissions -rw-r--r--
llvm_c_ext: Added LLVMSetProcessAllSections() ...as an C interface for llvm::ExecutionEngine::setProcessAllSections(). This may become handy when one wants to control allocation of sections not strictly required for execution.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
"{ NameSpace: Smalltalk }"
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    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
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
	instanceVariableNames:''
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
	classVariableNames:''
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
    21
	poolDictionaries:'LLVMIntPredicate LLVMDWARFEncoding LLVMDWARFLamguage'
13
fa967c0e1827 Renamed class categories to begin with LLVM-S
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    22
	category:'LLVM-S-Core-Examples'
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
!
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
14
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    25
!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
    26
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    27
copyright
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    28
"
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    29
    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
    30
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    31
    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
    32
    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
    33
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    34
    * 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
    35
      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
    36
    * 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
    37
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    38
    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
    39
    a future.
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    40
"
c7dea3fcc5a7 Added short README, license.txt and updated copyright information
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 13
diff changeset
    41
! !
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    43
!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
    44
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    45
isTestSelector:aSelector
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    46
    ^ (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
    47
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    48
    "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
    49
! !
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
!LLVMExamples methodsFor:'examples'!
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
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
    54
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    55
    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
    56
    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
    57
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    58
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
    59
    | module functionType function asm jit externalFunction |
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    61
    "/ 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
    62
    "/    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
    63
    "/    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
    64
    
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    65
    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
    66
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    67
    "/ 2) Define a function within the module with type (intptr_t, intptr_t) -> intptr_t
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    functionType := LLVMType function: { LLVMType intptr . LLVMType intptr } returning: LLVMType intptr.
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    function := module addFunctionNamed: 'sum' type: functionType.
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
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
    71
    "/ 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
    72
    "/    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
    73
    "/    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
    74
    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
    75
    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
    76
    "/ 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
    77
    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
    78
'; 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
    79
source_filename = "example1_sum"
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    81
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
    82
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    83
  %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
    84
  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
    85
}
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
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
    89
    "/ 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
    90
    "/    create a jit object (called ExecutionEngine in LLVM)
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
    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
    92
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
    93
    "/ 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
    94
    "/    the module to be closed and compiled to machine code.
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
    externalFunction := jit externalOfFunction: function.
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    96
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    97
    self assert: (externalFunction callWith: 3 with: 4) == 7
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    98
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    99
    "
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
    LLVMExamples example1_sum
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
    "
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   103
    "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
   104
    "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
   105
!
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
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
   108
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   109
    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
   110
    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
   111
    "
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
   112
    | 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
   113
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   114
    module := LLVMModule newWithName: testSelector.
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   115
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   116
    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
   117
    calleeFunction := module addFunctionNamed: 'sum' type: calleeFunctionType.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   118
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
   119
    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
   120
    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
   121
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   122
    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
   123
    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
   124
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
   125
    asm := callerFunction builder.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   126
    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
   127
    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
   128
'; 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
   129
source_filename = "example2_function_call"
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   130
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   131
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
   132
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   133
  %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
   134
  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
   135
}
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
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
   138
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   139
  %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
   140
  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
   141
}
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   142
').
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   143
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   144
    jit := LLVMExecutionEngine newForModule: module.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   145
    externalFunction := jit externalOfFunction: callerFunction.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   146
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   147
    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
   148
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
    LLVMExamples example2_function_call
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   151
    "
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
    "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
   154
    "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
   155
!
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   156
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   157
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
   158
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   159
    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
   160
    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
   161
    "    
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   162
10
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   163
    | 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
   164
     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
   165
     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
   166
     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
   167
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   168
    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
   169
19
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   170
    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
   171
    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
   172
18
6e80a93f4251 Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 16
diff changeset
   173
    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
   174
18
6e80a93f4251 Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 16
diff changeset
   175
    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
   176
    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
   177
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
   178
    asm := mainFunction builder.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   179
    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
   180
    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
   181
    "
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   182
    module writeBitcodeToFile: '/tmp/main.bc'
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   183
    "    
10
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   184
    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
   185
    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
   186
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   187
    externalFunction call.
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   188
    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
   189
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   190
    "
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   191
    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
   192
    "
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   193
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   194
    "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
   195
    "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
   196
!
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
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
   199
    "
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
    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
   201
    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
   202
    "    
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
    | 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
   205
     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
   206
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
    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
   208
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
    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
   210
    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
   211
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
    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
   213
    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
   214
    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
   215
    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
   216
        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
   217
    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
   218
    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
   219
        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
   220
    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
   221
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
    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
   223
    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
   224
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
    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
   226
    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
   227
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
    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
   230
    "
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
    "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
   233
!
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   234
62
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   235
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
   236
    "
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   237
    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
   238
    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
   239
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   240
    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
   241
    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
   242
    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
   243
    "    
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
    | module 
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   246
     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
   247
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   248
    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
   249
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   250
    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
   251
    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
   252
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   253
    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
   254
    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
   255
    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
   256
        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
   257
    ] else: [ 
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   258
        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
   259
    ].
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
    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
   262
    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
   263
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   264
    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
   265
    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
   266
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
    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
   269
    "
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
    "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
   272
!
2936ec426df6 Added 'block form' of #if:then:else: for easier use
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 61
diff changeset
   273
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   274
example5_factorial
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   275
    "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
   276
     No overflow or negative value checks"
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   277
    
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   278
    | module functionType function asm  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   279
    "Variables" result  i  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   280
    "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
   281
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   282
    module := LLVMModule newWithName:testSelector.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   283
    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
   284
    function := module addFunctionNamed:'factorial' type:functionType.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   285
    asm := LLVMIRBuilder new.
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   286
    entry := function entry.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   287
    loop := function addBasicBlockNamed:'loop'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   288
    loopBody := function addBasicBlockNamed:'loopBody'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   289
    exit := function addBasicBlockNamed:'exit'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   290
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   291
    "/ Generate function setup
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   292
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   293
    "/ 03   function f(v) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   294
    "/ 04    var result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   295
    "/ 05    var i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   296
    "/ 06    result = 0;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   297
    "/ 07    i := v;
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   298
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   299
    asm block:entry.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   300
    result := asm alloca:LLVMType intptr as:'result'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   301
    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
   302
    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
   303
    asm store:(LLVMConstant sintptr: 1) at:result.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   304
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   305
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   306
    "/ 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
   307
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   308
    "/ 08    while ( i > 1 ) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   309
    "/ 09      result = result * i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   310
    "/ 10      i = i - 1.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   311
    "/ 11    }
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   312
    "/ 
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   313
    "/ 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
   314
    "/ 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
   315
    "/ 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
   316
    "/ then-branch.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   317
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   318
    asm block:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   319
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   320
        if:(asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   321
                icmp:(asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   322
                _:(LLVMConstant sintptr:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   323
                cond:LLVMIntSGT)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   324
        then:loopBody
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   325
        else:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   326
    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
   327
    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
   328
    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
   329
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   330
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   331
    "/ Generate return from function
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   332
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   333
    "/ 12    return result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   334
    "/ 13 }
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   335
    "/ 
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   336
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   337
    asm block:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   338
    asm ret:(asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   339
    jit := LLVMExecutionEngine newForModule:module.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   340
    externalFunction := jit externalOfFunction:function.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   341
    self assert:(externalFunction callWith:5) == 120.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   342
    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
   343
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   344
    "
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   345
        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
   346
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   347
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   348
    "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
   349
    "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
   350
!
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
example5_factorial_phi
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   353
    "A simple factorial using recursive algorithm.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   354
     No overflow or negative value checks. 
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   355
     Demonstrates usage of phi node"
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   356
    
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   357
    | module functionType function asm  
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   358
    "Values"       paramIsOneVal paramIsNotOneVal
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   359
    "Blocks" entry paramIsOne    paramIsNotOne exit jit externalFunction |
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   360
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   361
    module := LLVMModule newWithName:testSelector.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   362
    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
   363
    function := module addFunctionNamed:'factorial' type:functionType.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   364
    asm := LLVMIRBuilder new.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   365
    entry := function entry.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   366
    paramIsOne := function addBasicBlockNamed:'paramIsOne'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   367
    paramIsNotOne := function addBasicBlockNamed:'paramIsNotOne'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   368
    exit := function addBasicBlockNamed:'exit'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   369
     
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   370
    "/ Generate function setup
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   371
    "/ 
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   372
    "/ 03   function f(v) {
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   373
    "/ 04    return (v == 1
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   374
    "/ 05             ?  1
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   375
    "/ 07             :  v * f(v - 1)
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   376
    "/ 08    )
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   377
    
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   378
    asm block:entry.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   379
    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
   380
      then: paramIsOne
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   381
      else: paramIsNotOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   382
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   383
    asm block: paramIsOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   384
    paramIsOneVal := LLVMConstant sintptr: 1.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   385
    asm br: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   386
    asm block: paramIsNotOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   387
    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
   388
                              _: (function parameterAt: 1).           
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   389
    asm br: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   390
    asm block: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   391
    asm ret: (asm phi: { paramIsOne -> paramIsOneVal . paramIsNotOneVal }).
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   392
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
    jit := LLVMExecutionEngine newForModule:module.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   395
    externalFunction := jit externalOfFunction:function.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   396
    self assert:(externalFunction callWith:5) == 120.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   397
    self assert:(externalFunction callWith:1) == 1.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   398
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
        LLVMExamples run: example5_factorial_with_debug_info
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   401
    "
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
    "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
   404
    "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
   405
!
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   406
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   407
example6_factorial_with_overflow
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   408
    "
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   409
     Simple factorial using iterative algorithm.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   410
     This one checks for overflow, if overflow happens,
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   411
     return -1"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   412
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   413
    | module  functionType  function  asm  "Variables"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   414
    result  i  "Blocks"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   415
    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
   416
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   417
    module := LLVMModule newWithName:testSelector.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   418
    functionType := LLVMType function:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   419
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   420
                }
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   421
            returning:LLVMType intptr.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   422
    function := module addFunctionNamed:'factorial' type:functionType.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   423
    asm := LLVMIRBuilder new.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   424
    entry := function entry.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   425
    loop := function addBasicBlockNamed:'loop'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   426
    loopBody1 := function addBasicBlockNamed:'loopBody1'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   427
    loopBody2 := function addBasicBlockNamed:'loopBody2'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   428
    exit := function addBasicBlockNamed:'exit'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   429
    overflow := function addBasicBlockNamed:'overflow'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   430
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   431
    "/ Generate function setup
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   432
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   433
    "/   function f(v) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   434
    "/     var result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   435
    "/     var i;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   436
    "/     result = 0;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   437
    "/     i := v;
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   438
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   439
    asm block:entry.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   440
    result := asm alloca:LLVMType intptr as:'result'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   441
    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
   442
    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
   443
    asm store:(LLVMConstant sintptr: 1) at:result.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   444
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   445
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   446
    "/ Generate loop that computes the factorial
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   447
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   448
    "/     while ( i > 1 ) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   449
    "/       result = result * i if overflow goto overflow;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   450
    "/       i = i - 1.
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   451
    "/     }
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
    "/ 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
   454
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   455
    smulWithOverflow := module getIntrinsicNamed:'llvm.smul.with.overflow'
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   456
            types:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   457
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   458
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   459
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   460
    "/ Now code the loop
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   461
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   462
    asm block:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   463
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   464
        if:(asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   465
                icmp:(asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   466
                _:(LLVMConstant sintptr:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   467
                cond:LLVMIntSGT)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   468
        then:loopBody1
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   469
        else:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   470
    asm block:loopBody1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   471
    smulWithOverflowValue := asm call:smulWithOverflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   472
            _:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   473
                    (asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   474
                    (asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   475
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   476
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   477
        if:(asm extractvalue:smulWithOverflowValue at:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   478
        then:overflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   479
        else:loopBody2.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   480
    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
   481
    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
   482
    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
   483
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   484
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   485
    "/ Generate return from function
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   486
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   487
    "/     return result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   488
    "/ 
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   489
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   490
    asm block:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   491
    asm ret:(asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   492
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   493
    "/ Generate overflow handler
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   494
    "/     overflow:
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   495
    "/     return -1;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   496
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   497
    
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   498
    asm block:overflow.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   499
    asm ret:(LLVMConstant sintptr:-1).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   500
    jit := LLVMExecutionEngine newForModule:module.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   501
    externalFunction := jit externalOfFunction:function.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   502
    self assert:(externalFunction callWith:5) == 120.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   503
    self assert:(externalFunction callWith:1) == 1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   504
    self assert:(externalFunction callWith:120) == -1.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   505
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   506
    "sly    LLVMExamples example3_cond"
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   507
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   508
    "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
   509
    "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
   510
!
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
example7_factorial_with_debug_info
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   513
    "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
   514
     with debug info attached. 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   515
    "     
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
    | module functionType function asm   
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   518
    "Variables" result  i  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   519
    "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
   520
    "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
   521
    jit externalFunction |
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   522
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   523
    module := LLVMModule newWithName:testSelector.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   524
    dib := module debugInfoBuilder.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   525
42
23ae490859cd Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 33
diff changeset
   526
    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
   527
    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
   528
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   529
    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
   530
    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
   531
    functionTypeDI := dib createTypeFunction: { intptrDI }.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   532
    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
   533
    functionDI := dib createFunction: 'factorial' in: compilationUnitDI file: fileDI line: 03 type: functionTypeDI local: false definition: true optimized: false.
42
23ae490859cd Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 33
diff changeset
   534
    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
   535
    asm := LLVMIRBuilder new.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   536
    entry := function entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   537
    loop := function addBasicBlockNamed:'loop'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   538
    loopBody := function addBasicBlockNamed:'loopBody'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   539
    exit := function addBasicBlockNamed:'exit'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   540
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   541
    "/ Generate function setup
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
    "/ 03  function f(v) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   544
    "/ 04    var result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   545
    "/ 05    var i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   546
    "/ 06    result = 0;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   547
    "/ 07    i := v;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   548
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   549
    asm block:entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   550
    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
   551
    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
   552
    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
   553
    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
   554
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   555
    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
   556
    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
   557
    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
   558
    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
   559
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   560
    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
   561
    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
   562
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   563
    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
   564
    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
   565
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   566
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   567
    "/ 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
   568
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   569
    "/   08  while ( i > 1 ) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   570
    "/   09    result = result * i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   571
    "/   10    i = i - 1.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   572
    "/   11  }
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   573
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   574
    "/ 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
   575
    "/ 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
   576
    "/ 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
   577
    "/ then-branch.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   578
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   579
    asm block:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   580
    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
   581
    asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   582
        if:(asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   583
                icmp:(asm load:i)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   584
                _:(LLVMConstant sintptr:1)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   585
                cond:LLVMIntSGT)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   586
        then:loopBody
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   587
        else:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   588
    asm block:loopBody.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   589
    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
   590
    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
   591
    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
   592
    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
   593
    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
   594
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   595
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   596
    "/ Generate return from function
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
    "/ 12    return result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   599
    "/ 13  }
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   600
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   601
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   602
    asm block:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   603
    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
   604
    asm ret:(asm load:result).
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   605
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   606
    dib finish.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   607
    self halt.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   608
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   609
    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
   610
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   611
    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
   612
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   613
        module writeBitcodeToFile: '/tmp/factorial.bc'
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
    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
   616
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   617
        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
   618
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   619
    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
   620
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   621
        '/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
   622
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   623
    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
   624
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   625
        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
   626
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   627
    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
   628
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   629
        '/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
   630
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   631
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   632
            f nextPutLine: 'function factorial(v) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   633
            f nextPutLine: '  var result;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   634
            f nextPutLine: '  var i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   635
            f nextPutLine: '  result = 0;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   636
            f nextPutLine: '  i := v;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   637
            f nextPutLine: '  while ( i > 1 ) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   638
            f nextPutLine: '    result = result * i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   639
            f nextPutLine: '    i = i - 1.'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   640
            f nextPutLine: '  }'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   641
            f nextPutLine: '  return result;'.
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
        ]
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   644
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   645
    Then debug it using gdb:
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
            gdb main
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
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
    jit := LLVMExecutionEngine newForModule:module.
76
a1cd10a34b21 llvm_c_ext: Added LLVMSetProcessAllSections()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 73
diff changeset
   652
    jit processAllSections: true.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   653
    externalFunction := jit externalOfFunction:function.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   654
    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
   655
    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
   656
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   657
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   658
     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
   659
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   660
    "Created: / 14-08-2015 / 06:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
76
a1cd10a34b21 llvm_c_ext: Added LLVMSetProcessAllSections()
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 73
diff changeset
   661
    "Modified: / 26-08-2016 / 15:48:16 / 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
   662
!
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   663
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   664
example8_data_at_fixed_address
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
    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
   667
    (known at compilation time)
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   668
    "    
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   669
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   670
    | module 
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   671
     functionType function asm glb val |
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   672
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   673
    module := LLVMModule newWithName: testSelector.
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
    functionType := LLVMType function: {  } returning: LLVMType int32.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   676
    function := module addFunctionNamed: 'test' type: functionType.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   677
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   678
    asm := function builder.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   679
    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
   680
    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
   681
    asm ret: val.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   682
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   683
    self halt.
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
    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
   686
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   687
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   688
    "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
   689
    "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
   690
!
ced2a5c16e70 Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 62
diff changeset
   691
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
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
   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
    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
   695
    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
   696
    "    
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
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
    | 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
   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 := 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
   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
    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
   703
    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
   704
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
    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
   706
    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
   707
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
    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
   709
    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
   710
    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
   711
    asm ret.
71
ab03b0a6d037 Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 70
diff changeset
   712
ab03b0a6d037 Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 70
diff changeset
   713
    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
   714
    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
   715
    "
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
    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
   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
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
    "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
   720
    "Modified: / 08-07-2016 / 15:44:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   721
! !
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   722
71
ab03b0a6d037 Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 70
diff changeset
   723
!LLVMExamples class methodsFor:'documentation'!
ab03b0a6d037 Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 70
diff changeset
   724
ab03b0a6d037 Implemented LLVMType>>sizeInBits/sizeInBytes for all data types
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 70
diff changeset
   725
version_HG
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
    ^ '$Changeset: <not expanded> $'
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