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