diff --git a/infer/src/llvm/lLexer.mll b/infer/src/llvm/lLexer.mll index 8b8509144..f56012463 100644 --- a/infer/src/llvm/lLexer.mll +++ b/infer/src/llvm/lLexer.mll @@ -156,11 +156,13 @@ rule token = parse (*| "fcmp" { FCMP }*) (*| "phi" { PHI }*) (*| "select" { SELECT }*) - (*| "call" { CALL }*) + | "call" { CALL } (*| "va_arg" { VA_ARG }*) (*| "landingpad" { LANDINGPAD }*) + (* IDENTIFIERS *) + | "@llvm.dbg.declare" { DBG_DECLARE } | '@' (id as str) { NAMED_GLOBAL str } | '%' (id as str) { NAMED_LOCAL str } | '@' (nonneg_int as i) { NUMBERED_GLOBAL (int_of_string i) } diff --git a/infer/src/llvm/lParser.mly b/infer/src/llvm/lParser.mly index d0baea623..4692b4703 100644 --- a/infer/src/llvm/lParser.mly +++ b/infer/src/llvm/lParser.mly @@ -124,10 +124,11 @@ (*%token FCMP*) (*%token PHI*) (*%token SELECT*) -(*%token CALL*) +%token CALL (*%token VA_ARG*) (*%token LANDINGPAD*) +%token DBG_DECLARE %token NAMED_GLOBAL %token NAMED_LOCAL %token NUMBERED_GLOBAL @@ -235,20 +236,21 @@ ptr_typ: | tp = typ STAR { tp } block: - | LBRACE annotated_instrs = annotated_instr* RBRACE { annotated_instrs } + | LBRACE annotated_instrs = annotated_instr* RBRACE { Utils.list_flatten_options annotated_instrs } annotated_instr: - | instruction=instr anno=annotation? { (instruction, anno) } + | instruction = real_instr anno = annotation? { Some (instruction, anno) } + | debug_instr annotation? { None } annotation: - | COMMA DEBUG_ANNOTATION i=NUMBERED_METADATA { Annotation i } + | COMMA DEBUG_ANNOTATION i = NUMBERED_METADATA { Annotation i } -instr: +real_instr: (* terminator instructions *) | RET tp = typ op = operand { Ret (Some (tp, op)) } | RET VOID { Ret None } | BR LABEL lbl = variable { UncondBranch lbl } - | BR i=INT op = operand COMMA LABEL lbl1 = variable COMMA LABEL lbl2 = variable { CondBranch (op, lbl1, lbl2) } + | BR i = INT op = operand COMMA LABEL lbl1 = variable COMMA LABEL lbl2 = variable { CondBranch (op, lbl1, lbl2) } (* Memory access operations *) | var = variable EQUALS ALLOCA tp = typ align? { Alloc (var, tp, 1) } | var = variable EQUALS LOAD tp = ptr_typ ptr = variable align? { Load (var, tp, ptr) } @@ -256,6 +258,9 @@ instr: (* don't yet know why val_tp and ptr_tp would be different *) | variable EQUALS binop { Binop } +debug_instr: + | CALL VOID DBG_DECLARE LPAREN separated_list(COMMA, metadata_component) RPAREN { () } + align: | COMMA ALIGN sz = CONSTANT_INT { sz }