--- 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'!