LLVMExamples.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 12 Feb 2016 11:50:22 +0000
changeset 57 4ca7c3a327a2
parent 55 41b3437f1fc7
child 61 c2e287d54de5
permissions -rw-r--r--
LLVMDIBuilder: added API for more instructions * inttoptr * ptrtoint * select
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
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   234
    "A simple factorial using recursive algorithm.
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>"
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   309
!
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   310
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   311
example6_factorial_with_overflow
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   312
    "
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   313
     Simple factorial using recursive algorithm.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   314
     This one checks for overflow, if overflow happens,
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   315
     return -1"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   316
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   317
    | module  functionType  function  asm  "Variables"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   318
    result  i  "Blocks"
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   319
    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
   320
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   321
    module := LLVMModule newWithName:testSelector.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   322
    functionType := LLVMType function:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   323
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   324
                }
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   325
            returning:LLVMType intptr.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   326
    function := module addFunctionNamed:'factorial' type:functionType.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   327
    asm := LLVMIRBuilder new.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   328
    entry := function entry.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   329
    loop := function addBasicBlockNamed:'loop'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   330
    loopBody1 := function addBasicBlockNamed:'loopBody1'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   331
    loopBody2 := function addBasicBlockNamed:'loopBody2'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   332
    exit := function addBasicBlockNamed:'exit'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   333
    overflow := function addBasicBlockNamed:'overflow'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   334
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   335
    "/ Generate function setup
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   336
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   337
    "/   function f(v) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   338
    "/     var result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   339
    "/     var i;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   340
    "/     result = 0;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   341
    "/     i := v;
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   342
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   343
    asm block:entry.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   344
    result := asm alloca:LLVMType intptr as:'result'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   345
    i := asm alloca:LLVMType intptr as:'i'.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   346
    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
   347
    asm store:(LLVMConstant sintptr: 1) _:result.
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   348
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   349
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   350
    "/ Generate loop that computes the factorial
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   351
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   352
    "/     while ( i > 1 ) {
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   353
    "/       result = result * i if overflow goto overflow;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   354
    "/       i = i - 1.
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   355
    "/     }
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   356
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   357
    "/ 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
   358
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   359
    smulWithOverflow := module getIntrinsicNamed:'llvm.smul.with.overflow'
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   360
            types:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   361
                    LLVMType intptr
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   362
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   363
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   364
    "/ Now code the loop
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   365
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   366
    asm block:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   367
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   368
        if:(asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   369
                icmp:(asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   370
                _:(LLVMConstant sintptr:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   371
                cond:LLVMIntSGT)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   372
        then:loopBody1
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   373
        else:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   374
    asm block:loopBody1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   375
    smulWithOverflowValue := asm call:smulWithOverflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   376
            _:{
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   377
                    (asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   378
                    (asm load:i)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   379
                }.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   380
    asm 
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   381
        if:(asm extractvalue:smulWithOverflowValue at:1)
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   382
        then:overflow
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   383
        else:loopBody2.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   384
    asm block:loopBody2.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   385
    asm store:(asm extractvalue:smulWithOverflowValue at:0) _:result.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   386
    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
   387
    asm br:loop.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   388
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   389
    "/ Generate return from function
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   390
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   391
    "/     return result;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   392
    "/ 
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   393
    
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   394
    asm block:exit.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   395
    asm ret:(asm load:result).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   396
     
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   397
    "/ Generate overflow handler
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   398
    "/     overflow:
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   399
    "/     return -1;
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   400
    "/ 
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   401
    
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   402
    asm block:overflow.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   403
    asm ret:(LLVMConstant sintptr:-1).
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   404
    jit := LLVMExecutionEngine newForModule:module.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   405
    externalFunction := jit externalOfFunction:function.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   406
    self assert:(externalFunction callWith:5) == 120.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   407
    self assert:(externalFunction callWith:1) == 1.
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   408
    self assert:(externalFunction callWith:120) == -1.
24
7e7ddd55174c Added support for intrinsics.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23
diff changeset
   409
28
97013ae2abae Renamed LLVMBuilder to LLVMIRBuilder
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 24
diff changeset
   410
    "sly    LLVMExamples example3_cond"
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   411
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   412
    "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
   413
    "Modified: / 17-08-2015 / 07:40:02 / 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
   414
!
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   415
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   416
example7_factorial_with_debug_info
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   417
    "A simple factorial using recursive algorithm
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   418
     with debug info attached. 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   419
    "     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   420
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   421
    | module functionType function asm   
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   422
    "Variables" result  i  
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   423
    "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
   424
    "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
   425
    jit externalFunction |
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   426
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   427
    module := LLVMModule newWithName:testSelector.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   428
    dib := module debugInfoBuilder.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   429
42
23ae490859cd Fixed LLVMExamples>>example7_factorial_with_debug_info
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 33
diff changeset
   430
    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
   431
    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
   432
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   433
    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
   434
    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
   435
    functionTypeDI := dib createTypeFunction: { intptrDI }.
33
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   436
    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
   437
    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
   438
    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
   439
    asm := LLVMIRBuilder new.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   440
    entry := function entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   441
    loop := function addBasicBlockNamed:'loop'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   442
    loopBody := function addBasicBlockNamed:'loopBody'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   443
    exit := function addBasicBlockNamed:'exit'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   444
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   445
    "/ Generate function setup
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   446
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   447
    "/ 03  function f(v) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   448
    "/ 04    var result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   449
    "/ 05    var i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   450
    "/ 06    result = 0;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   451
    "/ 07    i := v;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   452
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   453
    asm block:entry.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   454
    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
   455
    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
   456
    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
   457
    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
   458
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   459
    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
   460
    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
   461
    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
   462
    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
   463
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   464
    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
   465
    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
   466
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   467
    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
   468
    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
   469
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   470
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   471
    "/ 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
   472
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   473
    "/   08  while ( i > 1 ) {
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   474
    "/   09    result = result * i;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   475
    "/   10    i = i - 1.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   476
    "/   11  }
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
    "/ 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
   479
    "/ 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
   480
    "/ 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
   481
    "/ then-branch.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   482
    
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   483
    asm block:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   484
    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
   485
    asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   486
        if:(asm 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   487
                icmp:(asm load:i)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   488
                _:(LLVMConstant sintptr:1)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   489
                cond:LLVMIntSGT)
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   490
        then:loopBody
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   491
        else:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   492
    asm block:loopBody.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   493
    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
   494
    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
   495
    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
   496
    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
   497
    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
   498
    asm br:loop.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   499
     
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   500
    "/ Generate return from function
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
    "/ 12    return result;
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   503
    "/ 13  }
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   504
    "/ 
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   505
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   506
    asm block:exit.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   507
    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
   508
    asm ret:(asm load:result).
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
    dib finish.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   511
    self halt.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   512
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   513
    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
   514
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   515
    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
   516
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   517
        module writeBitcodeToFile: '/tmp/factorial.bc'
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   518
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   519
    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
   520
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   521
        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
   522
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   523
    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
   524
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   525
        '/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
   526
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   527
    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
   528
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   529
        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
   530
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   531
    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
   532
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   533
        '/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
   534
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   535
            f nextPutLine: ''.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   536
            f nextPutLine: 'function factorial(v) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   537
            f nextPutLine: '  var result;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   538
            f nextPutLine: '  var i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   539
            f nextPutLine: '  result = 0;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   540
            f nextPutLine: '  i := v;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   541
            f nextPutLine: '  while ( i > 1 ) {'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   542
            f nextPutLine: '    result = result * i;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   543
            f nextPutLine: '    i = i - 1.'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   544
            f nextPutLine: '  }'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   545
            f nextPutLine: '  return result;'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   546
            f nextPutLine: '}'.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   547
        ]
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   548
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   549
    Then debug it using gdb:
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   550
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   551
            gdb main
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   552
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   553
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   554
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   555
    jit := LLVMExecutionEngine newForModule:module.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   556
    externalFunction := jit externalOfFunction:function.
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   557
    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
   558
    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
   559
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   560
    "
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   561
     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
   562
feabf14b6c1d Initial support for generating (DWARF) debug info.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 28
diff changeset
   563
    "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
   564
    "Modified: / 06-02-2016 / 15:28:25 / 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
   565
!
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   566
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   567
example8_data_at_fixed_address
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   568
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   569
    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
   570
    (known at compilation time)
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   571
    "    
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   572
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   573
    | module 
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   574
     functionType function asm glb val |
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   575
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   576
    module := LLVMModule newWithName: testSelector.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   577
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   578
    functionType := LLVMType function: {  } returning: LLVMType int32.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   579
    function := module addFunctionNamed: 'test' type: functionType.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   580
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   581
    asm := function builder.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   582
    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
   583
    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
   584
    asm ret: val.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   585
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   586
    self halt.
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   587
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   588
    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
   589
    "
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   590
4ca7c3a327a2 LLVMDIBuilder: added API for more instructions
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 55
diff changeset
   591
    "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
   592
    "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
   593
! !
890eb7591eca Added class LLVMExamples
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   594