• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • Soft
        • C
          • Syntax-for-tools
          • Atc
          • Language
          • Representation
          • Transformation-tools
            • Simpadd0
            • Deftrans
              • Deftrans-defn-expr
              • Deftrans-core
              • Deftrans-defn-type-spec
              • Deftrans-defn-stmt
              • Deftrans-defn-dirdeclor
              • Deftrans-defn-dirabsdeclor
              • Deftrans-defn-structdecl
              • Deftrans-defn-member-designor
              • Deftrans-defn-fundef
              • Deftrans-defn-decl-spec
              • Deftrans-parse-keywords
              • Deftrans-defn-param-declor
              • Deftrans-defn-spec/qual
              • Deftrans-defn-initdeclor
              • Deftrans-defn-genassoc
              • Deftrans-defn-decl
              • Deftrans-defn-block-item
              • Deftrans-defn-align-spec
              • Deftrans-mk-names
              • Deftrans-defn-structdeclor-list
              • Deftrans-defn-structdeclor
              • Deftrans-defn-structdecl-list
              • Deftrans-defn-spec/qual-list
              • Deftrans-defn-param-declon-list
              • Deftrans-defn-param-declon
              • Deftrans-defn-label
              • Deftrans-defn-initer
              • Deftrans-defn-initdeclor-list
              • Deftrans-defn-genassoc-list
              • Deftrans-defn-extdecl-list
              • Deftrans-defn-extdecl
              • Deftrans-defn-desiniter-list
              • Deftrans-defn-desiniter
              • Deftrans-defn-designor-list
              • Deftrans-defn-decl-spec-list
              • Deftrans-defn-block-item-list
              • Deftrans-defn
              • Deftrans-defn-tyname
              • Deftrans-defn-strunispec
              • Deftrans-defn-statassert
              • Deftrans-defn-initer-option
              • Deftrans-defn-ident-list
              • Deftrans-defn-expr-list
              • Deftrans-defn-enumspec
              • Deftrans-defn-enumer-list
              • Deftrans-defn-enumer
              • Deftrans-defn-dirabsdeclor-option
              • Deftrans-defn-designor
              • Deftrans-defn-declor-option
              • Deftrans-defn-declor
              • Deftrans-defn-decl-list
              • Deftrans-defn-const-expr-option
              • Deftrans-defn-const-expr
              • Deftrans-defn-absdeclor-option
              • Deftrans-defn-absdeclor
              • Deftrans-defn-transunit
              • Deftrans-defn-expr-option
              • Deftrans-cases
              • Deftrans-mk-names0
              • Deftrans-defn-ident
              • Deftrans-defn-const
              • Take-pairs
              • Deftrans-macro
              • Deftrans-get-args
            • Splitgso
            • Constant-propagation
            • Split-fn
            • Copy-fn
            • Specialize
            • Split-all-gso
            • Rename
            • Utilities
          • Insertion-sort
          • Pack
        • Bv
        • Imp-language
        • Event-macros
        • Java
        • Bitcoin
        • Ethereum
        • Yul
        • Zcash
        • ACL2-programming-language
        • Prime-fields
        • Json
        • Syntheto
        • File-io-light
        • Cryptography
        • Number-theory
        • Lists-light
        • Axe
        • Builtins
        • Solidity
        • Helpers
        • Htclient
        • Typed-lists-light
        • Arithmetic-light
      • X86isa
      • Axe
      • Execloader
    • Math
    • Testing-utilities
  • Transformation-tools

Deftrans

A tool to generate C-to-C transformations.

The C c$::abstract-syntax has many cases as well as large, mutually recursive cliques. Transformations will therefore have significant sections of boilerplate in which functions do nothing but call the appropriate sub-transformation on each child of the AST node. In addition, most all such transformations will have the same termination argument. deftrans eases the burden of writing such transformations by generating all the "trivial" cases of the transformation, only requiring the user to provide function definitions for the interesting cases.

General form:

(deftrans name
  :extra-args extra-args           ;; Default: nil
  :with-output-off with-output-off ;; Default: (:other-than summary error)
  ...
  other-keywords
  ...
)

Inputs

  • name

    The name of the transformation, to be used as a prefix in the generated functions.

  • :extra-args

    A list of arguments to be passed to the transformation functions, in addition to the AST term. This list is expected to be in the format of std::extended-formals.

  • :with-output-off

    Controls the output. The value should be suitable for use in the :off field of with-output.

  • other-keywords

    For each case of the AST, you may specify :<case> fn, where <case> is the name of the case, and fn is a lambda or function name. See the nullary function deftrans-cases for the possible values for <case>.

    You may call other generated functions within fn. The name of the function for case <case> will be <name>-<case>, where <name> is the provided name input.

Example: simpadd0

The following example will generate a transformation my-simpadd0 which folds expressions such as x + 0 to x. See tests/deftrans.lisp for this and other examples.

(deftrans my-simpadd0
  :expr (lambda (expr)
       (expr-case
            expr
            :ident (expr-fix expr)
            :const (expr-fix expr)
            :string (expr-fix expr)
            :paren (expr-paren (my-simpadd0-expr expr.inner))
            :gensel (make-expr-gensel
                      :control (my-simpadd0-expr expr.control)
                      :assocs (my-simpadd0-genassoc-list expr.assocs))
            :arrsub (make-expr-arrsub
                      :arg1 (my-simpadd0-expr expr.arg1)
                      :arg2 (my-simpadd0-expr expr.arg2))
            :funcall (make-expr-funcall
                       :fun (my-simpadd0-expr expr.fun)
                       :args (my-simpadd0-expr-list expr.args))
            :member (make-expr-member
                      :arg (my-simpadd0-expr expr.arg)
                      :name expr.name)
            :memberp (make-expr-memberp
                       :arg (my-simpadd0-expr expr.arg)
                       :name expr.name)
            :complit (make-expr-complit
                       :type (my-simpadd0-tyname expr.type)
                       :elems (my-simpadd0-desiniter-list expr.elems)
                       :final-comma expr.final-comma)
            :unary (make-expr-unary
                     :op expr.op
                     :arg (my-simpadd0-expr expr.arg))
                     :info expr.info)
            :sizeof (expr-sizeof (my-simpadd0-tyname expr.type))
            :sizeof-ambig (prog2$
                            (raise "Misusage error: ~x0." (expr-fix expr))
                            (expr-fix expr))
            :alignof (make-expr-alignof :type (my-simpadd0-tyname expr.type)
                                        :uscores expr.uscores)
            :cast (make-expr-cast
                    :type (my-simpadd0-tyname expr.type)
                    :arg (my-simpadd0-expr expr.arg))
            :binary (b* ((arg1 (my-simpadd0-expr expr.arg1))
                         (arg2 (my-simpadd0-expr expr.arg2)))
                      ;; zero-folding occurs here
                      (if (c$::expr-zerop arg2)
                          arg1
                        (make-expr-binary
                          :op expr.op
                          :arg1 arg1
                          :arg2 arg2
                          :info expr.info)))
            :cond (make-expr-cond
                    :test (my-simpadd0-expr expr.test)
                    :then (my-simpadd0-expr-option expr.then)
                    :else (my-simpadd0-expr expr.else))
            :comma (make-expr-comma
                     :first (my-simpadd0-expr expr.first)
                     :next (my-simpadd0-expr expr.next))
            :cast/call-ambig (prog2$
                               (raise "Misusage error: ~x0." (expr-fix expr))
                               (expr-fix expr))
            :cast/mul-ambig (prog2$
                              (raise "Misusage error: ~x0." (expr-fix expr))
                              (expr-fix expr))
            :cast/add-ambig (prog2$
                              (raise "Misusage error: ~x0." (expr-fix expr))
                              (expr-fix expr))
            :cast/sub-ambig (prog2$
                              (raise "Misusage error: ~x0." (expr-fix expr))
                              (expr-fix expr))
            :cast/and-ambig (prog2$
                              (raise "Misusage error: ~x0." (expr-fix expr))
                              (expr-fix expr))
            :stmt (expr-stmt (my-simpadd0-block-item-list expr.items))
            :tycompat (make-expr-tycompat
                        :type1 (my-simpadd0-tyname expr.type1)
                        :type2 (my-simpadd0-tyname expr.type2))
            :offsetof (make-expr-offsetof
                        :type (my-simpadd0-tyname expr.type)
                        :member (my-simpadd0-member-designor expr.member))
            :va-arg (make-expr-va-arg
                      :list (my-simpadd0-expr expr.list)
                      :type (my-simpadd0-tyname expr.type))
            :extension (expr-extension (my-simpadd0-tyname expr.expr)))))

Subtopics

Deftrans-defn-expr
Deftrans-core
Deftrans-defn-type-spec
Deftrans-defn-stmt
Deftrans-defn-dirdeclor
Deftrans-defn-dirabsdeclor
Deftrans-defn-structdecl
Deftrans-defn-member-designor
Deftrans-defn-fundef
Deftrans-defn-decl-spec
Deftrans-parse-keywords
Deftrans-defn-param-declor
Deftrans-defn-spec/qual
Deftrans-defn-initdeclor
Deftrans-defn-genassoc
Deftrans-defn-decl
Deftrans-defn-block-item
Deftrans-defn-align-spec
Deftrans-mk-names
Deftrans-defn-structdeclor-list
Deftrans-defn-structdeclor
Deftrans-defn-structdecl-list
Deftrans-defn-spec/qual-list
Deftrans-defn-param-declon-list
Deftrans-defn-param-declon
Deftrans-defn-label
Deftrans-defn-initer
Deftrans-defn-initdeclor-list
Deftrans-defn-genassoc-list
Deftrans-defn-extdecl-list
Deftrans-defn-extdecl
Deftrans-defn-desiniter-list
Deftrans-defn-desiniter
Deftrans-defn-designor-list
Deftrans-defn-decl-spec-list
Deftrans-defn-block-item-list
Deftrans-defn
Deftrans-defn-tyname
Deftrans-defn-strunispec
Deftrans-defn-statassert
Deftrans-defn-initer-option
Deftrans-defn-ident-list
Deftrans-defn-expr-list
Deftrans-defn-enumspec
Deftrans-defn-enumer-list
Deftrans-defn-enumer
Deftrans-defn-dirabsdeclor-option
Deftrans-defn-designor
Deftrans-defn-declor-option
Deftrans-defn-declor
Deftrans-defn-decl-list
Deftrans-defn-const-expr-option
Deftrans-defn-const-expr
Deftrans-defn-absdeclor-option
Deftrans-defn-absdeclor
Deftrans-defn-transunit
Deftrans-defn-expr-option
Deftrans-cases
Deftrans-mk-names0
Deftrans-defn-ident
Deftrans-defn-const
Take-pairs
Deftrans-macro
Deftrans-get-args
Gets arg names from a define-style arg list.