LLVMExamples.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 21 Apr 2016 22:17:02 +0100
changeset 61 c2e287d54de5
parent 57 4ca7c3a327a2
child 62 2936ec426df6
permissions -rw-r--r--
Added support for PHI nodes. Even though manual use of these is discouraged, this may be very handy when one needs to generate `cond ? tval : fval` kind of expression. In some cases one may not use `select` instructions is nay compile to CMOV on Intel which has its issues and may lead to SEGV.
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''
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    80
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
    81
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    82
  %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
    83
  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
    84
}
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
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
    88
    "/ 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
    89
    "/    create a jit object (called ExecutionEngine in LLVM)
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
    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
    91
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
    92
    "/ 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
    93
    "/    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
    94
    externalFunction := jit externalOfFunction: function.
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    95
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
    96
    self assert: (externalFunction callWith: 3 with: 4) == 7
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    97
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
    LLVMExamples example1_sum
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   100
    "
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
    "Created: / 17-07-2015 / 11:47:11 / 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
   103
    "Modified: / 08-08-2015 / 04:33:22 / 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
   104
!
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
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
   107
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   108
    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
   109
    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
   110
    "
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
   111
    | 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
   112
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   113
    module := LLVMModule newWithName: testSelector.
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   114
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   115
    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
   116
    calleeFunction := module addFunctionNamed: 'sum' type: calleeFunctionType.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   117
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
   118
    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
   119
    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
   120
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   121
    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
   122
    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
   123
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
   124
    asm := callerFunction builder.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   125
    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
   126
    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
   127
'; ModuleID = ''example2_function_call''
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   128
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   129
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
   130
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   131
  %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
   132
  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
   133
}
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   134
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   135
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
   136
entry:
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   137
  %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
   138
  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
   139
}
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   140
').
9
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   141
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   142
    jit := LLVMExecutionEngine newForModule: module.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   143
    externalFunction := jit externalOfFunction: callerFunction.
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   144
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   145
    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
   146
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   147
    "
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   148
    LLVMExamples example2_function_call
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   149
    "
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   150
540c1c31a33d Added basic support for calling functions.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 8
diff changeset
   151
    "Created: / 17-07-2015 / 12:45:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   152
    "Modified: / 10-08-2015 / 18:58:10 / 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
   153
!
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   154
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   155
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
   156
    "
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   157
    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
   158
    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
   159
    "    
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   160
10
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   161
    | 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
   162
     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
   163
     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
   164
     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
   165
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   166
    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
   167
19
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   168
    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
   169
    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
   170
18
6e80a93f4251 Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 16
diff changeset
   171
    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
   172
18
6e80a93f4251 Oops, fixed #example3_hello_world
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 16
diff changeset
   173
    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
   174
    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
   175
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
   176
    asm := mainFunction builder.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   177
    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
   178
    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
   179
    "
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   180
    module writeBitcodeToFile: '/tmp/main.bc'
706be0fcef22 Refactored 'Hello World' example to ise GEP.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18
diff changeset
   181
    "    
10
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   182
    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
   183
    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
   184
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 call.
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   186
    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
   187
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   188
    "
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   189
    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
   190
    "
8998c2d4e53a Added simple example of calling function defined within the same module.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 9
diff changeset
   191
16
23e82cf19788 Tests refactored to be actually a testcase. Introduced LLVMConstant class
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   192
    "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
   193
    "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
   194
!
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   195
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
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
   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
    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
   199
    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
   200
    "    
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   201
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
    | 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
   203
     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
   204
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   205
    module := 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
   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
    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
   208
    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
   209
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   210
    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
   211
    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
   212
    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
   213
    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
   214
        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
   215
    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
   216
    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
   217
        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
   218
    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
   219
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
    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
   221
    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
   222
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   223
    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
   224
    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
   225
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   226
    "
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
    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
   228
    "
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   229
789a35bd30ac Added example for compiling conditional. Added convenience API to simply code generation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 19
diff changeset
   230
    "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
   231
!
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   232
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   233
example5_factorial
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   234
    "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
   235
     No overflow or negative value checks"
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   236
    
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   237
    | module functionType function asm  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   238
    "Variables" result  i  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   239
    "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
   240
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   241
    module := LLVMModule newWithName:testSelector.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   242
    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
   243
    function := module addFunctionNamed:'factorial' type:functionType.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   244
    asm := LLVMIRBuilder new.
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   245
    entry := function entry.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   246
    loop := function addBasicBlockNamed:'loop'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   247
    loopBody := function addBasicBlockNamed:'loopBody'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   248
    exit := function addBasicBlockNamed:'exit'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   249
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   250
    "/ Generate function setup
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   251
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   252
    "/ 03   function f(v) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   253
    "/ 04    var result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   254
    "/ 05    var i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   255
    "/ 06    result = 0;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   256
    "/ 07    i := v;
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   257
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   258
    asm block:entry.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   259
    result := asm alloca:LLVMType intptr as:'result'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   260
    i := asm alloca:LLVMType intptr as:'i'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   261
    asm store:(function parameterAt:1) _:i.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   262
    asm store:(LLVMConstant sintptr: 1) _:result.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   263
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   264
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   265
    "/ 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
   266
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   267
    "/ 08    while ( i > 1 ) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   268
    "/ 09      result = result * i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   269
    "/ 10      i = i - 1.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   270
    "/ 11    }
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   271
    "/ 
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   272
    "/ 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
   273
    "/ 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
   274
    "/ 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
   275
    "/ then-branch.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   276
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   277
    asm block:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   278
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   279
        if:(asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   280
                icmp:(asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   281
                _:(LLVMConstant sintptr:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   282
                cond:LLVMIntSGT)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   283
        then:loopBody
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   284
        else:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   285
    asm block:loopBody.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   286
    asm store:(asm mul:(asm load:result) _:(asm load:i)) _:result.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   287
    asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) _:i.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   288
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   289
     
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   290
    "/ Generate return from function
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   291
    "/ 
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   292
    "/ 12    return result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   293
    "/ 13 }
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   294
    "/ 
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   295
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   296
    asm block:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   297
    asm ret:(asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   298
    jit := LLVMExecutionEngine newForModule:module.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   299
    externalFunction := jit externalOfFunction:function.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   300
    self assert:(externalFunction callWith:5) == 120.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   301
    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
   302
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   303
    "
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   304
        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
   305
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   306
23
0744cd9c0acc Added an example of iterative factorial function
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 22
diff changeset
   307
    "Created: / 10-08-2015 / 09:46:29 / 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
   308
    "Modified: / 17-08-2015 / 07:39:41 / 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
   309
    "Modified (comment): / 21-04-2016 / 21:37:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   310
!
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   311
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   312
example5_factorial_phi
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   313
    "A simple factorial using recursive algorithm.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   314
     No overflow or negative value checks. 
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   315
     Demonstrates usage of phi node"
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   316
    
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   317
    | module functionType function asm  
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   318
    "Values"       paramIsOneVal paramIsNotOneVal
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   319
    "Blocks" entry paramIsOne    paramIsNotOne exit jit externalFunction |
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   320
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   321
    module := LLVMModule newWithName:testSelector.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   322
    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
   323
    function := module addFunctionNamed:'factorial' type:functionType.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   324
    asm := LLVMIRBuilder new.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   325
    entry := function entry.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   326
    paramIsOne := function addBasicBlockNamed:'paramIsOne'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   327
    paramIsNotOne := function addBasicBlockNamed:'paramIsNotOne'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   328
    exit := function addBasicBlockNamed:'exit'.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   329
     
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   330
    "/ Generate function setup
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   331
    "/ 
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   332
    "/ 03   function f(v) {
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   333
    "/ 04    return (v == 1
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   334
    "/ 05             ?  1
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   335
    "/ 07             :  v * f(v - 1)
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   336
    "/ 08    )
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   337
    
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   338
    asm block:entry.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   339
    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
   340
      then: paramIsOne
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   341
      else: paramIsNotOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   342
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   343
    asm block: paramIsOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   344
    paramIsOneVal := LLVMConstant sintptr: 1.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   345
    asm br: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   346
    asm block: paramIsNotOne.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   347
    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
   348
                              _: (function parameterAt: 1).           
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   349
    asm br: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   350
    asm block: exit.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   351
    asm ret: (asm phi: { paramIsOne -> paramIsOneVal . paramIsNotOneVal }).
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   352
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   353
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   354
    jit := LLVMExecutionEngine newForModule:module.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   355
    externalFunction := jit externalOfFunction:function.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   356
    self assert:(externalFunction callWith:5) == 120.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   357
    self assert:(externalFunction callWith:1) == 1.
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   358
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   359
    "
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   360
        LLVMExamples run: example5_factorial_with_debug_info
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   361
    "
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   362
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   363
    "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
   364
    "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
   365
!
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   366
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   367
example6_factorial_with_overflow
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   368
    "
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   369
     Simple factorial using iterative algorithm.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   370
     This one checks for overflow, if overflow happens,
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   371
     return -1"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   372
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   373
    | module  functionType  function  asm  "Variables"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   374
    result  i  "Blocks"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   375
    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
   376
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   377
    module := LLVMModule newWithName:testSelector.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   378
    functionType := LLVMType function:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   379
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   380
                }
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   381
            returning:LLVMType intptr.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   382
    function := module addFunctionNamed:'factorial' type:functionType.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   383
    asm := LLVMIRBuilder new.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   384
    entry := function entry.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   385
    loop := function addBasicBlockNamed:'loop'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   386
    loopBody1 := function addBasicBlockNamed:'loopBody1'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   387
    loopBody2 := function addBasicBlockNamed:'loopBody2'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   388
    exit := function addBasicBlockNamed:'exit'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   389
    overflow := function addBasicBlockNamed:'overflow'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   390
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   391
    "/ Generate function setup
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   392
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   393
    "/   function f(v) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   394
    "/     var result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   395
    "/     var i;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   396
    "/     result = 0;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   397
    "/     i := v;
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   398
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   399
    asm block:entry.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   400
    result := asm alloca:LLVMType intptr as:'result'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   401
    i := asm alloca:LLVMType intptr as:'i'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   402
    asm store:(function parameterAt:1) _:i.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   403
    asm store:(LLVMConstant sintptr: 1) _:result.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   404
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   405
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   406
    "/ Generate loop that computes the factorial
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   407
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   408
    "/     while ( i > 1 ) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   409
    "/       result = result * i if overflow goto overflow;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   410
    "/       i = i - 1.
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   411
    "/     }
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   412
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   413
    "/ 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
   414
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   415
    smulWithOverflow := module getIntrinsicNamed:'llvm.smul.with.overflow'
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   416
            types:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   417
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   418
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   419
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   420
    "/ Now code the loop
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   421
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   422
    asm block:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   423
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   424
        if:(asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   425
                icmp:(asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   426
                _:(LLVMConstant sintptr:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   427
                cond:LLVMIntSGT)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   428
        then:loopBody1
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   429
        else:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   430
    asm block:loopBody1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   431
    smulWithOverflowValue := asm call:smulWithOverflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   432
            _:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   433
                    (asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   434
                    (asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   435
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   436
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   437
        if:(asm extractvalue:smulWithOverflowValue at:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   438
        then:overflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   439
        else:loopBody2.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   440
    asm block:loopBody2.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   441
    asm store:(asm extractvalue:smulWithOverflowValue at:0) _:result.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   442
    asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) _:i.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   443
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   444
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   445
    "/ Generate return from function
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   446
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   447
    "/     return result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   448
    "/ 
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   449
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   450
    asm block:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   451
    asm ret:(asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   452
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   453
    "/ Generate overflow handler
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   454
    "/     overflow:
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   455
    "/     return -1;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   456
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   457
    
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   458
    asm block:overflow.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   459
    asm ret:(LLVMConstant sintptr:-1).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   460
    jit := LLVMExecutionEngine newForModule:module.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   461
    externalFunction := jit externalOfFunction:function.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   462
    self assert:(externalFunction callWith:5) == 120.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   463
    self assert:(externalFunction callWith:1) == 1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   464
    self assert:(externalFunction callWith:120) == -1.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   465
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   466
    "sly    LLVMExamples example3_cond"
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   467
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   468
    "Created: / 14-08-2015 / 06:46:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   469
    "Modified: / 17-08-2015 / 07:40:02 / 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
   470
    "Modified (comment): / 21-04-2016 / 21:37:25 / 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
   471
!
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   472
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   473
example7_factorial_with_debug_info
61
c2e287d54de5 Added support for PHI nodes.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 57
diff changeset
   474
    "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
   475
     with debug info attached. 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   476
    "     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   477
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   478
    | module functionType function asm   
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   479
    "Variables" result  i  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   480
    "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
   481
    "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
   482
    jit externalFunction |
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   483
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   484
    module := LLVMModule newWithName:testSelector.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   485
    dib := module debugInfoBuilder.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   486
42
23ae490859cd Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 33
diff changeset
   487
    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
   488
    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
   489
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   490
    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
   491
    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
   492
    functionTypeDI := dib createTypeFunction: { intptrDI }.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   493
    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
   494
    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
   495
    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
   496
    asm := LLVMIRBuilder new.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   497
    entry := function entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   498
    loop := function addBasicBlockNamed:'loop'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   499
    loopBody := function addBasicBlockNamed:'loopBody'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   500
    exit := function addBasicBlockNamed:'exit'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   501
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   502
    "/ Generate function setup
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   503
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   504
    "/ 03  function f(v) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   505
    "/ 04    var result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   506
    "/ 05    var i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   507
    "/ 06    result = 0;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   508
    "/ 07    i := v;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   509
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   510
    asm block:entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   511
    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
   512
    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
   513
    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
   514
    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
   515
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   516
    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
   517
    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
   518
    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
   519
    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
   520
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   521
    asm line: 6 column: 3 scope: functionDI.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   522
    asm store:(function parameterAt:1) _:i.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   523
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   524
    asm line: 7 column: 3 scope: functionDI.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   525
    asm store:(LLVMConstant sintptr: 1) _:result.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   526
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   527
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   528
    "/ 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
   529
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   530
    "/   08  while ( i > 1 ) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   531
    "/   09    result = result * i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   532
    "/   10    i = i - 1.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   533
    "/   11  }
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   534
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   535
    "/ 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
   536
    "/ 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
   537
    "/ 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
   538
    "/ then-branch.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   539
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   540
    asm block:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   541
    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
   542
    asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   543
        if:(asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   544
                icmp:(asm load:i)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   545
                _:(LLVMConstant sintptr:1)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   546
                cond:LLVMIntSGT)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   547
        then:loopBody
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   548
        else:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   549
    asm block:loopBody.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   550
    asm line: 9 column: 3 scope: functionDI.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   551
    asm store:(asm mul:(asm load:result) _:(asm load:i)) _:result.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   552
    asm line: 10 column: 3 scope: functionDI.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   553
    asm store:(asm sub:(asm load:i) _:(LLVMConstant sintptr:1)) _:i.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   554
    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
   555
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   556
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   557
    "/ Generate return from function
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   558
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   559
    "/ 12    return result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   560
    "/ 13  }
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   561
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   562
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   563
    asm block:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   564
    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
   565
    asm ret:(asm load:result).
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
    dib finish.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   568
    self halt.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   569
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   570
    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
   571
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   572
    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
   573
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   574
        module writeBitcodeToFile: '/tmp/factorial.bc'
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   575
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   576
    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
   577
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   578
        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
   579
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   580
    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
   581
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   582
        '/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
   583
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   584
    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
   585
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   586
        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
   587
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   588
    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
   589
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   590
        '/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
   591
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   592
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   593
            f nextPutLine: 'function factorial(v) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   594
            f nextPutLine: '  var result;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   595
            f nextPutLine: '  var i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   596
            f nextPutLine: '  result = 0;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   597
            f nextPutLine: '  i := v;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   598
            f nextPutLine: '  while ( i > 1 ) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   599
            f nextPutLine: '    result = result * i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   600
            f nextPutLine: '    i = i - 1.'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   601
            f nextPutLine: '  }'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   602
            f nextPutLine: '  return result;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   603
            f nextPutLine: '}'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   604
        ]
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
    Then debug it using gdb:
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   607
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   608
            gdb main
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   609
    "
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
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   612
    jit := LLVMExecutionEngine newForModule:module.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   613
    externalFunction := jit externalOfFunction:function.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   614
    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
   615
    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
   616
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   617
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   618
     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
   619
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   620
    "Created: / 14-08-2015 / 06:46:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
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
   621
    "Modified: / 06-02-2016 / 15:28:25 / 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
   622
    "Modified (comment): / 21-04-2016 / 21:37:35 / 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
   623
!
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   624
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   625
example8_data_at_fixed_address
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   626
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   627
    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
   628
    (known at compilation time)
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   629
    "    
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   630
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   631
    | module 
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   632
     functionType function asm glb val |
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   633
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   634
    module := LLVMModule newWithName: testSelector.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   635
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   636
    functionType := LLVMType function: {  } returning: LLVMType int32.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   637
    function := module addFunctionNamed: 'test' type: functionType.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   638
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   639
    asm := function builder.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   640
    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
   641
    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
   642
    asm ret: val.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   643
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   644
    self halt.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   645
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   646
    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
   647
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   648
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   649
    "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
   650
    "Modified: / 12-02-2016 / 11:11:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
8
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   651
! !
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   652