X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-tic54x.c;h=72c8cf3967a24e34dcf33b59085ffcc95ff96e28;hb=fd3619828e94a24a92cddec42cbc0ab33352eeb4;hp=c9972975bdcdfdc738c2709e1af0182ad12c6a51;hpb=6e210b4129b522c1a0b0c6dee24ee469d5020583;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index c9972975bd..72c8cf3967 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -1,5 +1,5 @@ /* tc-tic54x.c -- Assembly code for the Texas Instruments TMS320C54X - Copyright (C) 1999-2014 Free Software Foundation, Inc. + Copyright (C) 1999-2019 Free Software Foundation, Inc. Contributed by Timothy Wall (twall@cygnus.com) This file is part of GAS, the GNU Assembler. @@ -50,7 +50,6 @@ #include "sb.h" #include "macro.h" #include "subsegs.h" -#include "struc-symbol.h" #include "opcode/tic54x.h" #include "obj-coff.h" #include @@ -161,7 +160,7 @@ size_t md_longopts_size = sizeof (md_longopts); static int assembly_begun = 0; /* Addressing mode is not entirely implemented; the latest rev of the Other assembler doesn't seem to make any distinction whatsoever; all relocations - are stored as extended relocatiosn. Older versions used REL16 vs RELEXT16, + are stored as extended relocations. Older versions used REL16 vs RELEXT16, but now it seems all relocations are RELEXT16. We use all RELEXT16. The cpu version is kind of a waste of time as well. There is one @@ -186,7 +185,8 @@ static struct hash_control *subsym_recurse_hash; /* Prevent infinite recurse. * static struct hash_control *math_hash; /* Built-in math functions. */ /* Allow maximum levels of macro nesting; level 0 is the main substitution symbol table. The other assembler only does 32 levels, so there! */ -static struct hash_control *subsym_hash[100]; +#define MAX_SUBSYM_HASH 100 +static struct hash_control *subsym_hash[MAX_SUBSYM_HASH]; /* Keep track of local labels so we can substitute them before GAS sees them since macros use their own 'namespace' for local labels, use a separate hash @@ -230,14 +230,14 @@ static char *subsym_substitute (char *, int); void md_show_usage (FILE *stream) { - fprintf (stream, _("C54x-specific command line options:\n")); + fprintf (stream, _("C54x-specific command line options:\n")); fprintf (stream, _("-mfar-mode | -mf Use extended addressing\n")); fprintf (stream, _("-mcpu= Specify the CPU version\n")); fprintf (stream, _("-merrors-to-file \n")); fprintf (stream, _("-me Redirect errors to a file\n")); } -/* Output a single character (upper octect is zero). */ +/* Output a single character (upper octet is zero). */ static void tic54x_emit_char (char c) @@ -322,7 +322,6 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) int c; char *name; char *str; - char *tmp; int quoted = *input_line_pointer == '"'; ILLEGAL_WITHIN_STRUCT (); @@ -338,7 +337,7 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) str = input_line_pointer; while ((c = *input_line_pointer) != ',') { - if (is_end_of_line[(int) *input_line_pointer]) + if (is_end_of_line[(unsigned char) c]) break; ++input_line_pointer; } @@ -351,8 +350,8 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) return; } - name = ++input_line_pointer; - c = get_symbol_end (); /* Get terminator. */ + ++input_line_pointer; + c = get_symbol_name (&name); /* Get terminator. */ if (!ISALPHA (*name)) { as_bad (_("symbols assigned with .asg must begin with a letter")); @@ -360,14 +359,10 @@ tic54x_asg (int x ATTRIBUTE_UNUSED) return; } - tmp = xmalloc (strlen (str) + 1); - strcpy (tmp, str); - str = tmp; - tmp = xmalloc (strlen (name) + 1); - strcpy (tmp, name); - name = tmp; + str = xstrdup (str); + name = xstrdup (name); subsym_create_or_replace (name, str); - *input_line_pointer = c; + (void) restore_line_pointer (c); demand_empty_rest_of_line (); } @@ -411,11 +406,9 @@ tic54x_eval (int x ATTRIBUTE_UNUSED) ignore_rest_of_line (); return; } - name = input_line_pointer; - c = get_symbol_end (); /* Get terminator. */ - tmp = xmalloc (strlen (name) + 1); - name = strcpy (tmp, name); - *input_line_pointer = c; + c = get_symbol_name (&name); /* Get terminator. */ + name = xstrdup (name); + (void) restore_line_pointer (c); if (!ISALPHA (*name)) { @@ -432,8 +425,7 @@ tic54x_eval (int x ATTRIBUTE_UNUSED) But since there's not written rule as to when, don't even bother trying to match their behavior. */ sprintf (valuestr, "%d", value); - tmp = xmalloc (strlen (valuestr) + 1); - strcpy (tmp, valuestr); + tmp = xstrdup (valuestr); subsym_create_or_replace (name, tmp); demand_empty_rest_of_line (); @@ -471,8 +463,9 @@ tic54x_bss (int x ATTRIBUTE_UNUSED) current_seg = now_seg; /* Save current seg. */ current_subseg = now_subseg; /* Save current subseg. */ - name = input_line_pointer; - c = get_symbol_end (); /* Get terminator. */ + c = get_symbol_name (&name); /* Get terminator. */ + if (c == '"') + c = * ++ input_line_pointer; if (c != ',') { as_bad (_(".bss size argument missing\n")); @@ -513,7 +506,7 @@ tic54x_bss (int x ATTRIBUTE_UNUSED) symbolP = symbol_find_or_make (name); if (S_GET_SEGMENT (symbolP) == bss_section) - symbolP->sy_frag->fr_symbol = (symbolS *) NULL; + symbol_get_frag (symbolP)->fr_symbol = (symbolS *) NULL; symbol_set_frag (symbolP, frag_now); p = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, @@ -549,21 +542,16 @@ stag_add_field_symbols (struct stag *stag, symbolS *rootsym, const char *root_stag_name) { - char prefix[strlen (path) + 2]; + char * prefix; struct stag_field *field = stag->field; /* Construct a symbol for every field contained within this structure including fields within structure fields. */ - strcpy (prefix, path); - if (*path) - strcat (prefix, "."); + prefix = concat (path, *path ? "." : "", NULL); while (field != NULL) { - int len = strlen (prefix) + strlen (field->name) + 2; - char *name = xmalloc (len); - strcpy (name, prefix); - strcat (name, field->name); + char *name = concat (prefix, field->name, NULL); if (rootsym == NULL) { @@ -577,12 +565,10 @@ stag_add_field_symbols (struct stag *stag, } else { - char *replacement = xmalloc (strlen (name) - + strlen (stag->name) + 2); - strcpy (replacement, S_GET_NAME (rootsym)); - strcat (replacement, "+"); - strcat (replacement, root_stag_name); - strcat (replacement, name + strlen (S_GET_NAME (rootsym))); + char *replacement; + + replacement = concat (S_GET_NAME (rootsym), "+", root_stag_name, + name + strlen (S_GET_NAME (rootsym)), NULL); hash_insert (subsym_hash[0], name, replacement); } @@ -593,7 +579,9 @@ stag_add_field_symbols (struct stag *stag, field->offset, rootsym, root_stag_name); field = field->next; + free (name); } + free (prefix); } /* Keep track of stag fields so that when structures are nested we can add the @@ -605,10 +593,9 @@ stag_add_field (struct stag *parent, bfd_vma offset, struct stag *stag) { - struct stag_field *sfield = xmalloc (sizeof (struct stag_field)); + struct stag_field *sfield = XCNEW (struct stag_field); - memset (sfield, 0, sizeof (*sfield)); - sfield->name = strcpy (xmalloc (strlen (name) + 1), name); + sfield->name = xstrdup (name); sfield->offset = offset; sfield->bitfield_offset = parent->current_bitfield_offset; sfield->stag = stag; @@ -659,7 +646,7 @@ tic54x_struct (int arg) { /* Offset is ignored in inner structs. */ SKIP_WHITESPACE (); - if (!is_end_of_line[(int) *input_line_pointer]) + if (!is_end_of_line[(unsigned char) *input_line_pointer]) start_offset = get_absolute_expression (); else start_offset = 0; @@ -668,8 +655,7 @@ tic54x_struct (int arg) if (current_stag) { /* Nesting, link to outer one. */ - current_stag->inner = (struct stag *) xmalloc (sizeof (struct stag)); - memset (current_stag->inner, 0, sizeof (struct stag)); + current_stag->inner = XCNEW (struct stag); current_stag->inner->outer = current_stag; current_stag = current_stag->inner; if (start_offset) @@ -678,8 +664,7 @@ tic54x_struct (int arg) } else { - current_stag = (struct stag *) xmalloc (sizeof (struct stag)); - memset (current_stag, 0, sizeof (struct stag)); + current_stag = XCNEW (struct stag); abs_section_offset = start_offset; } current_stag->is_union = is_union; @@ -695,11 +680,12 @@ tic54x_struct (int arg) } else { - char label[strlen (S_GET_NAME (line_label)) + 1]; - strcpy (label, S_GET_NAME (line_label)); - current_stag->sym = symbol_new (label, absolute_section, + char * label = xstrdup (S_GET_NAME (line_label)); + current_stag->sym = symbol_new (label, + absolute_section, (valueT) abs_section_offset, &zero_address_frag); + free (label); } current_stag->name = S_GET_NAME (current_stag->sym); SF_SET_LOCAL (current_stag->sym); @@ -782,8 +768,8 @@ tic54x_endstruct (int is_union) static void tic54x_tag (int ignore ATTRIBUTE_UNUSED) { - char *name = input_line_pointer; - int c = get_symbol_end (); + char *name; + int c = get_symbol_name (&name); struct stag *stag = (struct stag *) hash_find (stag_hash, name); if (!stag) @@ -803,9 +789,9 @@ tic54x_tag (int ignore ATTRIBUTE_UNUSED) } else { - char label[strlen (S_GET_NAME (line_label)) + 1]; + char * label; - strcpy (label, S_GET_NAME (line_label)); + label = xstrdup (S_GET_NAME (line_label)); if (current_stag != NULL) stag_add_field (current_stag, label, abs_section_offset - S_GET_VALUE (current_stag->sym), @@ -818,18 +804,20 @@ tic54x_tag (int ignore ATTRIBUTE_UNUSED) { as_bad (_(".tag target '%s' undefined"), label); ignore_rest_of_line (); + free (label); return; } stag_add_field_symbols (stag, S_GET_NAME (sym), S_GET_VALUE (stag->sym), sym, stag->name); } + free (label); } /* Bump by the struct size, but only if we're within a .struct section. */ if (current_stag != NULL && !current_stag->is_union) abs_section_offset += stag->size; - *input_line_pointer = c; + (void) restore_line_pointer (c); demand_empty_rest_of_line (); line_label = NULL; } @@ -848,7 +836,7 @@ tic54x_struct_field (int type) int longword_align = 0; SKIP_WHITESPACE (); - if (!is_end_of_line[(int) *input_line_pointer]) + if (!is_end_of_line[(unsigned char) *input_line_pointer]) count = get_absolute_expression (); switch (type) @@ -933,12 +921,13 @@ tic54x_struct_field (int type) } else { - char label[strlen (S_GET_NAME (line_label) + 1)]; + char * label; - strcpy (label, S_GET_NAME (line_label)); + label = xstrdup (S_GET_NAME (line_label)); stag_add_field (current_stag, label, abs_section_offset - S_GET_VALUE (current_stag->sym), NULL); + free (label); } if (current_stag->is_union) @@ -1109,16 +1098,15 @@ tic54x_global (int type) do { - name = input_line_pointer; - c = get_symbol_end (); + c = get_symbol_name (&name); symbolP = symbol_find_or_make (name); + c = restore_line_pointer (c); - *input_line_pointer = c; S_SET_STORAGE_CLASS (symbolP, C_EXT); if (c == ',') { input_line_pointer++; - if (is_end_of_line[(int) *input_line_pointer]) + if (is_end_of_line[(unsigned char) *input_line_pointer]) c = *input_line_pointer; } } @@ -1173,27 +1161,27 @@ tic54x_sect (int arg) { char *name = NULL; int len; + /* Make sure all named initialized sections flagged properly. If we + encounter instructions, we'll flag it with SEC_CODE as well. */ + const char *flags = ",\"w\"\n"; /* If there are quotes, remove them. */ if (*input_line_pointer == '"') { name = demand_copy_C_string (&len); demand_empty_rest_of_line (); - name = strcpy (xmalloc (len + 10), name); + name = concat (name, flags, (char *) NULL); } else { int c; - name = input_line_pointer; - c = get_symbol_end (); - len = strlen(name); - name = strcpy (xmalloc (len + 10), name); - *input_line_pointer = c; + + c = get_symbol_name (&name); + name = concat (name, flags, (char *) NULL); + (void) restore_line_pointer (c); demand_empty_rest_of_line (); } - /* Make sure all named initialized sections flagged properly. If we - encounter instructions, we'll flag it with SEC_CODE as well. */ - strcat (name, ",\"w\"\n"); + input_scrub_insert_line (name); obj_coff_section (0); @@ -1244,7 +1232,7 @@ tic54x_space (int arg) partial allocation has not been completed yet. */ if (expn.X_op != O_constant || frag_bit_offset (frag_now, now_seg) == -1) { - struct bit_info *bi = xmalloc (sizeof (struct bit_info)); + struct bit_info *bi = XNEW (struct bit_info); bi->seg = now_seg; bi->type = bes; @@ -1366,17 +1354,13 @@ tic54x_usect (int x ATTRIBUTE_UNUSED) current_seg = now_seg; /* Save current seg. */ current_subseg = now_subseg; /* Save current subseg. */ - if (*input_line_pointer == '"') - input_line_pointer++; - section_name = input_line_pointer; - c = get_symbol_end (); /* Get terminator. */ - input_line_pointer++; /* Skip null symbol terminator. */ - name = xmalloc (input_line_pointer - section_name + 1); - strcpy (name, section_name); - - if (*input_line_pointer == ',') + c = get_symbol_name (§ion_name); /* Get terminator. */ + name = xstrdup (section_name); + c = restore_line_pointer (c); + + if (c == ',') ++input_line_pointer; - else if (c != ',') + else { as_bad (_("Missing size argument")); ignore_rest_of_line (); @@ -1407,7 +1391,7 @@ tic54x_usect (int x ATTRIBUTE_UNUSED) blocking_flag = alignment_flag = 0; seg = subseg_new (name, 0); - flags = bfd_get_section_flags (stdoutput, seg) | SEC_ALLOC; + flags = bfd_section_flags (seg) | SEC_ALLOC; if (alignment_flag) { @@ -1436,7 +1420,7 @@ tic54x_usect (int x ATTRIBUTE_UNUSED) if (blocking_flag) flags |= SEC_TIC54X_BLOCK; - if (!bfd_set_section_flags (stdoutput, seg, flags)) + if (!bfd_set_section_flags (seg, flags)) as_warn (_("Error setting flags for \"%s\": %s"), name, bfd_errmsg (bfd_get_error ())); @@ -1504,7 +1488,7 @@ tic54x_version (int x ATTRIBUTE_UNUSED) SKIP_WHITESPACE (); ver = input_line_pointer; - while (!is_end_of_line[(int) *input_line_pointer]) + while (!is_end_of_line[(unsigned char) *input_line_pointer]) ++input_line_pointer; c = *input_line_pointer; *input_line_pointer = 0; @@ -1662,7 +1646,7 @@ tic54x_align_words (int arg) /* Only ".align" with no argument is allowed within .struct/.union. */ int count = arg; - if (!is_end_of_line[(int) *input_line_pointer]) + if (!is_end_of_line[(unsigned char) *input_line_pointer]) { if (arg == 2) as_warn (_("Argument to .even ignored")); @@ -1686,7 +1670,7 @@ tic54x_align_words (int arg) s_align_bytes (count << 1); } -/* Initialize multiple-bit fields withing a single word of memory. */ +/* Initialize multiple-bit fields within a single word of memory. */ static void tic54x_field (int ignore ATTRIBUTE_UNUSED) @@ -1756,7 +1740,7 @@ tic54x_field (int ignore ATTRIBUTE_UNUSED) fragS *alloc_frag = bit_offset_frag (frag_now, now_seg); if (bit_offset == -1) { - struct bit_info *bi = xmalloc (sizeof (struct bit_info)); + struct bit_info *bi = XNEW (struct bit_info); /* We don't know the previous offset at this time, so store the info we need and figure it out later. */ expressionS size_exp; @@ -1840,8 +1824,7 @@ tic54x_clink (int ignored ATTRIBUTE_UNUSED) ; know (input_line_pointer[-1] == '\"'); input_line_pointer[-1] = 0; - name = xmalloc (input_line_pointer - section_name + 1); - strcpy (name, section_name); + name = xstrdup (section_name); seg = bfd_get_section_by_name (stdoutput, name); if (seg == NULL) @@ -1855,7 +1838,7 @@ tic54x_clink (int ignored ATTRIBUTE_UNUSED) { if (!tic54x_initialized_section (seg)) { - as_bad (_("Current section is unitialized, " + as_bad (_("Current section is uninitialized, " "section name required for .clink")); ignore_rest_of_line (); return; @@ -1872,20 +1855,15 @@ tic54x_clink (int ignored ATTRIBUTE_UNUSED) set to "." instead. */ static void -tic54x_set_default_include (int dot) +tic54x_set_default_include (void) { - char *dir = "."; - char *tmp = NULL; - - if (!dot) - { - char *curfile; - unsigned lineno; + char *dir, *tmp = NULL; + const char *curfile; + unsigned lineno; - as_where (&curfile, &lineno); - dir = strcpy (xmalloc (strlen (curfile) + 1), curfile); - tmp = strrchr (dir, '/'); - } + curfile = as_where (&lineno); + dir = xstrdup (curfile); + tmp = strrchr (dir, '/'); if (tmp != NULL) { int len; @@ -1894,7 +1872,7 @@ tic54x_set_default_include (int dot) len = strlen (dir); if (include_dir_count == 0) { - include_dirs = (char **) xmalloc (sizeof (*include_dirs)); + include_dirs = XNEWVEC (const char *, 1); include_dir_count = 1; } include_dirs[0] = dir; @@ -1936,11 +1914,11 @@ tic54x_include (int ignored ATTRIBUTE_UNUSED) else { filename = input_line_pointer; - while (!is_end_of_line[(int) *input_line_pointer]) + while (!is_end_of_line[(unsigned char) *input_line_pointer]) ++input_line_pointer; c = *input_line_pointer; *input_line_pointer = '\0'; - filename = strcpy (xmalloc (strlen (filename) + 1), filename); + filename = xstrdup (filename); *input_line_pointer = c; demand_empty_rest_of_line (); } @@ -1948,13 +1926,12 @@ tic54x_include (int ignored ATTRIBUTE_UNUSED) and a .newblock. The included file will be inserted before the newblock, so that the newblock is executed after the included file is processed. */ - input = xmalloc (sizeof (newblock) + strlen (filename) + 4); - sprintf (input, "\"%s\"\n%s", filename, newblock); + input = concat ("\"", filename, "\"\n", newblock, (char *) NULL); input_scrub_insert_line (input); tic54x_clear_local_labels (0); - tic54x_set_default_include (0); + tic54x_set_default_include (); s_include (0); } @@ -1973,11 +1950,11 @@ tic54x_message (int type) else { msg = input_line_pointer; - while (!is_end_of_line[(int) *input_line_pointer]) + while (!is_end_of_line[(unsigned char) *input_line_pointer]) ++input_line_pointer; c = *input_line_pointer; *input_line_pointer = 0; - msg = strcpy (xmalloc (strlen (msg) + 1), msg); + msg = xstrdup (msg); *input_line_pointer = c; } @@ -2008,17 +1985,17 @@ tic54x_message (int type) static void tic54x_label (int ignored ATTRIBUTE_UNUSED) { - char *name = input_line_pointer; + char *name; symbolS *symbolP; int c; ILLEGAL_WITHIN_STRUCT (); - c = get_symbol_end (); + c = get_symbol_name (&name); symbolP = colon (name); S_SET_STORAGE_CLASS (symbolP, C_STATLAB); - *input_line_pointer = c; + (void) restore_line_pointer (c); demand_empty_rest_of_line (); } @@ -2029,11 +2006,11 @@ tic54x_label (int ignored ATTRIBUTE_UNUSED) static void tic54x_mmregs (int ignored ATTRIBUTE_UNUSED) { - symbol *sym; + tic54x_symbol *sym; ILLEGAL_WITHIN_STRUCT (); - for (sym = (symbol *) mmregs; sym->name; sym++) + for (sym = (tic54x_symbol *) mmregs; sym->name; sym++) { symbolS *symbolP = symbol_new (sym->name, absolute_section, (valueT) sym->value, &zero_address_frag); @@ -2051,10 +2028,10 @@ tic54x_loop (int count) ILLEGAL_WITHIN_STRUCT (); SKIP_WHITESPACE (); - if (!is_end_of_line[(int) *input_line_pointer]) + if (!is_end_of_line[(unsigned char) *input_line_pointer]) count = get_absolute_expression (); - do_repeat (count, "LOOP", "ENDLOOP"); + do_repeat ((size_t) count, "LOOP", "ENDLOOP"); } /* Normally, endloop gets eaten by the preceding loop. */ @@ -2076,7 +2053,7 @@ tic54x_break (int ignore ATTRIBUTE_UNUSED) ILLEGAL_WITHIN_STRUCT (); SKIP_WHITESPACE (); - if (!is_end_of_line[(int) *input_line_pointer]) + if (!is_end_of_line[(unsigned char) *input_line_pointer]) cond = get_absolute_expression (); if (cond) @@ -2141,12 +2118,11 @@ tic54x_sblock (int ignore ATTRIBUTE_UNUSED) } else { - char *section_name = input_line_pointer; + char *section_name; - c = get_symbol_end (); - name = xmalloc (strlen (section_name) + 1); - strcpy (name, section_name); - *input_line_pointer = c; + c = get_symbol_name (§ion_name); + name = xstrdup (section_name); + (void) restore_line_pointer (c); } seg = bfd_get_section_by_name (stdoutput, name); @@ -2165,7 +2141,7 @@ tic54x_sblock (int ignore ATTRIBUTE_UNUSED) seg->flags |= SEC_TIC54X_BLOCK; c = *input_line_pointer; - if (!is_end_of_line[(int) c]) + if (!is_end_of_line[(unsigned char) c]) ++input_line_pointer; } @@ -2256,16 +2232,15 @@ tic54x_var (int ignore ATTRIBUTE_UNUSED) ignore_rest_of_line (); return; } - name = input_line_pointer; - c = get_symbol_end (); + c = get_symbol_name (&name); /* .var symbols start out with a null string. */ - name = strcpy (xmalloc (strlen (name) + 1), name); + name = xstrdup (name); hash_insert (subsym_hash[macro_level], name, empty); - *input_line_pointer = c; + c = restore_line_pointer (c); if (c == ',') { ++input_line_pointer; - if (is_end_of_line[(int) *input_line_pointer]) + if (is_end_of_line[(unsigned char) *input_line_pointer]) c = *input_line_pointer; } } @@ -2301,7 +2276,7 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED) { SKIP_WHITESPACE (); len = 0; - while (!is_end_of_line[(int) *input_line_pointer] + while (!is_end_of_line[(unsigned char) *input_line_pointer] && !ISSPACE (*input_line_pointer)) { obstack_1grow (¬es, *input_line_pointer); @@ -2313,8 +2288,8 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED) } demand_empty_rest_of_line (); - tic54x_set_default_include (0); - path = xmalloc ((unsigned long) len + include_dir_maxlen + 5); + tic54x_set_default_include (); + path = XNEWVEC (char, (unsigned long) len + include_dir_maxlen + 5); for (i = 0; i < include_dir_count; i++) { @@ -2363,7 +2338,7 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED) { /* Get a size at least as big as the archive member. */ bfd_size_type size = bfd_get_size (mbfd); - char *buf = xmalloc (size); + char *buf = XNEWVEC (char, size); char *fname = tmpnam (NULL); FILE *ftmp; @@ -2471,7 +2446,7 @@ const pseudo_typeS md_pseudo_table[] = }; int -md_parse_option (int c, char *arg) +md_parse_option (int c, const char *arg) { switch (c) { @@ -2500,7 +2475,7 @@ md_parse_option (int c, char *arg) break; case OPTION_STDERR_TO_FILE: { - char *filename = arg; + const char *filename = arg; FILE *fp = fopen (filename, "w+"); if (fp == NULL) @@ -2523,7 +2498,11 @@ md_parse_option (int c, char *arg) void tic54x_macro_start (void) { - ++macro_level; + if (++macro_level >= MAX_SUBSYM_HASH) + { + as_fatal (_("Macro nesting is too deep")); + return; + } subsym_hash[macro_level] = hash_new (); local_label_hash[macro_level] = hash_new (); } @@ -2536,10 +2515,8 @@ tic54x_macro_info (const macro_entry *macro) /* Put the formal args into the substitution symbol table. */ for (entry = macro->formals; entry; entry = entry->next) { - char *name = strncpy (xmalloc (entry->name.len + 1), - entry->name.ptr, entry->name.len); - char *value = strncpy (xmalloc (entry->actual.len + 1), - entry->actual.ptr, entry->actual.len); + char *name = xstrndup (entry->name.ptr, entry->name.len); + char *value = xstrndup (entry->actual.ptr, entry->actual.len); name[entry->name.len] = '\0'; value[entry->actual.len] = '\0'; @@ -2627,8 +2604,7 @@ subsym_ismember (char *sym, char *list) return 0; } - ptr = elem = xmalloc (strlen (listv) + 1); - strcpy (elem, listv); + ptr = elem = xstrdup (listv); while (*ptr && *ptr != ',') ++ptr; *ptr++ = 0; @@ -2916,7 +2892,7 @@ math_tanh (float arg1, float ignore ATTRIBUTE_UNUSED) /* Built-in substitution symbol functions and math functions. */ typedef struct { - char *name; + const char *name; int (*proc) (char *, char *); int nargs; } subsym_proc_entry; @@ -2940,7 +2916,7 @@ static const subsym_proc_entry subsym_procs[] = typedef struct { - char *name; + const char *name; float (*proc) (float, float); int nargs; int int_return; @@ -2986,7 +2962,7 @@ void md_begin (void) { insn_template *tm; - symbol *sym; + tic54x_symbol *sym; const subsym_proc_entry *subsym_proc; const math_proc_entry *math_proc; const char *hash_err; @@ -3034,7 +3010,7 @@ md_begin (void) tm->name, hash_err); } reg_hash = hash_new (); - for (sym = (symbol *) regs; sym->name; sym++) + for (sym = (tic54x_symbol *) regs; sym->name; sym++) { /* Add basic registers to the symbol table. */ symbolS *symbolP = symbol_new (sym->name, absolute_section, @@ -3043,26 +3019,26 @@ md_begin (void) symbol_table_insert (symbolP); hash_err = hash_insert (reg_hash, sym->name, (char *) sym); } - for (sym = (symbol *) mmregs; sym->name; sym++) + for (sym = (tic54x_symbol *) mmregs; sym->name; sym++) hash_err = hash_insert (reg_hash, sym->name, (char *) sym); mmreg_hash = hash_new (); - for (sym = (symbol *) mmregs; sym->name; sym++) + for (sym = (tic54x_symbol *) mmregs; sym->name; sym++) hash_err = hash_insert (mmreg_hash, sym->name, (char *) sym); cc_hash = hash_new (); - for (sym = (symbol *) condition_codes; sym->name; sym++) + for (sym = (tic54x_symbol *) condition_codes; sym->name; sym++) hash_err = hash_insert (cc_hash, sym->name, (char *) sym); cc2_hash = hash_new (); - for (sym = (symbol *) cc2_codes; sym->name; sym++) + for (sym = (tic54x_symbol *) cc2_codes; sym->name; sym++) hash_err = hash_insert (cc2_hash, sym->name, (char *) sym); cc3_hash = hash_new (); - for (sym = (symbol *) cc3_codes; sym->name; sym++) + for (sym = (tic54x_symbol *) cc3_codes; sym->name; sym++) hash_err = hash_insert (cc3_hash, sym->name, (char *) sym); sbit_hash = hash_new (); - for (sym = (symbol *) status_bits; sym->name; sym++) + for (sym = (tic54x_symbol *) status_bits; sym->name; sym++) hash_err = hash_insert (sbit_hash, sym->name, (char *) sym); misc_symbol_hash = hash_new (); @@ -3110,7 +3086,7 @@ get_operands (struct opstruct operands[], char *line) int expecting_operand = 0; int i; - while (numexp < MAX_OPERANDS && !is_end_of_line[(int) *lptr]) + while (numexp < MAX_OPERANDS && !is_end_of_line[(unsigned char) *lptr]) { int paren_not_balanced = 0; char *op_start, *op_end; @@ -3172,7 +3148,7 @@ get_operands (struct opstruct operands[], char *line) while (*lptr && ISSPACE (*lptr++)) ; - if (!is_end_of_line[(int) *lptr]) + if (!is_end_of_line[(unsigned char) *lptr]) { as_bad (_("Extra junk on line")); return -1; @@ -3673,7 +3649,7 @@ encode_integer (tic54x_insn *insn, static int encode_condition (tic54x_insn *insn, struct opstruct *operand) { - symbol *cc = (symbol *) hash_find (cc_hash, operand->buf); + tic54x_symbol *cc = (tic54x_symbol *) hash_find (cc_hash, operand->buf); if (!cc) { as_bad (_("Unrecognized condition code \"%s\""), operand->buf); @@ -3733,7 +3709,7 @@ encode_condition (tic54x_insn *insn, struct opstruct *operand) static int encode_cc3 (tic54x_insn *insn, struct opstruct *operand) { - symbol *cc3 = (symbol *) hash_find (cc3_hash, operand->buf); + tic54x_symbol *cc3 = (tic54x_symbol *) hash_find (cc3_hash, operand->buf); int value = cc3 ? cc3->value : operand->exp.X_add_number << 8; if ((value & 0x0300) != value) @@ -3762,7 +3738,7 @@ encode_arx (tic54x_insn *insn, struct opstruct *operand) static int encode_cc2 (tic54x_insn *insn, struct opstruct *operand) { - symbol *cc2 = (symbol *) hash_find (cc2_hash, operand->buf); + tic54x_symbol *cc2 = (tic54x_symbol *) hash_find (cc2_hash, operand->buf); if (!cc2) { @@ -3921,7 +3897,8 @@ encode_operand (tic54x_insn *insn, enum optype type, struct opstruct *operand) 0, 65535, 0xFFFF); case OP_SBIT: { - symbol *sbit = (symbol *) hash_find (sbit_hash, operand->buf); + tic54x_symbol *sbit = (tic54x_symbol *) + hash_find (sbit_hash, operand->buf); int value = is_absolute (operand) ? operand->exp.X_add_number : (sbit ? sbit->value : -1); int reg = 0; @@ -3935,7 +3912,7 @@ encode_operand (tic54x_insn *insn, enum optype type, struct opstruct *operand) } /* Guess the register based on the status bit; "ovb" is the last status bit defined for st0. */ - if (sbit > (symbol *) hash_find (sbit_hash, "ovb")) + if (sbit > (tic54x_symbol *) hash_find (sbit_hash, "ovb")) reg = 1; } if (value == -1) @@ -4000,12 +3977,12 @@ static void emit_insn (tic54x_insn *insn) { int i; - flagword oldflags = bfd_get_section_flags (stdoutput, now_seg); + flagword oldflags = bfd_section_flags (now_seg); flagword flags = oldflags | SEC_CODE; - if (! bfd_set_section_flags (stdoutput, now_seg, flags)) + if (!bfd_set_section_flags (now_seg, flags)) as_warn (_("error setting flags for \"%s\": %s"), - bfd_section_name (stdoutput, now_seg), + bfd_section_name (now_seg), bfd_errmsg (bfd_get_error ())); for (i = 0; i < insn->words; i++) @@ -4223,7 +4200,7 @@ static int next_line_shows_parallel (char *next_line) { /* Look for the second half. */ - while (ISSPACE (*next_line)) + while (*next_line != 0 && ISSPACE (*next_line)) ++next_line; return (next_line[0] == PARALLEL_SEPARATOR @@ -4300,7 +4277,7 @@ tic54x_parse_parallel_insn_lastline (tic54x_insn *insn, char *line) replacement on the value. */ static char * -subsym_get_arg (char *line, char *terminators, char **str, int nosub) +subsym_get_arg (char *line, const char *terminators, char **str, int nosub) { char *ptr = line; char *endp; @@ -4312,9 +4289,7 @@ subsym_get_arg (char *line, char *terminators, char **str, int nosub) while (ISDIGIT (*ptr)) ++ptr; endp = ptr; - *str = xmalloc (ptr - line + 1); - strncpy (*str, line, ptr - line); - (*str)[ptr - line] = 0; + *str = xmemdup0 (line, ptr - line); } else if (is_string) { @@ -4332,7 +4307,7 @@ subsym_get_arg (char *line, char *terminators, char **str, int nosub) } else { - char *term = terminators; + const char *term = terminators; char *value = NULL; while (*ptr && *ptr != *term) @@ -4346,9 +4321,7 @@ subsym_get_arg (char *line, char *terminators, char **str, int nosub) ++term; } endp = ptr; - *str = xmalloc (ptr - line + 1); - strncpy (*str, line, ptr - line); - (*str)[ptr - line] = 0; + *str = xmemdup0 (line, ptr - line); /* Do simple substitution, if available. */ if (!nosub && (value = subsym_lookup (*str, macro_level)) != NULL) *str = value; @@ -4421,8 +4394,7 @@ subsym_substitute (char *line, int forced) char *tmp; /* Work with a copy of the input line. */ - replacement = xmalloc (strlen (line) + 1); - strcpy (replacement, line); + replacement = xstrdup (line); ptr = head = replacement; @@ -4444,10 +4416,9 @@ subsym_substitute (char *line, int forced) if (strstr (line, ".macro")) return line; - while (!is_end_of_line[(int) *ptr]) + unsigned char current_char; + while (!is_end_of_line[(current_char = * (unsigned char *) ptr)]) { - int current_char = *ptr; - /* Need to update this since LINE may have been modified. */ if (eval_line) eval_end = strrchr (ptr, ','); @@ -4472,8 +4443,7 @@ subsym_substitute (char *line, int forced) continue; } *ptr++ = '\0'; - tmp = xmalloc (strlen (head) + 2 + strlen (ptr) + 1); - sprintf (tmp, "%s==%s", head, ptr); + tmp = concat (head, "==", ptr, (char *) NULL); /* Continue examining after the '=='. */ ptr = tmp + strlen (head) + 2; free (replacement); @@ -4500,8 +4470,8 @@ subsym_substitute (char *line, int forced) if (forced) ++ptr; - name = input_line_pointer = ptr; - c = get_symbol_end (); + input_line_pointer = ptr; + c = get_symbol_name (&name); /* '?' is not normally part of a symbol, but it IS part of a local label. */ if (c == '?') @@ -4532,7 +4502,7 @@ subsym_substitute (char *line, int forced) if (value == NULL) { char digit[11]; - char *namecopy = strcpy (xmalloc (strlen (name) + 1), name); + char *namecopy = xstrdup (name); value = strcpy (xmalloc (strlen (name) + sizeof (digit) + 1), name); @@ -4580,7 +4550,7 @@ subsym_substitute (char *line, int forced) farg2 = (float) strtod (ptr, &ptr); } fresult = (*math_entry->proc) (farg1, farg2); - value = xmalloc (128); + value = XNEWVEC (char, 128); if (math_entry->int_return) sprintf (value, "%d", (int) fresult); else @@ -4641,7 +4611,7 @@ subsym_substitute (char *line, int forced) break; } val = (*entry->proc) (arg1, arg2); - value = xmalloc (64); + value = XNEWVEC (char, 64); sprintf (value, "%d", val); } /* Fix things up to replace the entire expression, not just the @@ -4657,7 +4627,7 @@ subsym_substitute (char *line, int forced) substitutions are performed, or a substitution that has been previously made is encountered again. - put the symbol into the recursion hash table so we only + Put the symbol into the recursion hash table so we only try to replace a symbol once. */ if (recurse) { @@ -4677,8 +4647,7 @@ subsym_substitute (char *line, int forced) kinda indicates that forced substitution is not supposed to be recursive, but I'm not sure. */ unsigned beg, len = 1; /* default to a single char */ - char *newval = strcpy (xmalloc (strlen (value) + 1), - value); + char *newval = xstrdup (value); savedp = input_line_pointer; input_line_pointer = tail + 1; @@ -4695,7 +4664,7 @@ subsym_substitute (char *line, int forced) len = get_absolute_expression (); if (beg + len > strlen (value)) { - as_bad (_("Invalid length (use 0 to %d"), + as_bad (_("Invalid length (use 0 to %d)"), (int) strlen (value) - beg); break; } @@ -4769,12 +4738,11 @@ tic54x_start_line_hook (void) char *replacement = NULL; /* Work with a copy of the input line, including EOL char. */ - endp = input_line_pointer; - while (!is_end_of_line[(int) *endp++]) - ; - line = xmalloc (endp - input_line_pointer + 1); - strncpy (line, input_line_pointer, endp - input_line_pointer + 1); - line[endp - input_line_pointer] = 0; + for (endp = input_line_pointer; *endp != 0; ) + if (is_end_of_line[(unsigned char) *endp++]) + break; + + line = xmemdup0 (input_line_pointer, endp - input_line_pointer); /* Scan ahead for parallel insns. */ parallel_on_next_line_hint = next_line_shows_parallel (endp); @@ -4846,7 +4814,7 @@ md_assemble (char *line) int c; input_line_pointer = line; - c = get_symbol_end (); + c = get_symbol_name (&line); if (cpu == VNONE) cpu = V542; @@ -4879,8 +4847,11 @@ md_assemble (char *line) { if (words > delay_slots) { - as_bad (_("Instruction does not fit in available delay " - "slots (%d-word insn, %d slots left)"), + as_bad (ngettext ("Instruction does not fit in available " + "delay slots (%d-word insn, %d slot left)", + "Instruction does not fit in available " + "delay slots (%d-word insn, %d slots left)", + delay_slots), words, delay_slots); delay_slots = 0; return; @@ -4951,9 +4922,13 @@ md_assemble (char *line) { if (words > delay_slots) { - as_warn (_("Instruction does not fit in available delay " - "slots (%d-word insn, %d slots left). " - "Resulting behavior is undefined."), + as_warn (ngettext ("Instruction does not fit in available " + "delay slots (%d-word insn, %d slot left). " + "Resulting behavior is undefined.", + "Instruction does not fit in available " + "delay slots (%d-word insn, %d slots left). " + "Resulting behavior is undefined.", + delay_slots), words, delay_slots); delay_slots = 0; return; @@ -5006,9 +4981,8 @@ tic54x_adjust_symtab (void) if (symbol_rootP == NULL || S_GET_STORAGE_CLASS (symbol_rootP) != C_FILE) { - char *filename; unsigned lineno; - as_where (&filename, &lineno); + const char * filename = as_where (&lineno); c_dot_file_symbol (filename, 0); } } @@ -5045,22 +5019,22 @@ tic54x_define_label (symbolS *sym) symbolS * tic54x_undefined_symbol (char *name) { - symbol *sym; + tic54x_symbol *sym; /* Not sure how to handle predefined symbols. */ - if ((sym = (symbol *) hash_find (cc_hash, name)) != NULL || - (sym = (symbol *) hash_find (cc2_hash, name)) != NULL || - (sym = (symbol *) hash_find (cc3_hash, name)) != NULL || - (sym = (symbol *) hash_find (misc_symbol_hash, name)) != NULL || - (sym = (symbol *) hash_find (sbit_hash, name)) != NULL) + if ((sym = (tic54x_symbol *) hash_find (cc_hash, name)) != NULL || + (sym = (tic54x_symbol *) hash_find (cc2_hash, name)) != NULL || + (sym = (tic54x_symbol *) hash_find (cc3_hash, name)) != NULL || + (sym = (tic54x_symbol *) hash_find (misc_symbol_hash, name)) != NULL || + (sym = (tic54x_symbol *) hash_find (sbit_hash, name)) != NULL) { return symbol_new (name, reg_section, (valueT) sym->value, &zero_address_frag); } - if ((sym = (symbol *) hash_find (reg_hash, name)) != NULL || - (sym = (symbol *) hash_find (mmreg_hash, name)) != NULL || + if ((sym = (tic54x_symbol *) hash_find (reg_hash, name)) != NULL || + (sym = (tic54x_symbol *) hash_find (mmreg_hash, name)) != NULL || !strcasecmp (name, "a") || !strcasecmp (name, "b")) { return symbol_new (name, reg_section, @@ -5081,7 +5055,7 @@ tic54x_parse_name (char *name ATTRIBUTE_UNUSED, return 0; } -char * +const char * md_atof (int type, char *literalP, int *sizeP) { /* Target data is little-endian, but floats are stored @@ -5096,8 +5070,8 @@ tc_gen_reloc (asection *section, fixS *fixP) bfd_reloc_code_real_type code = fixP->fx_r_type; asymbol *sym = symbol_get_bfdsym (fixP->fx_addsy); - rel = (arelent *) xmalloc (sizeof (arelent)); - rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); + rel = XNEW (arelent); + rel->sym_ptr_ptr = XNEW (asymbol *); *rel->sym_ptr_ptr = sym; /* We assume that all rel->address are host byte offsets. */ rel->address = fixP->fx_frag->fr_address + fixP->fx_where; @@ -5361,48 +5335,43 @@ tic54x_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, syntax puts the symbol *before* the pseudo (which is kinda like MRI syntax, I guess, except I've never seen a definition of MRI syntax). - C is the character that used to be at *REST, which points to the end of the - label. - Don't allow labels to start with '.' */ int -tic54x_start_label (int c, char *rest) +tic54x_start_label (char * label_start, int nul_char, int next_char) { + char *rest; + /* If within .struct/.union, no auto line labels, please. */ if (current_stag != NULL) return 0; /* Disallow labels starting with "." */ - if (c != ':') + if (next_char != ':') { - char *label = rest; - - while (!is_end_of_line[(int) label[-1]]) - --label; - if (*label == '.') + if (*label_start == '.') { - as_bad (_("Invalid label '%s'"), label); + as_bad (_("Invalid label '%s'"), label_start); return 0; } } - if (is_end_of_line[(int) c]) + if (is_end_of_line[(unsigned char) next_char]) return 1; - if (ISSPACE (c)) - while (ISSPACE (c = *++rest)) - ; - if (c == '.') - { - /* Don't let colon () define a label for any of these... */ - return (strncasecmp (rest, ".tag", 4) != 0 || !ISSPACE (rest[4])) - && (strncasecmp (rest, ".struct", 7) != 0 || !ISSPACE (rest[7])) - && (strncasecmp (rest, ".union", 6) != 0 || !ISSPACE (rest[6])) - && (strncasecmp (rest, ".macro", 6) != 0 || !ISSPACE (rest[6])) - && (strncasecmp (rest, ".set", 4) != 0 || !ISSPACE (rest[4])) - && (strncasecmp (rest, ".equ", 4) != 0 || !ISSPACE (rest[4])); - } + rest = input_line_pointer; + if (nul_char == '"') + ++rest; + while (ISSPACE (next_char)) + next_char = *++rest; + if (next_char != '.') + return 1; - return 1; + /* Don't let colon () define a label for any of these... */ + return ((strncasecmp (rest, ".tag", 4) != 0 || !ISSPACE (rest[4])) + && (strncasecmp (rest, ".struct", 7) != 0 || !ISSPACE (rest[7])) + && (strncasecmp (rest, ".union", 6) != 0 || !ISSPACE (rest[6])) + && (strncasecmp (rest, ".macro", 6) != 0 || !ISSPACE (rest[6])) + && (strncasecmp (rest, ".set", 4) != 0 || !ISSPACE (rest[4])) + && (strncasecmp (rest, ".equ", 4) != 0 || !ISSPACE (rest[4]))); }