LLVMBuilder.st
changeset 22 789a35bd30ac
parent 19 706be0fcef22
child 23 0744cd9c0acc
--- a/LLVMBuilder.st	Fri Aug 07 14:10:48 2015 +0100
+++ b/LLVMBuilder.st	Sat Aug 08 04:43:00 2015 +0100
@@ -18,7 +18,7 @@
 LLVMDisposableObject subclass:#LLVMBuilder
 	instanceVariableNames:''
 	classVariableNames:''
-	poolDictionaries:''
+	poolDictionaries:'LLVMIntPredicate LLVMRealPredicate'
 	category:'LLVM-S-Core'
 !
 
@@ -59,6 +59,61 @@
     "Created: / 11-07-2015 / 13:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!LLVMBuilder methodsFor:'assertions'!
+
+assertIsBasicBlockValue:value 
+    <resource: #skipInDebuggersWalkback>
+
+    self assert:value isLLVMValue.
+    self assert:value isBasicBlockValue
+
+    "Created: / 08-08-2015 / 02:43:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+assertIsIntegerOrIntegerVectorValue:value 
+    <resource: #skipInDebuggersWalkback>
+
+    self assert:(value class == LLVMValue) message:'value is not an LLVMValue'.
+    self assert:(value isIntegerOrIntegerVectorValue)
+
+    "Modified (format): / 08-08-2015 / 02:41:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+assertIsString:aString 
+    <resource: #skipInDebuggersWalkback>
+
+    self assert:aString isSingleByteString description:'string is not a valid LLVM name (twine)'
+
+    "Created: / 07-08-2015 / 18:38:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 08-08-2015 / 02:41:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+assertIsValue: value
+    <resource: #skipInDebuggersWalkback>
+
+    self assert: value isLLVMValue message: 'value is not an LLVMValue'.
+
+    "Created: / 08-08-2015 / 03:11:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+assertIsValue: value ofType: type
+    <resource: #skipInDebuggersWalkback>
+
+    self assert: value isLLVMValue message: 'value is not an LLVMValue'.
+    self assert: value type = type message: 'value has incorrect type'
+
+    "Created: / 08-08-2015 / 02:49:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+assertIsValueOfSameType:value1 as:value2 
+    <resource: #skipInDebuggersWalkback>
+
+    self assert: value1 type = value2 type message:'types of values differ!!'
+
+    "Created: / 07-08-2015 / 18:37:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 08-08-2015 / 02:57:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !LLVMBuilder methodsFor:'initialization & release'!
 
 dispose
@@ -69,110 +124,163 @@
 
 !LLVMBuilder methodsFor:'instructions - binary'!
 
-add:value1 and:value2 
-    ^ self add:value1 and:value2 as:''
+add:value1 _:value2 
+    ^ self 
+            add:value1
+            _:value2
+            as:''
 
     "Created: / 07-07-2015 / 22:52:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (format): / 11-07-2015 / 13:00:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-add:value1 and:value2 as: name
-    self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
-    self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
-    self assert: (name isSingleByteString).
-    ^LLVM BuildAdd: self  _: value1 _: value2 _: name
+add:value1 _:value2 as:name 
+    self assert:(value1 isKindOf:LLVMValue).
+    self assert:value1 isIntegerOrIntegerVectorValue.
+    self assert:(value2 isKindOf:LLVMValue).
+    self assert:value2 isIntegerOrIntegerVectorValue.
+    self assert:(name isSingleByteString).
+    ^ LLVM 
+        BuildAdd:self
+        _:value1
+        _:value2
+        _:name
 
     "Created: / 07-07-2015 / 22:52:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 11-07-2015 / 14:57:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-and:value1 and:value2 
-    ^ self and:value1 and:value2 as:''
+and:value1 _:value2 
+    ^ self and:value1 _:value2 as:''
 
-    "Created: / 11-07-2015 / 14:58:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 07-08-2015 / 16:51:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 07-08-2015 / 17:56:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-and:value1 and:value2 as: name
+and:value1 _:value2 as: name
     self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
+    self assert: value1 isIntegerOrIntegerVectorValue.
     self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
+    self assert: value2 isIntegerOrIntegerVectorValue.
     self assert: (name isSingleByteString).
     ^LLVM BuildAnd: self  _: value1 _: value2 _: name
 
-    "Created: / 11-07-2015 / 14:58:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 07-08-2015 / 17:56:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-ashr:value1 by:value2 
-    ^ self ashr:value1 by: value2 as:''
+ashr:value1 _:value2 
+    ^ self 
+            ashr:value1
+            _:value2
+            as:''
 
     "Created: / 11-07-2015 / 16:46:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-ashr:value1 by:value2 as: name
-    self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
-    self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
-    self assert: (name isSingleByteString).
-    ^LLVM BuildAShr: self  _: value1 _: value2 _: name
+ashr:value1 _:value2 as:name 
+    self assert:(value1 isKindOf:LLVMValue).
+    self assert:value1 isIntegerOrIntegerVectorValue.
+    self assert:(value2 isKindOf:LLVMValue).
+    self assert:value2 isIntegerOrIntegerVectorValue.
+    self assert:(name isSingleByteString).
+    ^ LLVM 
+        BuildAShr:self
+        _:value1
+        _:value2
+        _:name
 
     "Created: / 11-07-2015 / 16:46:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-lshr:value1 by:value2 
-    ^ self lshr:value1 by: value2 as:''
+lshr:value1 _:value2 
+    ^ self 
+            lshr:value1
+            _:value2
+            as:''
 
     "Created: / 11-07-2015 / 13:02:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-lshr:value1 by:value2 as: name
-    self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
-    self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
-    self assert: (name isSingleByteString).
-    ^LLVM BuildLShr: self  _: value1 _: value2 _: name
+lshr:value1 _:value2 as:name 
+    self assert:(value1 isKindOf:LLVMValue).
+    self assert:value1 isIntegerOrIntegerVectorValue.
+    self assert:(value2 isKindOf:LLVMValue).
+    self assert:value2 isIntegerOrIntegerVectorValue.
+    self assert:(name isSingleByteString).
+    ^ LLVM 
+        BuildLShr:self
+        _:value1
+        _:value2
+        _:name
 
     "Created: / 11-07-2015 / 14:49:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-or:value1 and:value2 
-    ^ self or:value1 and:value2 as:''
+or:value1 _:value2 
+    ^ self 
+            or:value1
+            _:value2
+            as:''
 
     "Created: / 11-07-2015 / 17:17:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-or:value1 and:value2 as: name
-    self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
-    self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
-    self assert: (name isSingleByteString).
-    ^LLVM BuildOr: self  _: value1 _: value2 _: name
+or:value1 _:value2 as:name 
+    self assert:(value1 isKindOf:LLVMValue).
+    self assert:value1 isIntegerOrIntegerVectorValue.
+    self assert:(value2 isKindOf:LLVMValue).
+    self assert:value2 isIntegerOrIntegerVectorValue.
+    self assert:(name isSingleByteString).
+    ^ LLVM 
+        BuildOr:self
+        _:value1
+        _:value2
+        _:name
 
     "Created: / 11-07-2015 / 17:16:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-shl:value1 by:value2 
-    ^ self shl:value1 by: value2 as:''
+shl:value1 _:value2
+    ^ self shl:value1 _:value2 as:''
 
     "Created: / 11-07-2015 / 16:37:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 07-08-2015 / 17:58:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-shl:value1 by:value2 as: name
-    self assert: (value1 isKindOf: LLVMValue).
-    self assert: (value1 isIntegerOrVectorValue).
-    self assert: (value2 isKindOf: LLVMValue).
-    self assert: (value2 isIntegerOrVectorValue).
-    self assert: (name isSingleByteString).
-    ^LLVM BuildShl: self  _: value1 _: value2 _: name
+shl:value1 _:value2 as:name 
+    self assert:(value1 isKindOf:LLVMValue).
+    self assert:value1 isIntegerOrIntegerVectorValue.
+    self assert:(value2 isKindOf:LLVMValue).
+    self assert:value2 isIntegerOrIntegerVectorValue.
+    self assert:(name isSingleByteString).
+    ^ LLVM 
+        BuildShl:self
+        _:value1
+        _:value2
+        _:name
 
     "Created: / 11-07-2015 / 16:37:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!LLVMBuilder methodsFor:'instructions - binary - compare'!
+
+icmp:value1 _:value2 cond: cond
+    ^ self icmp:value1 _:value2 cond: cond as: ''
+
+    "Created: / 07-08-2015 / 18:39:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+icmp:value1 _:value2 cond: cond as: name
+
+    self assertIsIntegerOrIntegerVectorValue:value1.      
+    self assertIsIntegerOrIntegerVectorValue:value2.      
+    self assertIsValueOfSameType:value1 as:value2.
+    self assertIsString:name.      
+    ^ LLVM BuildICmp: self  _: cond _:  value1 _: value2 _: name
+
+    "Created: / 07-08-2015 / 18:18:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !LLVMBuilder methodsFor:'instructions - other'!
 
 call: function with: arg1
@@ -244,11 +352,53 @@
 
 !LLVMBuilder methodsFor:'instructions - terminators'!
 
-ret:value1 
-    self assert: (value1 isKindOf: LLVMValue).
+br: target
+    | targetAsValue  |
+
+    targetAsValue := target asLLVMValue.
+
+    self assertIsBasicBlockValue: targetAsValue.
+
+    ^ LLVM BuildBr: self _: targetAsValue
+
+    "Created: / 08-08-2015 / 02:59:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+if: cond then: then else: else
+    ^ self if: cond then: then else: else as: ''
+
+    "Created: / 08-08-2015 / 04:15:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+if: cond then: then else: else as: name
+    | thenAsValue elseAsValue |
+
+    thenAsValue := then asLLVMValue.
+    elseAsValue := else asLLVMValue.
+
+    self assertIsBasicBlockValue: thenAsValue.
+    self assertIsBasicBlockValue: elseAsValue.
+    self assertIsValue: cond ofType: LLVMType int1.
+
+    ^ LLVM BuildCondBr: self _: cond _: thenAsValue _: elseAsValue
+
+    "Created: / 07-08-2015 / 18:42:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 08-08-2015 / 02:58:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ret
+    ^ LLVM BuildRetVoid: self
+
+    "Created: / 07-08-2015 / 18:14:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ret:value1
+
+    self assertIsValue: value1.
     ^ LLVM BuildRet: self _: value1
 
     "Created: / 07-07-2015 / 22:55:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 08-08-2015 / 03:11:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !LLVMBuilder methodsFor:'positioning'!