/* tc-tic4x.c -- Assemble for the Texas Instruments TMS320C[34]x.
- Copyright (C) 1997,1998, 2002, 2003, 2005, 2006, 2007, 2008, 2009
- Free Software Foundation. Inc.
+ Copyright (C) 1997-2015 Free Software Foundation, Inc.
Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz)
o .align cannot handle fill-data-width larger than 0xFF/8-bits. It
should be possible to define a 32-bits pattern.
- o .align fills all section with NOP's when used regardless if has
- been used in .text or .data. (However the .align is primarily
- intended used in .text sections. If you require something else,
- use .align <size>,0x00)
-
o .align: Implement a 'bu' insn if the number of nop's exceeds 4
within the align frag. if(fragsize>4words) insert bu fragend+1
first.
o Evaluation of constant floating point expressions (expr.c needs
work!)
- o Support 'abc' constants (that is 0x616263)
-*/
+ o Support 'abc' constants (that is 0x616263). */
-#include "safe-ctype.h"
#include "as.h"
+#include "safe-ctype.h"
#include "opcode/tic4x.h"
#include "subsegs.h"
-#include "obstack.h"
/* OK, we accept a syntax similar to the other well known C30
assembly tools. With TIC4X_ALT_SYNTAX defined we are more
#define OPTION_ENHANCED (OPTION_MD_BASE + 7)
#define OPTION_REV (OPTION_MD_BASE + 8)
-CONST char *md_shortopts = "bm:prs";
+const char *md_shortopts = "bm:prs";
struct option md_longopts[] =
{
{ "mcpu", required_argument, NULL, OPTION_CPU },
static void
tic4x_cons (int bytes)
{
- register unsigned int c;
+ unsigned int c;
do
{
SKIP_WHITESPACE ();
tic4x_stringer (int append_zero)
{
int bytes;
- register unsigned int c;
+ unsigned int c;
bytes = 0;
do
}
name = input_line_pointer;
c = get_symbol_end (); /* Get terminator. */
- demand_empty_rest_of_line ();
tic4x_insert_sym (name, value);
+ *input_line_pointer++ = c;
+ demand_empty_rest_of_line ();
}
/* Reset local labels. */
{
char c;
char *section_name;
- char *subsection_name;
char *name;
segT seg;
offsetT num;
Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>. */
if (c == ':')
{
- subsection_name = input_line_pointer;
c = get_symbol_end (); /* Get terminator. */
input_line_pointer++; /* Skip null symbol terminator. */
as_warn (_(".sect: subsection name ignored"));
char *s;
int i;
int parsed = 0;
+ size_t len;
tic4x_inst_t *inst; /* Instruction template. */
tic4x_inst_t *first_inst;
s++;
if (*s) /* Null terminate for hash_find. */
*s++ = '\0'; /* and skip past null. */
- strcat (insn->name, "_");
- strncat (insn->name, str, TIC4X_NAME_MAX - strlen (insn->name));
+ len = strlen (insn->name);
+ snprintf (insn->name + len, TIC4X_NAME_MAX - len, "_%s", str);
insn->operands[insn->num_operands++].mode = M_PARALLEL;
s++;
if (*s) /* Null terminate for hash_find. */
*s++ = '\0'; /* and skip past null. */
- strncpy (insn->name, str, TIC4X_NAME_MAX - 3);
+ strncpy (insn->name, str, TIC4X_NAME_MAX - 1);
+ insn->name[TIC4X_NAME_MAX - 1] = '\0';
if ((i = tic4x_operands_parse (s, insn->operands, 0)) < 0)
{
/* Fill the alignment area with NOP's on .text, unless fill-data
was specified. */
int
-tic4x_do_align (int alignment ATTRIBUTE_UNUSED,
- const char *fill ATTRIBUTE_UNUSED,
- int len ATTRIBUTE_UNUSED,
- int max ATTRIBUTE_UNUSED)
+tic4x_do_align (int alignment,
+ const char *fill,
+ int len,
+ int max)
{
- unsigned long nop = TIC_NOP_OPCODE;
-
/* Because we are talking lwords, not bytes, adjust alignment to do words */
alignment += 2;
{
if (fill == NULL)
{
- /*if (subseg_text_p (now_seg))*/ /* FIXME: doesn't work for .text for some reason */
- frag_align_pattern( alignment, (const char *)&nop, sizeof(nop), max);
- return 1;
- /*else
- frag_align (alignment, 0, max);*/
+ if (subseg_text_p (now_seg))
+ {
+ char nop[4];
+
+ md_number_to_chars (nop, TIC_NOP_OPCODE, 4);
+ frag_align_pattern (alignment, nop, sizeof (nop), max);
+ }
+ else
+ frag_align (alignment, 0, max);
}
else if (len <= 1)
frag_align (alignment, *fill, max);