extern int print_function_name(lf *file, const char *basename, insn_bits *expanded_bits, lf_function_name_prefixes prefix) { int nr = 0; /* the prefix */ switch (prefix) { case function_name_prefix_semantics: nr += lf_putstr(file, "semantic_"); break; case function_name_prefix_idecode: nr += lf_printf(file, "idecode_"); break; case function_name_prefix_itable: nr += lf_putstr(file, "itable_"); break; case function_name_prefix_icache: nr += lf_putstr(file, "icache_"); break; default: break; } /* the function name */ { const char *pos; for (pos = basename; *pos != '\0'; pos++) { switch (*pos) { case '/': case '-': case '(': case ')': break; case ' ': nr += lf_putchr(file, '_'); break; default: nr += lf_putchr(file, *pos); break; } } } /* the suffix */ if (generate_expanded_instructions) nr += print_insn_bits(file, expanded_bits); return nr; }
int lf_putbin (lf *file, int decimal, int width) { int nr = 0; int bit; ASSERT (width > 0); for (bit = 1 << (width - 1); bit != 0; bit >>= 1) { if (decimal & bit) nr += lf_putchr (file, '1'); else nr += lf_putchr (file, '0'); } return nr; }
int lf_write (lf *file, const char *string, int strlen_string) { int nr = 0; int i; for (i = 0; i < strlen_string; i++) nr += lf_putchr (file, string[i]); return nr; }
int lf_putint (lf *file, int decimal) { int nr = 0; if (decimal == 0) nr += lf_putchr (file, '0'); else if (decimal < 0) { nr += lf_putchr (file, '-'); nr += do_lf_putunsigned (file, -decimal); } else if (decimal > 0) { nr += do_lf_putunsigned (file, decimal); } else ASSERT (0); return nr; }
int lf_print__ucase_filename (lf *file) { int nr = 0; const char *chp = file->name; while (*chp != '\0') { char ch = *chp; if (islower (ch)) { nr += lf_putchr (file, toupper (ch)); } else if (ch == '.') nr += lf_putchr (file, '_'); else nr += lf_putchr (file, ch); chp++; } return nr; }
static int do_lf_putunsigned (lf *file, unsigned u) { int nr = 0; if (u > 0) { nr += do_lf_putunsigned (file, u / 10); nr += lf_putchr (file, (u % 10) + '0'); } return nr; }
int lf_putstr (lf *file, const char *string) { int nr = 0; const char *chp; if (string != NULL) { for (chp = string; *chp != '\0'; chp++) { nr += lf_putchr (file, *chp); } } return nr; }
static int print_c_name (lf *file, const char *name) { int nr = 0; const char *pos; for (pos = name; *pos != '\0'; pos++) { switch (*pos) { case '/': case '-': break; case ' ': case '.': nr += lf_putchr (file, '_'); break; default: nr += lf_putchr (file, *pos); break; } } return nr; }
static int print_insn_bits(lf *file, insn_bits *bits) { int nr = 0; if (bits == NULL) return nr; nr += print_insn_bits(file, bits->last); nr += lf_putchr(file, '_'); nr += lf_putstr(file, bits->field->val_string); if (bits->opcode->is_boolean && bits->value == 0) nr += lf_putint(file, bits->opcode->boolean_constant); else if (!bits->opcode->is_boolean) { if (bits->opcode->last < bits->field->last) nr += lf_putint(file, bits->value << (bits->field->last - bits->opcode->last)); else nr += lf_putint(file, bits->value); } return nr; }
static void print_itrace_format (lf *file, insn_mnemonic_entry *assembler) { /* pass=1 is fmt string; pass=2 is arguments */ int pass; /* print the format string */ for (pass = 1; pass <= 2; pass++) { const char *chp = assembler->format; chp++; /* skip the leading quote */ /* write out the format/args */ while (*chp != '\0') { if (chp[0] == '\\' && (chp[1] == '<' || chp[1] == '>')) { if (pass == 1) lf_putchr (file, chp[1]); chp += 2; } else if (chp[0] == '<' || chp[0] == '%') { /* parse [ "%" ... ] "<" [ func "#" ] param ">" */ const char *fmt; const char *func; int strlen_func; const char *param; int strlen_param; /* the "%" ... "<" format */ fmt = chp; while (chp[0] != '<' && chp[0] != '\0') chp++; if (chp[0] != '<') error (assembler->line, "Missing `<' after `%%'\n"); chp++; /* [ "func" # ] OR "param" */ func = chp; param = chp; while (chp[0] != '>' && chp[0] != '#' && chp[0] != '\0') chp++; strlen_func = chp - func; if (chp[0] == '#') { chp++; param = chp; while (chp[0] != '>' && chp[0] != '\0') chp++; } strlen_param = chp - param; if (chp[0] != '>') error (assembler->line, "Missing closing `>' in assembler string\n"); chp++; /* now process it */ if (pass == 2) lf_printf (file, ", \\\n"); if (strncmp (fmt, "<", 1) == 0) /* implicit long int format */ { if (pass == 1) lf_printf (file, "%%ld"); else { lf_printf (file, "(long) "); lf_write (file, param, strlen_param); } } else if (strncmp (fmt, "%<", 2) == 0) /* explicit format */ { if (pass == 1) lf_printf (file, "%%"); else lf_write (file, param, strlen_param); } else if (strncmp (fmt, "%s<", 3) == 0) /* string format */ { if (pass == 1) lf_printf (file, "%%s"); else { lf_printf (file, "%sstr_", options.module.global.prefix.l); lf_write (file, func, strlen_func); lf_printf (file, " (SD_, "); lf_write (file, param, strlen_param); lf_printf (file, ")"); } } else if (strncmp (fmt, "%lx<", 4) == 0) /* simple hex */ { if (pass == 1) lf_printf (file, "%%lx"); else { lf_printf (file, "(unsigned long) "); lf_write (file, param, strlen_param); } } else if (strncmp (fmt, "%08lx<", 6) == 0) /* simple hex */ { if (pass == 1) lf_printf (file, "%%08lx"); else { lf_printf (file, "(unsigned long) "); lf_write (file, param, strlen_param); } } else error (assembler->line, "Unknown assembler string format\n"); } else { if (pass == 1) lf_putchr (file, chp[0]); chp += 1; } } } lf_printf (file, ");\n"); }