1(library (yuni transformer llvm bitcode-decoder)
2         (export bitcode-decode)
3         (import (rnrs)
4                 (for (yuni transformer llvm bitcode-dict) run expand))
5
6(define-syntax decoder
7  (syntax-rules ()
8    ((_ (#f) input)
9     input)
10    ((_ (root) input)
11     (if (pair? input)
12       (let ((code (car input))
13             (rest (cdr input)))
14         ;(display (list 'DECODE code '=> (root code)))(newline)
15         (cons (root code)
16               rest))
17       input))))
18
19(define-syntax define-bitcode-blocks
20  (syntax-rules ()
21    ((_ name root (spec-sym spec-code ...) ...)
22     (define (name block-id record)
23       (let ((sym (root block-id)))
24         (case sym
25           ((spec-sym) (decoder (spec-code ...) record))
26           ...
27           (else record)))))))
28
29(define-bitcode-blocks bitcode-decode
30   llvm-ir-blockid
31   (MODULE_BLOCK record-MODULE_BLOCK)
32   (PARAMATTR_BLOCK record-PARAMATTR_BLOCK)
33   (TYPE_BLOCK record-TYPE_BLOCK)
34   (CONSTANTS_BLOCK record-CONSTANTS_BLOCK)
35   (TYPE_SYMTAB_BLOCK record-TYPE_SYMTAB_BLOCK)
36   (VALUE_SYMTAB_BLOCK record-VALUE_SYMTAB_BLOCK)
37   (METADATA_BLOCK record-METADATA_BLOCK)
38   (METADATA_ATTACHMENT #f))
39
40)
41