let pretty_lval_or_absolute (annot : GText.buffer) ki lva =
  begin (* State before ki *)
    annot#insert "Before statement:\n";
    let state = Value.get_state ki in
    try
      let offsetmap = lval_or_absolute_to_offsetmap state lva in
      annot#insert (Pretty_utils.sfprintf "%a@\n"
                      (pretty_offsetmap lva) offsetmap);
    with Lmap.Cannot_copy ->
      match lva with
        | LVal lv ->
            let value = !Db.Value.access ki lv in
            let inset_utf8 = Unicode.inset_string () in
            annot#insert (Pretty_utils.sfprintf "%a %s %a@\n"
                            !Ast_printer.d_lval lv
                            inset_utf8
                            Db.Value.pretty value)
        | AbsoluteMem -> annot#insert "<>"
  end;
  begin (* State after ki *)
    if Value_parameters.ResultsAfter.get () then
      match ki with
        | Kstmt ({ skind = Instr _} as stmt) ->
          let state =
            try Value.AfterTable.find stmt
            with Not_found -> Cvalue.Model.bottom
          in
          let offsetmap_after = lval_or_absolute_to_offsetmap state lva in
          annot#insert (Pretty_utils.sfprintf "After statement:\n%a\n"
                          (pretty_offsetmap lva) offsetmap_after);
        | Kglobal | Kstmt _ -> ()
    else
      try
        (match lva with
          | LVal lv ->
              let offsetmap_after = !Db.Value.lval_to_offsetmap_after ki lv in
              annot#insert (Pretty_utils.sfprintf "At next statement:@\n%a@\n"
                              (pretty_offsetmap lva) offsetmap_after)
          | AbsoluteMem -> ())
      with Not_found -> ()
  end