144 lines
3.5 KiB
Markdown
144 lines
3.5 KiB
Markdown
LLVM CBuilder
|
|
=============
|
|
|
|
A few short examples:
|
|
(TODO: add more later)
|
|
|
|
```python
|
|
from llvm.core import *
|
|
from llvm_cbuilder import *
|
|
import llvm_cbuilder.shortnames as C
|
|
```
|
|
|
|
```python
|
|
class Square(CDefinition):
|
|
_name_ = 'square'
|
|
_retty_ = C.double
|
|
_argtys_ = [ ('x', C.double) ]
|
|
|
|
def body(self, x):
|
|
y = x * x
|
|
self.ret(y)
|
|
```
|
|
|
|
```python
|
|
m = Module.new('my_module')
|
|
llvm_square = Square()(m)
|
|
print(m)
|
|
```
|
|
|
|
```
|
|
; ModuleID = 'my_module'
|
|
|
|
define double @square(double %x) {
|
|
decl:
|
|
%0 = fmul double %x, %x
|
|
ret double %0
|
|
}
|
|
```
|
|
|
|
|
|
```python
|
|
class IsPrime(CDefinition):
|
|
_name_ = 'isprime'
|
|
_retty_ = C.int
|
|
_argtys_ = [('x', C.int)]
|
|
|
|
def body(self, x):
|
|
false = zero = self.constant(C.int, 0)
|
|
true = one = self.constant(C.int, 1)
|
|
|
|
two = self.constant(C.int, 2)
|
|
|
|
with self.ifelse( x <= two ) as ifelse:
|
|
with ifelse.then():
|
|
self.ret(true)
|
|
|
|
with self.ifelse( (x % two) == zero ) as ifelse:
|
|
with ifelse.then():
|
|
self.ret(false)
|
|
|
|
idx = self.var(C.int, 3, name='idx')
|
|
|
|
with self.loop() as loop:
|
|
with loop.condition() as setcond:
|
|
setcond( idx < x )
|
|
|
|
with loop.body():
|
|
with self.ifelse( (x % idx ) == zero ) as ifelse:
|
|
with ifelse.then():
|
|
self.ret(false)
|
|
idx += two
|
|
|
|
self.ret(true)
|
|
```
|
|
|
|
|
|
|
|
```
|
|
define i32 @isprime(i32 %x) {
|
|
decl:
|
|
%0 = icmp sle i32 %x, 2
|
|
br i1 %0, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %loop.body, %loop.cond, %if.end, %decl
|
|
%merge = phi i32 [ 1, %decl ], [ 0, %if.end ], [ 1, %loop.cond ], [ 0, %loop.body ]
|
|
ret i32 %merge
|
|
|
|
if.end: ; preds = %decl
|
|
%1 = srem i32 %x, 2
|
|
%2 = icmp eq i32 %1, 0
|
|
br i1 %2, label %if.then, label %if.end4
|
|
|
|
if.end4: ; preds = %if.end
|
|
br label %loop.cond
|
|
|
|
loop.cond: ; preds = %if.end7, %if.end4
|
|
%idx.0 = phi i32 [ 3, %if.end4 ], [ %6, %if.end7 ]
|
|
%3 = icmp slt i32 %idx.0, %x
|
|
br i1 %3, label %loop.body, label %if.then
|
|
|
|
loop.body: ; preds = %loop.cond
|
|
%4 = srem i32 %x, %idx.0
|
|
%5 = icmp eq i32 %4, 0
|
|
br i1 %5, label %if.then, label %if.end7
|
|
|
|
if.end7: ; preds = %loop.body
|
|
%6 = add i32 %idx.0, 2
|
|
br label %loop.cond
|
|
}
|
|
|
|
; ModuleID = 'my_module'
|
|
|
|
define i32 @isprime(i32 %x) {
|
|
decl:
|
|
%0 = icmp sle i32 %x, 2
|
|
br i1 %0, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %loop.body, %loop.cond, %if.end, %decl
|
|
%merge = phi i32 [ 1, %decl ], [ 0, %if.end ], [ 1, %loop.cond ], [ 0, %loop.body ]
|
|
ret i32 %merge
|
|
|
|
if.end: ; preds = %decl
|
|
%1 = srem i32 %x, 2
|
|
%2 = icmp eq i32 %1, 0
|
|
br i1 %2, label %if.then, label %if.end4
|
|
|
|
if.end4: ; preds = %if.end
|
|
br label %loop.cond
|
|
|
|
loop.cond: ; preds = %if.end7, %if.end4
|
|
%idx.0 = phi i32 [ 3, %if.end4 ], [ %6, %if.end7 ]
|
|
%3 = icmp slt i32 %idx.0, %x
|
|
br i1 %3, label %loop.body, label %if.then
|
|
|
|
loop.body: ; preds = %loop.cond
|
|
%4 = srem i32 %x, %idx.0
|
|
%5 = icmp eq i32 %4, 0
|
|
br i1 %5, label %if.then, label %if.end7
|
|
|
|
if.end7: ; preds = %loop.body
|
|
%6 = add i32 %idx.0, 2
|
|
br label %loop.cond
|
|
}
|
|
```
|