anchor.diff:    
     string *                   //digest of this source file
                                //also present in the list above, but handy to have it here
  +                             //when checking if parsing data is valid
     
     Parser.Dep.parsing_data *  //parsing data for this file
     
  
positive.code:                   let msg = BU.format2 "checked file %s is stale (digest mismatch for %s)" checked_fn fn in
                    add_and_return (Invalid msg, Inl msg)
                  end
                  else add_and_return (Unknown (deps_dig, tc_result), Inr parsing_data)
  
  (*
   * Second step for loading checked files, validates the tc data
   *)
  let load_checked_file_with_tc_result (deps:Dep.deps) (fn:string) (checked_fn:string) :cache_t =
    let elt = load_checked_file fn checked_fn in
    match elt with  //first step, in case some client calls it directly
    | Invalid _, _
    | Valid _, _ -> elt  //already marked Valid or Invalid
    | Unknown (deps_dig, tc_result), parsing_data ->
      match hash_dependences deps fn with
      | Inl msg ->
        let elt = (Invalid msg, parsing_data) in
        BU.smap_add mcache checked_fn elt;
        elt
      | Inr deps_dig' ->
        if deps_dig = deps_dig'
        then begin
          //mark the tc data of the file as valid
          let elt = (Valid (BU.digest_of_file checked_fn, tc_result), parsing_data) in 
          BU.smap_add mcache checked_fn elt;
          (*
           * if there exists an interface for it, mark that too as valid
  
negative.code:         then BU.print1 "%s\m" msg;
          Inl msg
        | Some (Invalid msg, _) -> Inl msg
        | Some (Valid dig, _)   -> Inr dig
        | Some (Unknown, _)     ->
          failwith (BU.format2
                      "Impossible: unknown entry in the cache for dependence %s of module %s"
                      fn module_name)
  