You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
4.2 KiB
241 lines
4.2 KiB
(*
|
|
* Copyright (c) 2015 - Facebook.
|
|
* All rights reserved.
|
|
*)
|
|
%{
|
|
open Ast
|
|
%}
|
|
|
|
(* keywords *)
|
|
%token DEFINE
|
|
|
|
(* delimiters *)
|
|
%token COMMA
|
|
%token LPAREN
|
|
%token RPAREN
|
|
%token LBRACE
|
|
%token RBRACE
|
|
%token LANGLE
|
|
%token RANGLE
|
|
%token LSQBRACK
|
|
%token RSQBRACK
|
|
(* symbols *)
|
|
%token EQUALS
|
|
%token STAR
|
|
%token X
|
|
|
|
(* TYPES *)
|
|
%token VOID
|
|
%token <int> INT
|
|
%token HALF
|
|
%token FLOAT
|
|
%token DOUBLE
|
|
%token FP128
|
|
%token X86_FP80
|
|
%token PPC_FP128
|
|
%token X86_MMX
|
|
%token LABEL
|
|
%token METADATA
|
|
|
|
%token <int> SIZE
|
|
(* CONSTANTS *)
|
|
%token TRUE
|
|
%token FALSE
|
|
%token <int> INTLIT
|
|
%token NULL
|
|
|
|
(* INSTRUCTIONS *)
|
|
(* terminator instructions *)
|
|
%token RET
|
|
%token BR
|
|
%token SWITCH
|
|
%token INDIRECTBR
|
|
%token INVOKE
|
|
%token RESUME
|
|
%token UNREACHABLE
|
|
(* binary operations *)
|
|
%token ADD
|
|
%token FADD
|
|
%token SUB
|
|
%token FSUB
|
|
%token MUL
|
|
%token FMUL
|
|
%token UDIV
|
|
%token SDIV
|
|
%token FDIV
|
|
%token UREM
|
|
%token SREM
|
|
%token FREM
|
|
(* arithmetic options *)
|
|
%token NUW
|
|
%token NSW
|
|
%token EXACT
|
|
(* floating point options *)
|
|
%token NNAN
|
|
%token NINF
|
|
%token NSZ
|
|
%token ARCP
|
|
%token FAST
|
|
(* bitwise binary operations *)
|
|
%token SHL
|
|
%token LSHR
|
|
%token ASHR
|
|
%token AND
|
|
%token OR
|
|
%token XOR
|
|
(* vector operations *)
|
|
%token EXTRACTELEMENT
|
|
%token INSERTELEMENT
|
|
%token SHUFFLEVECTOR
|
|
(* aggregate operations *)
|
|
%token EXTRACTVALUE
|
|
%token INSERTVALUE
|
|
(* memory access and addressing operations *)
|
|
%token ALLOCA
|
|
%token LOAD
|
|
%token STORE
|
|
%token FENCE
|
|
%token CMPXCHG
|
|
%token ATOMICRMW
|
|
%token GETELEMENTPTR
|
|
(* conversion operations *)
|
|
%token TRUNC
|
|
%token ZEXT
|
|
%token SEXT
|
|
%token FPTRUNC
|
|
%token FPEXT
|
|
%token FPTOUI
|
|
%token FPTOSI
|
|
%token UITOFP
|
|
%token SITOFP
|
|
%token PTRTOINT
|
|
%token INTTOPTR
|
|
%token BITCAST
|
|
%token ADDRSPACECAST
|
|
%token TO
|
|
(* other operations *)
|
|
%token ICMP
|
|
%token FCMP
|
|
%token PHI
|
|
%token SELECT
|
|
%token CALL
|
|
%token VA_ARG
|
|
%token LANDINGPAD
|
|
|
|
%token <string> IDENT
|
|
|
|
%token EOF
|
|
|
|
%start prog
|
|
%type <Ast.prog> prog
|
|
%type <Ast.func_def> func_def
|
|
%type <Ast.typ option> ret_typ
|
|
%type <Ast.typ> typ
|
|
|
|
%%
|
|
|
|
prog:
|
|
| defs=list(func_def) EOF { Prog defs }
|
|
|
|
func_def:
|
|
| DEFINE ret_tp=ret_typ name=IDENT LPAREN params=separated_list(COMMA, pair(typ, IDENT)) RPAREN instrs=block {
|
|
FuncDef (name, ret_tp, params, instrs) }
|
|
|
|
ret_typ:
|
|
| VOID { None }
|
|
| tp=typ { Some tp }
|
|
|
|
typ:
|
|
| tp=element_typ { tp }
|
|
(*| X86_MMX { () }*)
|
|
| tp=vector_typ { tp }
|
|
| LSQBRACK sz=SIZE X tp=element_typ RSQBRACK { Tarray (sz, tp) } (* array type *)
|
|
(*| LABEL { () }
|
|
| METADATA { () }*)
|
|
(* TODO structs *)
|
|
|
|
vector_typ:
|
|
| LANGLE sz=SIZE X tp=element_typ RANGLE { Tvector (sz, tp) }
|
|
|
|
element_typ:
|
|
| width=INT { Tint width }
|
|
| floating_typ { Tfloat }
|
|
| tp=ptr_typ { tp }
|
|
|
|
floating_typ:
|
|
| HALF { () }
|
|
| FLOAT { () }
|
|
| DOUBLE { () }
|
|
| FP128 { () }
|
|
| X86_FP80 { () }
|
|
| PPC_FP128 { () }
|
|
|
|
ptr_typ:
|
|
| tp=typ STAR { Tptr tp }
|
|
|
|
block:
|
|
| LBRACE instrs=list(instr) RBRACE { instrs }
|
|
|
|
instr:
|
|
| term=terminator { term }
|
|
| IDENT EQUALS binop { Ret None }
|
|
|
|
terminator:
|
|
| RET tp=typ v=value { Ret (Some (tp, v)) }
|
|
| RET VOID { Ret None }
|
|
(*
|
|
| switch
|
|
| indirectbr
|
|
| invoke
|
|
| resume
|
|
| unreachable
|
|
*)
|
|
|
|
binop:
|
|
| ADD arith_options binop_args { () }
|
|
| FADD fast_math_flags binop_args { () }
|
|
| SUB arith_options binop_args { () }
|
|
| FSUB fast_math_flags binop_args { () }
|
|
| MUL binop_args { () }
|
|
| FMUL fast_math_flags binop_args { () }
|
|
| UDIV option(EXACT) binop_args { () }
|
|
| SDIV option(EXACT) binop_args { () }
|
|
| FDIV fast_math_flags binop_args { () }
|
|
| UREM binop_args { () }
|
|
| SREM binop_args { () }
|
|
| FREM fast_math_flags binop_args { () }
|
|
(* bitwise *)
|
|
| SHL arith_options binop_args { () }
|
|
| LSHR option(EXACT) binop_args { () }
|
|
| ASHR option(EXACT) binop_args { () }
|
|
| AND binop_args { () }
|
|
| OR binop_args { () }
|
|
| XOR binop_args { () }
|
|
(* vector *)
|
|
| EXTRACTELEMENT vector_typ value COMMA typ IDENT { () }
|
|
| INSERTELEMENT vector_typ value COMMA typ element COMMA typ IDENT { () }
|
|
|
|
arith_options:
|
|
| option(NUW) option(NSW) { () }
|
|
|
|
fast_math_flags:
|
|
| option(NNAN) option(NINF) option(NSZ) option(ARCP) option(FAST) { () }
|
|
|
|
binop_args:
|
|
| typ operand COMMA operand { () }
|
|
|
|
(* below is fuzzy *)
|
|
|
|
operand:
|
|
(* variable *)
|
|
| v=value { v }
|
|
|
|
element:
|
|
| v=value { v }
|
|
|
|
value:
|
|
| TRUE { True }
|
|
| FALSE { False }
|
|
| i=INTLIT { Intlit i }
|
|
| NULL { Null }
|