[LLVMdev] BNF for IL/IR interpreter

Kenneth Adam Miller kennethadammiller at gmail.com
Thu Apr 9 12:10:09 PDT 2015


I apologize, I found Yacc and Bison. I have my reading cut out for me.

On Thu, Apr 9, 2015 at 2:37 PM, Kenneth Adam Miller <
kennethadammiller at gmail.com> wrote:

> This might be a very beginner question, but I'm looking for an example for
> something that I have never done.
>
> Suppose that I wanted to express actions with respect to lifted semantics
> of CPU instructions to an intermediate representation, BAP IL or LLVM IR.
> How might I go about providing a Backus Naur Form specification and then
> dynamically interpreting those lifted instructions by also specifying
> actions to be done with any given IL/IR primitive? I'm looking for any
> library that allows me to express BNF terms and actions on them.
>
> Like, say I convert push ebp to Bap IL (here's a json representation from
> their live development branch):
>
> {
>   "move": {
>     "lvar": { "name": "t", "id": 107, "typ": { "imm": 64 } },
>     "rexp": { "var": { "name": "RBP", "id": 30, "typ": { "imm": 64 } } }
>   }
> },
> {
>   "move": {
>     "lvar": { "name": "RSP", "id": 32, "typ": { "imm": 64 } },
>     "rexp": {
>       "binop": {
>         "op": "minus",
>         "lexp": {
>           "var": { "name": "RSP", "id": 32, "typ": { "imm": 64 } }
>         },
>         "rexp": { "inte": { "int": "MHg4OjY0" } }
>       }
>     }
>   }
> },
> {
>   "move": {
>     "lvar": {
>       "name": "mem64",
>       "id": 58,
>       "typ": {
>         "mem": {
>           "index_type": { "r64": true },
>           "element_type": { "r8": true }
>         }
>       }
>     },
>     "rexp": {
>       "store": {
>         "memory": {
>           "var": {
>             "name": "mem64",
>             "id": 58,
>             "typ": {
>               "mem": {
>                 "index_type": { "r64": true },
>                 "element_type": { "r8": true }
>               }
>             }
>           }
>         },
>         "address": {
>           "var": { "name": "RSP", "id": 32, "typ": { "imm": 64 } }
>         },
>         "value": {
>           "var": { "name": "t", "id": 107, "typ": { "imm": 64 } }
>         },
>         "endian": "little_endian",
>         "size": { "r64": true }
>       }
>     }
>   }
> }
>
> Then, for say, move, I could, in my interpreter specify some reasonable
> action that captures those semantics, like allocate a 64 bit space in which
> to store the value, and then also a SSA for the RSP variable value at such
> a point. In this way, I could possibly specify other things such as
> symbolic interpretation of specific memory regions for things like solving
> to find certain constraints and limitations on code blocks. Then, after
> some segments of code are lifted and interpreted, I provide some meaningful
> context in terms of state, registers and memory, and the representation
> gained could be executed upon in order to reach interesting path and state
> combinations.
>
> But I've never written a language before... I'm afraid I'm new. But I'm
> very interested, and I want to learn so I'm looking to use infrastructure
> that's already there, and learn how to construct this properly.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150409/5a44d25c/attachment.html>


More information about the llvm-dev mailing list