(* * Copyright (c) 2015 - present Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. *) open LAst let concatmap (sep : string) (f : 'a -> string) (l : 'a list) : string = String.concat sep (List.map f l) let pretty_variable : variable -> string = function | Global id -> "@" ^ id | Local id -> "%" ^ id let pretty_constant : constant -> string = function | Cint i -> string_of_int i | Cnull -> "null" let pretty_operand : operand -> string = function | Var var -> pretty_variable var | Const const -> pretty_constant const let rec pretty_typ : typ -> string = function | Tint width -> "i" ^ string_of_int width | Tfloat (* just one type for now *) -> "float" | Tptr tp -> pretty_typ tp ^ "*" | Tvector (sz, tp) -> "<" ^ string_of_int sz ^ " x " ^ pretty_typ tp ^ ">" | Tlabel -> "label" | Tmetadata -> "metadata" | Tarray (sz, tp) -> "[" ^ string_of_int sz ^ " x " ^ pretty_typ tp ^ "]" let pretty_ret_typ : typ option -> string = function | None -> "void" | Some tp -> pretty_typ tp let pretty_instr : instr -> string = function | Ret None -> "ret void" | Ret (Some (tp, op)) -> "ret " ^ pretty_typ tp ^ " " ^ pretty_operand op | UncondBranch label -> "br label " ^ pretty_variable label | CondBranch (op, label1, label2) -> "br i1 " ^ pretty_operand op ^ ", label " ^ pretty_variable label1 ^ ", label " ^ pretty_variable label2 let pretty_instr_ln (i : instr) : string = pretty_instr i ^ "\n" let pretty_func_def : func_def -> string = function FuncDef (name, ret_tp, params, instrs) -> "define " ^ pretty_ret_typ ret_tp ^ " " ^ pretty_variable name ^ "(" ^ concatmap ", " (fun (tp, id) -> pretty_typ tp ^ " " ^ id) params ^ ") {\n" ^ concatmap "" pretty_instr_ln instrs ^ "}\n" let pretty_prog : prog -> string = function Prog func_defs -> concatmap "" pretty_func_def func_defs