📄 ld-insn.c
字号:
voidinsn_table_traverse_insn (lf *file, insn_table *isa, insn_entry_handler * handler, void *data){ insn_entry *insn; for (insn = isa->insns; insn != NULL; insn = insn->next) { handler (file, isa, insn, data); }}static voiddump_function_entry (lf *file, char *prefix, function_entry * entry, char *suffix){ lf_printf (file, "%s(function_entry *) 0x%lx", prefix, (long) entry); if (entry != NULL) { dump_line_ref (file, "\n(line ", entry->line, ")"); dump_filter (file, "\n(flags ", entry->flags, ")"); lf_printf (file, "\n(type \"%s\")", entry->type); lf_printf (file, "\n(name \"%s\")", entry->name); lf_printf (file, "\n(param \"%s\")", entry->param); dump_table_entry (file, "\n(code ", entry->code, ")"); lf_printf (file, "\n(is_internal %d)", entry->is_internal); lf_printf (file, "\n(next 0x%lx)", (long) entry->next); } lf_printf (file, "%s", suffix);}static voiddump_function_entries (lf *file, char *prefix, function_entry * entry, char *suffix){ lf_printf (file, "%s", prefix); lf_indent (file, +1); while (entry != NULL) { dump_function_entry (file, "\n(", entry, ")"); entry = entry->next; } lf_indent (file, -1); lf_printf (file, "%s", suffix);}static char *cache_entry_type_to_str (cache_entry_type type){ switch (type) { case scratch_value: return "scratch"; case cache_value: return "cache"; case compute_value: return "compute"; } ERROR ("Bad switch"); return 0;}static voiddump_cache_entry (lf *file, char *prefix, cache_entry *entry, char *suffix){ lf_printf (file, "%s(cache_entry *) 0x%lx", prefix, (long) entry); if (entry != NULL) { dump_line_ref (file, "\n(line ", entry->line, ")"); dump_filter (file, "\n(flags ", entry->flags, ")"); lf_printf (file, "\n(entry_type \"%s\")", cache_entry_type_to_str (entry->entry_type)); lf_printf (file, "\n(name \"%s\")", entry->name); dump_filter (file, "\n(original_fields ", entry->original_fields, ")"); lf_printf (file, "\n(type \"%s\")", entry->type); lf_printf (file, "\n(expression \"%s\")", entry->expression); lf_printf (file, "\n(next 0x%lx)", (long) entry->next); } lf_printf (file, "%s", suffix);}voiddump_cache_entries (lf *file, char *prefix, cache_entry *entry, char *suffix){ lf_printf (file, "%s", prefix); lf_indent (file, +1); while (entry != NULL) { dump_cache_entry (file, "\n(", entry, ")"); entry = entry->next; } lf_indent (file, -1); lf_printf (file, "%s", suffix);}static voiddump_model_data (lf *file, char *prefix, model_data *entry, char *suffix){ lf_printf (file, "%s(model_data *) 0x%lx", prefix, (long) entry); if (entry != NULL) { lf_indent (file, +1); dump_line_ref (file, "\n(line ", entry->line, ")"); dump_filter (file, "\n(flags ", entry->flags, ")"); dump_table_entry (file, "\n(entry ", entry->entry, ")"); dump_table_entry (file, "\n(code ", entry->code, ")"); lf_printf (file, "\n(next 0x%lx)", (long) entry->next); lf_indent (file, -1); } lf_printf (file, "%s", prefix);}static voiddump_model_datas (lf *file, char *prefix, model_data *entry, char *suffix){ lf_printf (file, "%s", prefix); lf_indent (file, +1); while (entry != NULL) { dump_model_data (file, "\n(", entry, ")"); entry = entry->next; } lf_indent (file, -1); lf_printf (file, "%s", suffix);}static voiddump_model_entry (lf *file, char *prefix, model_entry *entry, char *suffix){ lf_printf (file, "%s(model_entry *) 0x%lx", prefix, (long) entry); if (entry != NULL) { lf_indent (file, +1); dump_line_ref (file, "\n(line ", entry->line, ")"); dump_filter (file, "\n(flags ", entry->flags, ")"); lf_printf (file, "\n(name \"%s\")", entry->name); lf_printf (file, "\n(full_name \"%s\")", entry->full_name); lf_printf (file, "\n(unit_data \"%s\")", entry->unit_data); lf_printf (file, "\n(next 0x%lx)", (long) entry->next); lf_indent (file, -1); } lf_printf (file, "%s", prefix);}static voiddump_model_entries (lf *file, char *prefix, model_entry *entry, char *suffix){ lf_printf (file, "%s", prefix); lf_indent (file, +1); while (entry != NULL) { dump_model_entry (file, "\n(", entry, ")"); entry = entry->next; } lf_indent (file, -1); lf_printf (file, "%s", suffix);}static voiddump_model_table (lf *file, char *prefix, model_table *entry, char *suffix){ lf_printf (file, "%s(model_table *) 0x%lx", prefix, (long) entry); if (entry != NULL) { lf_indent (file, +1); dump_filter (file, "\n(processors ", entry->processors, ")"); lf_printf (file, "\n(nr_models %d)", entry->nr_models); dump_model_entries (file, "\n(models ", entry->models, ")"); dump_model_datas (file, "\n(macros ", entry->macros, ")"); dump_model_datas (file, "\n(data ", entry->data, ")"); dump_function_entries (file, "\n(statics ", entry->statics, ")"); dump_function_entries (file, "\n(internals ", entry->functions, ")"); dump_function_entries (file, "\n(functions ", entry->functions, ")"); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}static char *insn_field_type_to_str (insn_field_type type){ switch (type) { case insn_field_invalid: ASSERT (0); return "(invalid)"; case insn_field_int: return "int"; case insn_field_reserved: return "reserved"; case insn_field_wild: return "wild"; case insn_field_string: return "string"; } ERROR ("bad switch"); return 0;}voiddump_insn_field (lf *file, char *prefix, insn_field_entry *field, char *suffix){ char *sep = " "; lf_printf (file, "%s(insn_field_entry *) 0x%lx", prefix, (long) field); if (field != NULL) { lf_indent (file, +1); lf_printf (file, "%s(first %d)", sep, field->first); lf_printf (file, "%s(last %d)", sep, field->last); lf_printf (file, "%s(width %d)", sep, field->width); lf_printf (file, "%s(type %s)", sep, insn_field_type_to_str (field->type)); switch (field->type) { case insn_field_invalid: ASSERT (0); break; case insn_field_int: lf_printf (file, "%s(val 0x%lx)", sep, (long) field->val_int); break; case insn_field_reserved: /* nothing output */ break; case insn_field_wild: /* nothing output */ break; case insn_field_string: lf_printf (file, "%s(val \"%s\")", sep, field->val_string); break; } lf_printf (file, "%s(next 0x%lx)", sep, (long) field->next); lf_printf (file, "%s(prev 0x%lx)", sep, (long) field->prev); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}voiddump_insn_word_entry (lf *file, char *prefix, insn_word_entry *word, char *suffix){ lf_printf (file, "%s(insn_word_entry *) 0x%lx", prefix, (long) word); if (word != NULL) { int i; insn_field_entry *field; lf_indent (file, +1); lf_printf (file, "\n(first 0x%lx)", (long) word->first); lf_printf (file, "\n(last 0x%lx)", (long) word->last); lf_printf (file, "\n(bit"); for (i = 0; i < options.insn_bit_size; i++) lf_printf (file, "\n ((value %d) (mask %d) (field 0x%lx))", word->bit[i]->value, word->bit[i]->mask, (long) word->bit[i]->field); lf_printf (file, ")"); for (field = word->first; field != NULL; field = field->next) dump_insn_field (file, "\n(", field, ")"); dump_filter (file, "\n(field_names ", word->field_names, ")"); lf_printf (file, "\n(next 0x%lx)", (long) word->next); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}static voiddump_insn_word_entries (lf *file, char *prefix, insn_word_entry *word, char *suffix){ lf_printf (file, "%s", prefix); while (word != NULL) { dump_insn_word_entry (file, "\n(", word, ")"); word = word->next; } lf_printf (file, "%s", suffix);}static voiddump_insn_model_entry (lf *file, char *prefix, insn_model_entry *model, char *suffix){ lf_printf (file, "%s(insn_model_entry *) 0x%lx", prefix, (long) model); if (model != NULL) { lf_indent (file, +1); dump_line_ref (file, "\n(line ", model->line, ")"); dump_filter (file, "\n(names ", model->names, ")"); lf_printf (file, "\n(full_name \"%s\")", model->full_name); lf_printf (file, "\n(unit_data \"%s\")", model->unit_data); lf_printf (file, "\n(insn (insn_entry *) 0x%lx)", (long) model->insn); lf_printf (file, "\n(next (insn_model_entry *) 0x%lx)", (long) model->next); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}static voiddump_insn_model_entries (lf *file, char *prefix, insn_model_entry *model, char *suffix){ lf_printf (file, "%s", prefix); while (model != NULL) { dump_insn_model_entry (file, "\n", model, ""); model = model->next; } lf_printf (file, "%s", suffix);}static voiddump_insn_mnemonic_entry (lf *file, char *prefix, insn_mnemonic_entry *mnemonic, char *suffix){ lf_printf (file, "%s(insn_mnemonic_entry *) 0x%lx", prefix, (long) mnemonic); if (mnemonic != NULL) { lf_indent (file, +1); dump_line_ref (file, "\n(line ", mnemonic->line, ")"); lf_printf (file, "\n(format \"%s\")", mnemonic->format); lf_printf (file, "\n(condition \"%s\")", mnemonic->condition); lf_printf (file, "\n(insn (insn_entry *) 0x%lx)", (long) mnemonic->insn); lf_printf (file, "\n(next (insn_mnemonic_entry *) 0x%lx)", (long) mnemonic->next); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}static voiddump_insn_mnemonic_entries (lf *file, char *prefix, insn_mnemonic_entry *mnemonic, char *suffix){ lf_printf (file, "%s", prefix); while (mnemonic != NULL) { dump_insn_mnemonic_entry (file, "\n", mnemonic, ""); mnemonic = mnemonic->next; } lf_printf (file, "%s", suffix);}voiddump_insn_entry (lf *file, char *prefix, insn_entry * entry, char *suffix){ lf_printf (file, "%s(insn_entry *) 0x%lx", prefix, (long) entry); if (entry != NULL) { int i; lf_indent (file, +1); dump_line_ref (file, "\n(line ", entry->line, ")"); dump_filter (file, "\n(flags ", entry->flags, ")"); lf_printf (file, "\n(nr_words %d)", entry->nr_words); dump_insn_word_entries (file, "\n(words ", entry->words, ")"); lf_printf (file, "\n(word"); for (i = 0; i < entry->nr_models; i++) lf_printf (file, " 0x%lx", (long) entry->word[i]); lf_printf (file, ")"); dump_filter (file, "\n(field_names ", entry->field_names, ")"); lf_printf (file, "\n(format_name \"%s\")", entry->format_name); dump_filter (file, "\n(options ", entry->options, ")"); lf_printf (file, "\n(name \"%s\")", entry->name); lf_printf (file, "\n(nr_models %d)", entry->nr_models); dump_insn_model_entries (file, "\n(models ", entry->models, ")"); lf_printf (file, "\n(model"); for (i = 0; i < entry->nr_models; i++) lf_printf (file, " 0x%lx", (long) entry->model[i]); lf_printf (file, ")"); dump_filter (file, "\n(processors ", entry->processors, ")"); dump_insn_mnemonic_entries (file, "\n(mnemonics ", entry->mnemonics, ")"); dump_table_entry (file, "\n(code ", entry->code, ")"); lf_printf (file, "\n(next 0x%lx)", (long) entry->next); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}static voiddump_insn_entries (lf *file, char *prefix, insn_entry * entry, char *suffix){ lf_printf (file, "%s", prefix); lf_indent (file, +1); while (entry != NULL) { dump_insn_entry (file, "\n(", entry, ")"); entry = entry->next; } lf_indent (file, -1); lf_printf (file, "%s", suffix);}voiddump_insn_table (lf *file, char *prefix, insn_table *isa, char *suffix){ lf_printf (file, "%s(insn_table *) 0x%lx", prefix, (long) isa); if (isa != NULL) { lf_indent (file, +1); dump_cache_entries (file, "\n(caches ", isa->caches, ")"); lf_printf (file, "\n(nr_insns %d)", isa->nr_insns); lf_printf (file, "\n(max_nr_words %d)", isa->max_nr_words); dump_insn_entries (file, "\n(insns ", isa->insns, ")"); dump_function_entries (file, "\n(functions ", isa->functions, ")"); dump_insn_entry (file, "\n(illegal_insn ", isa->illegal_insn, ")"); dump_model_table (file, "\n(model ", isa->model, ")"); dump_filter (file, "\n(flags ", isa->flags, ")"); dump_filter (file, "\n(options ", isa->options, ")"); lf_indent (file, -1); } lf_printf (file, "%s", suffix);}#ifdef MAINigen_options options;intmain (int argc, char **argv){ insn_table *isa; lf *l; INIT_OPTIONS (options); if (argc == 3) filter_parse (&options.flags_filter, argv[2]); else if (argc != 2) error (NULL, "Usage: insn <insn-table> [ <filter-in> ]\n"); isa = load_insn_table (argv[1], NULL); l = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "tmp-ld-insn"); dump_insn_table (l, "(isa ", isa, ")\n"); return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -