/ llvm / block.scm
block.scm
 1  (define-module (llvm block)
 2    #:use-module ((rnrs base) #:select (assert))
 3    #:use-module (llvm module)
 4    #:use-module (system foreign)
 5    #:use-module (oop goops)
 6    #:use-module (llvm types)
 7    #:use-module (llvm type)
 8    #:use-module (llvm context)
 9    #:use-module (llvm raw)
10    #:export (append-block
11              create-block))
12  
13  (define* (create-block name #:key (context (current-llvm-context)))
14    (let* ((o (LLVMCreateBasicBlockInContext (unwrap-llvm-context context)
15                                             (string->pointer name)))
16           (block (wrap-llvm-block o)))
17      block))
18  
19  (define* (append-block/create fn name #:key (context (current-llvm-context)))
20    (let* ((o (LLVMAppendBasicBlockInContext (unwrap-llvm-context context)
21                                             (unwrap-llvm-value fn)
22                                             (string->pointer name)))
23           (block (wrap-llvm-block o #:function fn)))
24      (slot-set! fn 'blocks (cons block (slot-ref fn 'blocks)))
25      block))
26  
27  (define (append-block/existing fn block)
28    (LLVMAppendExistingBasicBlock (unwrap-llvm-function fn)
29                                  (unwrap-llvm-block block))
30    (slot-set! block 'function fn)
31    (slot-set! fn 'blocks (cons block (slot-ref fn 'blocks))))
32  
33  (define* (append-block fn block #:key (context (current-llvm-context)))
34    (if (llvm-block? block)
35        (append-block/existing fn block)
36        (append-block/create fn block #:context context)))
37  
38  (define* (delete-block block)
39    (assert (llvm-block? block))
40    (let ((p (unwrap-llvm-block block))
41          (func (slot-ref block 'function)))
42      (LLVMDeleteBasicBlock p)
43      (slot-set! func 'block
44                 (delete
45                  block
46                  (slot-ref func 'block)))
47      (change-class block <llvm-freed>)))
48  
49  (define (remove-block block)
50    (let ((p (unwrap-llvm-block block))
51          (func (slot-ref block 'function)))
52      (LLVMRemoveBasicBlockFromParent p)
53      (slot-set! func 'block
54                 (delete
55                  block
56                  (slot-ref func 'block)))
57      block))
58  
59  (define-public (first-instruction block)
60    (let* ((b-p (unwrap-llvm-block block))
61           (inst-p (LLVMGetFirstInstruction b-p)))
62      (wrap-llvm-value inst-p)))