compiler/TLLVMCodeGenerator.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 23 Sep 2015 22:21:44 +0100
changeset 15 10a95d798b36
parent 12 d716a8181fc1
child 16 17a2d1d9f205
permissions -rw-r--r--
Added support for local variables and #whileTrue: special form Allocate all local variables in a special basic block named `allocas`. Added support for #whileTrue: special form.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'jv:tea/compiler' }"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     4
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
     5
TCompilerPass subclass:#TLLVMCodeGenerator
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	instanceVariableNames:'function asm'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	classVariableNames:'SelectorSpecialCharMappingTable'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	poolDictionaries:''
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
     9
	category:'Languages-Tea-Compiler-Internals'
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    12
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
    13
!TLLVMCodeGenerator class methodsFor:'initialization'!
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
initialize
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
    "Invoked at system start or when the class is dynamically loaded."
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
    "/ please change as required (and remove this comment)
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
    SelectorSpecialCharMappingTable := Dictionary withKeysAndValues:
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
                #($+ 'pl'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
                  $- 'mi'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
                  $* 'mu'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
                  $/ 'di'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
                  $, 'co'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
                  $@ 'at'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
                  $< 'le'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
                  $> 'gr'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
                  $= 'eq'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
                  $~ 'ne'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
                  $| 'pi'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
                  $\ 'mo'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
                  $& 'am').
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    "Modified: / 11-07-2015 / 09:24:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
! !
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
    38
!TLLVMCodeGenerator class methodsFor:'utilities'!
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
llvmFunctionNameForClass: class selector: selector      
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
    "For given class name and selector, returns the name 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
     used by LLVM"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
    ^ String streamContents:[ :s|
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
        s nextPutAll: '__M_L_'.
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
        s nextPutAll: (class theNonMetaclass name copyReplaceAll: $: with: $_).
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
        class isMeta ifTrue:[ 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
            s nextPutAll: '_class'
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
        ].
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
        s nextPut: $_.
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
        selector isBinarySelector ifTrue:[ 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
            selector do:[:c |     
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
                s nextPutAll: (SelectorSpecialCharMappingTable at: c)
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
            ].
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
        ] ifFalse:[ 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
            selector do:[:c |  
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
                c isAlphaNumeric ifTrue:[ 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
                    s nextPut: c 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
                ] ifFalse:[
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
                    s nextPut: $_.
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
                    c == $: ifFalse:[ 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
                        c codePoint printOn: s.
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
                    ]
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
                ].
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
            ]
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
        ].
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
    ].
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
    "
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
    TLLVMIREmitPass llvmFunctionNameForClass: TLLVMIREmitPass class selector: #llvmFunctionNameForClass:selector: 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
    TLLVMIREmitPass llvmFunctionNameForClass: SmallInteger selector: #+
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
    TLLVMIREmitPass llvmFunctionNameForClass: Object selector: #~=
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
    "
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
    "Created: / 30-08-2015 / 09:23:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
    "Modified: / 31-08-2015 / 07:04:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
! !
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
    80
!TLLVMCodeGenerator methodsFor:'visiting'!
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    81
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    82
visitArgument: anRBVariableNode
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    83
    | binding value |
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    84
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    85
    binding := anRBVariableNode binding.
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    86
    binding isArgumentBinding ifTrue:[
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    87
        value :=  function parameterAt: binding index.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    88
        value name: binding name.
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    89
    ] ifFalse:[ 
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    90
        | block allocas |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    91
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    92
        allocas := anRBVariableNode scope llvmAllocas.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    93
        block := asm block.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    94
        asm block: allocas.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    95
        value := asm alloca: (binding type asLLVMTypeInModule: context module)  as: binding name.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    96
        asm block: block.
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    97
    ].
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
    98
    binding llvmValue: value.
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
    99
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   100
    "Created: / 02-09-2015 / 08:43:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   101
    "Modified: / 23-09-2015 / 21:47:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   102
! !
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   103
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
   104
!TLLVMCodeGenerator methodsFor:'visitor-double dispatching'!
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   105
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   106
acceptArrayNode: anArrayNode
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   109
    "Created: / 31-08-2015 / 10:14:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
acceptAssignmentNode: anAssignmentNode 
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   113
    | value binding |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   114
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   115
    value := self visitNode: anAssignmentNode value.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   116
    binding := anAssignmentNode variable binding.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   117
    asm store: value _: binding llvmValue.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   118
    ^ value
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   119
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   120
    "Created: / 31-08-2015 / 10:14:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   121
    "Modified: / 23-09-2015 / 21:52:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   122
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   123
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   124
acceptBlockNode: aBlockNode 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   125
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   126
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   127
    "Created: / 31-08-2015 / 10:14:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   128
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   129
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   130
acceptCascadeNode: aCascadeNode 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   131
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   132
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   133
    "Created: / 31-08-2015 / 10:14:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   134
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   135
11
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   136
acceptIfTrueIfFalseNode: node 
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   137
    | condition thenBody thenBlock thenResult elseBody elseBlock elseResult joinBlock result |
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   138
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   139
    condition := self visitNode: node receiver.  
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   140
    thenBody  := node arguments first body.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   141
    thenBlock := function addBasicBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   142
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   143
    elseBody  := node arguments second body.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   144
    elseBlock := function addBasicBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   145
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   146
    asm if: condition then: thenBlock else: elseBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   147
    "/ Code true-branch
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   148
    asm block: thenBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   149
    thenResult := self visitNode: thenBody.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   150
    thenResult isReturnInst ifFalse:[  
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   151
        joinBlock notNil ifTrue:[ joinBlock function addBasicBlock ].
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   152
        asm br: joinBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   153
    ].
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   154
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   155
    "/ Code false-branch
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   156
    asm block: elseBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   157
    elseResult := self visitNode: elseBody.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   158
    elseResult isReturnInst ifFalse:[  
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   159
        joinBlock notNil ifTrue:[ joinBlock function addBasicBlock ].
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   160
        asm br: joinBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   161
    ].
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   162
    joinBlock notNil ifTrue:[ 
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   163
        asm block: joinBlock.
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   164
    ].
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   165
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   166
    "Created: / 15-09-2015 / 11:59:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   167
    "Modified: / 16-09-2015 / 05:28:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   168
!
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   169
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   170
acceptIfTrueNode: node 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   171
    | condition thenBody thenBlock thenResult joinBlock result |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   172
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   173
    condition := self visitNode: node receiver.  
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   174
    thenBody  := node arguments first body.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   175
    thenBlock := function addBasicBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   176
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   177
    joinBlock := function addBasicBlock.
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   178
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   179
    asm if: condition then: thenBlock else: joinBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   180
    "/ Code true-branch
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   181
    asm block: thenBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   182
    thenResult := self visitNode: thenBody.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   183
    thenResult isReturnInst ifFalse:[  
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   184
        joinBlock notNil ifTrue:[ joinBlock function addBasicBlock ].
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   185
        asm br: joinBlock.
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   186
    ].
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   187
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   188
    asm block: joinBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   189
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   190
    "Created: / 23-09-2015 / 21:57:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
6
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   191
!
0c806a7f1888 Initial support for inline assembly
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 4
diff changeset
   192
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   193
acceptLiteralNode: aLiteralNode
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   194
    ^ aLiteralNode binding asLLVMValueInModule: context module.
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   195
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   196
    "Created: / 31-08-2015 / 10:13:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   197
    "Modified: / 31-08-2015 / 12:20:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   198
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   199
7
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   200
acceptMessageNode: aMessageNode
11
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   201
    | receiver arguments methodFunction |
7
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   202
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   203
    receiver := self visitNode: aMessageNode receiver.
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   204
    arguments := aMessageNode arguments collect: [:argument | self visitNode: argument ].
11
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   205
    methodFunction := aMessageNode binding asLLVMValueInModule: context module.  
7
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   206
7556e3d41d80 Make 3 + 4 working, though the code is rather messy
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 6
diff changeset
   207
    ^ asm call: methodFunction _: { receiver } , arguments
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   208
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   209
    "Created: / 31-08-2015 / 10:13:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
11
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   210
    "Modified (format): / 15-09-2015 / 07:14:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   211
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   212
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   213
acceptMethodNode: aMethodNode 
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   214
    | allocas entry |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   215
11
6d39860d0fdb First shot on #ifTrie:ifFalse: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
   216
    function := aMethodNode binding asLLVMValueInModule: context module.
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   217
    allocas := function addBasicBlockNamed: 'allocas'.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   218
    entry := function addBasicBlockNamed: 'entry'.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   219
    aMethodNode scope llvmAllocas: allocas.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   220
    asm := entry builder.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   221
    super acceptMethodNode: aMethodNode.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   222
    "/ Finally, link allocas to entry.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   223
    asm block: allocas.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   224
    asm br: entry.
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   225
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   226
    "Created: / 31-08-2015 / 09:42:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   227
    "Modified: / 23-09-2015 / 22:32:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   228
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   229
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   230
acceptOptimizedNode: anOptimizedNode 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   231
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   232
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   233
    "Created: / 31-08-2015 / 10:13:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   234
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   235
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   236
acceptPragmaNode: aPragmaNode
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   237
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   238
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   239
    "Created: / 31-08-2015 / 10:13:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   240
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   241
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   242
acceptPrimitiveNode: aPragmaNode
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   243
    | primitiveBlock methodIsForMeta emitMethodNode emitMethod |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   244
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   245
    primitiveBlock := aPragmaNode arguments first.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   246
    methodIsForMeta := aPragmaNode parent binding mclass isMetaclass.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   247
    emitMethodNode := RBMethodNode new.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   248
    emitMethodNode arguments: 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   249
                        (primitiveBlock arguments collect:[ :e|e copy]) , 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   250
                        (methodIsForMeta ifFalse:[{ RBVariableNode named: 'zelf' }] ifTrue:[#()]) , 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   251
                        (primitiveBlock topNode arguments collect:[ :e|e copy]).
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   252
    emitMethodNode body: primitiveBlock body copy.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   253
    emitMethodNode variableNodesDo:[ :variableNode |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   254
        variableNode name = 'self' ifTrue:[ 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   255
            variableNode name: 'zelf'.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   256
        ].
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   257
    ].
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   258
    emitMethodNode selector:(String streamContents: [ :s | emitMethodNode arguments size timesRepeat:[s nextPutAll:'_:'] ]).
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   259
    emitMethod := Compiler compile: emitMethodNode formattedCode forClass: UndefinedObject install: false.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   260
    emitMethod
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   261
        valueWithReceiver: nil
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   262
        arguments: { asm } , ((1 to: function numArgs) collect: [ :i | function parameterAt: i ])
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   263
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   264
    "Created: / 22-09-2015 / 18:03:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   265
    "Modified: / 23-09-2015 / 06:27:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   266
!
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   267
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   268
acceptReturnNode: aReturnNode 
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   269
    | value |
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   270
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   271
    value := self visitNode: aReturnNode value.
12
d716a8181fc1 Make TCompilerPass>>acceptSequenceNode: to return value of last statement.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   272
    ^ asm ret: value.
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   273
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   274
    "Created: / 31-08-2015 / 10:13:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
12
d716a8181fc1 Make TCompilerPass>>acceptSequenceNode: to return value of last statement.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   275
    "Modified: / 18-09-2015 / 06:08:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   276
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   277
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   278
acceptSTXPrimitiveCCodeNode: aPrimitiveCCodeNode
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   279
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   280
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   281
    "Created: / 31-08-2015 / 10:13:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   282
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   283
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   284
acceptSTXPrimitiveValueCCodeNode: aPrimitiveValueCCodeNode
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   285
    self notYetImplemented
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   286
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   287
    "Created: / 31-08-2015 / 10:13:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   288
!
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   289
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   290
acceptVariableNode: aVariableNode
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   291
    | binding |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   292
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   293
    binding := aVariableNode binding.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   294
    ^ binding isArgumentBinding ifTrue:[
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   295
        binding llvmValue.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   296
    ] ifFalse:[ 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   297
        asm load: binding llvmValue.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   298
    ].
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   299
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   300
    "Created: / 31-08-2015 / 10:13:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
15
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   301
    "Modified: / 23-09-2015 / 22:30:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   302
!
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   303
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   304
acceptWhileTrueNode: node 
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   305
    | loopConditionBlock loopConditionBody loopConditionResult loopBodyBody loopBodyBlock loopBodyResult joinBlock |
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   306
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   307
    loopConditionBody := node receiver body.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   308
    loopConditionBlock := function addBasicBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   309
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   310
    loopBodyBody  := node arguments first body.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   311
    loopBodyBlock := function addBasicBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   312
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   313
    joinBlock := function addBasicBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   314
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   315
    asm br: loopConditionBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   316
    asm block: loopConditionBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   317
    loopConditionResult := self visitNode: loopConditionBody.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   318
    asm if: loopConditionResult then: loopBodyBlock else: joinBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   319
    asm block: loopBodyBlock.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   320
    loopBodyResult := self visitNode: loopBodyBody.
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   321
    loopBodyResult isReturnInst ifFalse:[
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   322
        asm br: loopConditionBlock
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   323
    ].
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   324
    asm block: joinBlock
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   325
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   326
    "Created: / 23-09-2015 / 22:02:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   327
! !
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   328
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   329
!TLLVMCodeGenerator class methodsFor:'documentation'!
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   330
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   331
version_HG
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   332
10a95d798b36 Added support for local variables and #whileTrue: special form
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 12
diff changeset
   333
    ^ '$Changeset: <not expanded> $'
4
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   334
! !
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   335
3d80069ea3e2 More work on basic infrastructure - types, bindings & compilation.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   336
9
569bf5707c7e Added support for special forms to parser and typechecker (somewhat)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 7
diff changeset
   337
TLLVMCodeGenerator initialize!