void MR_print_label(FILE *fp, const MR_Code *w) { MR_Internal *internal; internal = MR_lookup_internal_by_addr(w); if (internal != NULL) { if (internal->MR_internal_name != NULL) { fprintf(fp, "label %s", internal->MR_internal_name); } else { fprintf(fp, "unnamed label %p", internal->MR_internal_addr); } #ifdef MR_DEBUG_LABEL_GOAL_PATHS if (internal->MR_internal_layout != NULL) { fprintf(fp, " <%s>", MR_label_goal_path(internal->MR_internal_layout)); } #endif } else { MR_Entry *entry; entry = MR_prev_entry_by_addr(w); if (entry != NULL && entry->MR_entry_addr == w) { if (entry->MR_entry_name != NULL) { fprintf(fp, "entry label %s", entry->MR_entry_name); } else { fprintf(fp, "unnamed entry label %p", entry->MR_entry_addr); } } else { fprintf(fp, "label UNKNOWN %p", w); } } if (MR_print_raw_addrs) { fprintf(fp, " (%p)", w); } }
static unsigned MR_trace_write_label_exec_counts_for_file(FILE *fp, const MR_ModuleLayout *module, const MR_ModuleFileLayout *file, const char *module_name, MR_bool coverage_test) { const MR_LabelLayout *label; const MR_ProcLayout *prev_proc; const MR_ProcLayout *proc; const MR_UserProcId *id; MR_TracePort port; int num_labels; int label_num; int label_index; unsigned num_written; MR_Unsigned exec_count; MR_PathPort path_port; fputs("file ", fp); MR_trace_write_quoted_atom(fp, file->MR_mfl_filename); fputc('\n', fp); prev_proc = NULL; num_labels = file->MR_mfl_label_count; num_written = 0; for (label_num = 0; label_num < num_labels; label_num++) { label = file->MR_mfl_label_layout[label_num]; proc = label->MR_sll_entry; label_index = label->MR_sll_label_num_in_module; exec_count = module->MR_ml_label_exec_count[label_index]; if (! MR_PROC_LAYOUT_IS_UCI(proc) && label_index > 0 && (exec_count > 0 || coverage_test)) { num_written++; id = &proc->MR_sle_user; if (proc != prev_proc) { if (MR_strdiff(module_name, id->MR_user_def_module)) { MR_fatal_error( "MR_trace_write_label_exec_counts_for_file: " "module name mismatch"); } if (id->MR_user_pred_or_func == MR_PREDICATE) { fputs("pproc", fp); } else { fputs("fproc", fp); } if (MR_strdiff(module_name, id->MR_user_decl_module)) { /* turn pproc/fproc into pprocdecl/fprocdecl */ fputs("decl ", fp); MR_trace_write_quoted_atom(fp, id->MR_user_decl_module); } fputc(' ', fp); MR_trace_write_quoted_atom(fp, id->MR_user_name); fprintf(fp, " %d %d\n", id->MR_user_arity, id->MR_user_mode); } port = label->MR_sll_port; path_port = MR_named_count_port[port]; switch (path_port) { case PORT_ONLY: fputs(MR_actual_port_names[port], fp); break; case PATH_ONLY: putc('<', fp); fputs(MR_label_goal_path(label), fp); putc('>', fp); break; case PORT_AND_PATH: fputs(MR_actual_port_names[port], fp); putc(' ', fp); putc('<', fp); fputs(MR_label_goal_path(label), fp); putc('>', fp); break; default: MR_fatal_error( "MR_trace_write_label_exec_counts_for_file: " "bad path_port"); break; } putc(' ', fp); fprintf(fp, "%d", file->MR_mfl_label_lineno[label_num]); if (exec_count > 0) { putc(' ', fp); fprintf(fp, "%" MR_INTEGER_LENGTH_MODIFIER "u", exec_count); } putc('\n', fp); prev_proc = proc; } } return num_written; }