Skip to content

Commit

Permalink
Add support for ARM assembler produced by CodeCompositor Studio.
Browse files Browse the repository at this point in the history
	* config/tc-arm.c (codecomposer_syntax): New flag that states whether the
	CCS syntax compatibility mode is on or off.
	(asmfunc_states): New enum to represent the asmfunc directive state.
	(asmfunc_state): New variable holding the asmfunc directive state.
	(comment_chars): Rename to arm_comment_chars.
	(line_separator_chars): Rename to arm_line_separator_chars.
	(s_ccs_ref): New function that handles the .ref directive.
	(asmfunc_debug): New function.
	(s_ccs_asmfunc): New function that handles the .asmfunc directive.
	(s_ccs_endasmfunc): New function that handles the .endasmfunc directive.
	(s_ccs_def): New function that handles the .def directive.
	(tc_start_label_without_colon): New function.
	(md_pseudo_table): Added new CCS directives.
	(arm_ccs_mode): New function that handles the -mccs command line option.
	(arm_long_opts): Added new -mccs command line option.
	* config/tc-arm.h (LABELS_WITHOUT_COLONS): New macro.
	(TC_START_LABEL_WITHOUT_COLON): New macro.
	(tc_start_label_without_colon): Added extern function declaration.
	(tc_comment_chars): Define.
	(tc_line_separator_chars): Define.
	* app.c (do_scrub_begin): Use tc_line_separator_chars, if defined.
	* read.c (read_begin): Likewise.
	* doc/as.texinfo: Add documentation for the -mccs command line
	option.
	* doc/c-arm.texi: Likewise.
	* doc/internals.texi: Document tc_line_separator_chars.
	* NEWS: Mention the new feature.

	* gas/arm/ccs.s: New test case.
	* gas/arm/ccs.d: New expected disassembly.
  • Loading branch information
Daniel Gutson authored and nickclifton committed Mar 19, 2014
1 parent e571904 commit 2e6976a
Show file tree
Hide file tree
Showing 12 changed files with 289 additions and 4 deletions.
31 changes: 31 additions & 0 deletions gas/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,34 @@
2014-03-19 Daniel Gutson <[email protected]>`
Nick Clifton <[email protected]>

* config/tc-arm.c (codecomposer_syntax): New flag that states whether the
CCS syntax compatibility mode is on or off.
(asmfunc_states): New enum to represent the asmfunc directive state.
(asmfunc_state): New variable holding the asmfunc directive state.
(comment_chars): Rename to arm_comment_chars.
(line_separator_chars): Rename to arm_line_separator_chars.
(s_ccs_ref): New function that handles the .ref directive.
(asmfunc_debug): New function.
(s_ccs_asmfunc): New function that handles the .asmfunc directive.
(s_ccs_endasmfunc): New function that handles the .endasmfunc directive.
(s_ccs_def): New function that handles the .def directive.
(tc_start_label_without_colon): New function.
(md_pseudo_table): Added new CCS directives.
(arm_ccs_mode): New function that handles the -mccs command line option.
(arm_long_opts): Added new -mccs command line option.
* config/tc-arm.h (LABELS_WITHOUT_COLONS): New macro.
(TC_START_LABEL_WITHOUT_COLON): New macro.
(tc_start_label_without_colon): Added extern function declaration.
(tc_comment_chars): Define.
(tc_line_separator_chars): Define.
* app.c (do_scrub_begin): Use tc_line_separator_chars, if defined.
* read.c (read_begin): Likewise.
* doc/as.texinfo: Add documentation for the -mccs command line
option.
* doc/c-arm.texi: Likewise.
* doc/internals.texi: Document tc_line_separator_chars.
* NEWS: Mention the new feature.

2014-03-18 Jiong Wang <[email protected]>

* config/tc-aarch64.c (aarch64_opts): Add new option
Expand Down
3 changes: 3 additions & 0 deletions gas/NEWS
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
-*- text -*-

* Enhanced the ARM port to accept the assembler output from the CodeComposer
Studio tool. Support is enabled via the new command line option -mccs.

* Add support for the Andes NDS32.

Changes in 2.24:
Expand Down
5 changes: 4 additions & 1 deletion gas/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,10 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
for (p = line_comment_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START;

for (p = line_separator_chars; *p; p++)
#ifndef tc_line_separator_chars
#define tc_line_separator_chars line_separator_chars
#endif
for (p = tc_line_separator_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;

#ifdef tc_parallel_separator_chars
Expand Down
157 changes: 155 additions & 2 deletions gas/config/tc-arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ static int fix_v4bx = FALSE;
/* Warn on using deprecated features. */
static int warn_on_deprecated = TRUE;

/* Understand CodeComposer Studio assembly syntax. */
bfd_boolean codecomposer_syntax = FALSE;

/* Variables that we set while parsing command-line options. Once all
options have been read we re-process these values to set the real
Expand Down Expand Up @@ -795,6 +797,15 @@ typedef struct literal_pool
/* Pointer to a linked list of literal pools. */
literal_pool * list_of_pools = NULL;

typedef enum asmfunc_states
{
OUTSIDE_ASMFUNC,
WAITING_ASMFUNC_NAME,
WAITING_ENDASMFUNC
} asmfunc_states;

static asmfunc_states asmfunc_state = OUTSIDE_ASMFUNC;

#ifdef OBJ_ELF
# define now_it seg_info (now_seg)->tc_segment_info_data.current_it
#else
Expand Down Expand Up @@ -853,7 +864,7 @@ static void it_fsm_post_encode (void);

/* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful. */
const char comment_chars[] = "@";
char arm_comment_chars[] = "@";

/* This array holds the chars that only start a comment at the beginning of
a line. If the line seems to have the form '# 123 filename'
Expand All @@ -864,7 +875,7 @@ const char comment_chars[] = "@";
/* Also note that comments like this one will always work. */
const char line_comment_chars[] = "#";

const char line_separator_chars[] = ";";
char arm_line_separator_chars[] = ";";

/* Chars that can be used to separate mant
from exp in floating point numbers. */
Expand Down Expand Up @@ -3012,6 +3023,104 @@ s_even (int ignore ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
}

/* Directives: CodeComposer Studio. */

/* .ref (for CodeComposer Studio syntax only). */
static void
s_ccs_ref (int unused ATTRIBUTE_UNUSED)
{
if (codecomposer_syntax)
ignore_rest_of_line ();
else
as_bad (_(".ref pseudo-op only available with -mccs flag."));
}

/* If name is not NULL, then it is used for marking the beginning of a
function, wherease if it is NULL then it means the function end. */
static void
asmfunc_debug (const char * name)
{
static const char * last_name = NULL;

if (name != NULL)
{
gas_assert (last_name == NULL);
last_name = name;

if (debug_type == DEBUG_STABS)
stabs_generate_asm_func (name, name);
}
else
{
gas_assert (last_name != NULL);

if (debug_type == DEBUG_STABS)
stabs_generate_asm_endfunc (last_name, last_name);

last_name = NULL;
}
}

static void
s_ccs_asmfunc (int unused ATTRIBUTE_UNUSED)
{
if (codecomposer_syntax)
{
switch (asmfunc_state)
{
case OUTSIDE_ASMFUNC:
asmfunc_state = WAITING_ASMFUNC_NAME;
break;

case WAITING_ASMFUNC_NAME:
as_bad (_(".asmfunc repeated."));
break;

case WAITING_ENDASMFUNC:
as_bad (_(".asmfunc without function."));
break;
}
demand_empty_rest_of_line ();
}
else
as_bad (_(".asmfunc pseudo-op only available with -mccs flag."));
}

static void
s_ccs_endasmfunc (int unused ATTRIBUTE_UNUSED)
{
if (codecomposer_syntax)
{
switch (asmfunc_state)
{
case OUTSIDE_ASMFUNC:
as_bad (_(".endasmfunc without a .asmfunc."));
break;

case WAITING_ASMFUNC_NAME:
as_bad (_(".endasmfunc without function."));
break;

case WAITING_ENDASMFUNC:
asmfunc_state = OUTSIDE_ASMFUNC;
asmfunc_debug (NULL);
break;
}
demand_empty_rest_of_line ();
}
else
as_bad (_(".endasmfunc pseudo-op only available with -mccs flag."));
}

static void
s_ccs_def (int name)
{
if (codecomposer_syntax)
s_globl (name);
else
as_bad (_(".def pseudo-op only available with -mccs flag."));
}

/* Directives: Literal pools. */

static literal_pool *
Expand Down Expand Up @@ -3128,6 +3237,32 @@ add_to_lit_pool (void)
return SUCCESS;
}

bfd_boolean
tc_start_label_without_colon (char unused1 ATTRIBUTE_UNUSED, const char * rest)
{
bfd_boolean ret = TRUE;

if (codecomposer_syntax && asmfunc_state == WAITING_ASMFUNC_NAME)
{
const char *label = rest;

while (!is_end_of_line[(int) label[-1]])
--label;

if (*label == '.')
{
as_bad (_("Invalid label '%s'"), label);
ret = FALSE;
}

asmfunc_debug (label);

asmfunc_state = WAITING_ENDASMFUNC;
}

return ret;
}

/* Can't use symbol_new here, so have to create a symbol and then at
a later date assign it a value. Thats what these functions do. */

Expand Down Expand Up @@ -4486,6 +4621,13 @@ const pseudo_typeS md_pseudo_table[] =
#ifdef TE_PE
{"secrel32", pe_directive_secrel, 0},
#endif

/* These are for compatibility with CodeComposer Studio. */
{"ref", s_ccs_ref, 0},
{"def", s_ccs_def, 0},
{"asmfunc", s_ccs_asmfunc, 0},
{"endasmfunc", s_ccs_endasmfunc, 0},

{ 0, 0, 0 }
};

Expand Down Expand Up @@ -24523,6 +24665,15 @@ arm_parse_it_mode (char * str)
return ret;
}

static bfd_boolean
arm_ccs_mode (char * unused ATTRIBUTE_UNUSED)
{
codecomposer_syntax = TRUE;
arm_comment_chars[0] = ';';
arm_line_separator_chars[0] = 0;
return TRUE;
}

struct arm_long_option_table arm_long_opts[] =
{
{"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
Expand All @@ -24539,6 +24690,8 @@ struct arm_long_option_table arm_long_opts[] =
#endif
{"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"),
arm_parse_it_mode, NULL},
{"mccs", N_("\t\t\t TI CodeComposer Studio syntax compatibility mode"),
arm_ccs_mode, NULL},
{NULL, NULL, 0, NULL}
};

Expand Down
13 changes: 13 additions & 0 deletions gas/config/tc-arm.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ struct fix;
/* We support double slash line-comments for compatibility with the ARM AArch64 Assembler. */
#define DOUBLESLASH_LINE_COMMENTS

/* We conditionally support labels without a colon. */
#define LABELS_WITHOUT_COLONS codecomposer_syntax
extern bfd_boolean codecomposer_syntax;

#define tc_symbol_chars arm_symbol_chars
extern const char arm_symbol_chars[];

Expand All @@ -100,6 +104,9 @@ extern int arm_optimize_expr (expressionS *, operatorT, expressionS *);

#define md_start_line_hook() arm_start_line_hook ()

#define TC_START_LABEL_WITHOUT_COLON(c, l) tc_start_label_without_colon (c, l)
extern bfd_boolean tc_start_label_without_colon (char, const char *);

#define tc_frob_label(S) arm_frob_label (S)

/* We also need to mark assembler created symbols: */
Expand Down Expand Up @@ -363,3 +370,9 @@ void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
extern int arm_convert_symbolic_attribute (const char *);
extern int arm_apply_sym_value (struct fix *);
#endif

#define tc_comment_chars arm_comment_chars
extern char arm_comment_chars[];

#define tc_line_separator_chars arm_line_separator_chars
extern char arm_line_separator_chars[];
2 changes: 2 additions & 0 deletions gas/doc/as.texinfo
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,8 @@ Select either big-endian (-EB) or little-endian (-EL) output.
@item -mthumb-interwork
Specify that the code has been generated with interworking between Thumb and
ARM code in mind.
@item -mccs
Turns on CodeComposer Studio assembly syntax compatibility mode.
@item -k
Specify that PIC code has been generated.
@end table
Expand Down
4 changes: 4 additions & 0 deletions gas/doc/c-arm.texi
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,10 @@ the linker option of the same name.
Enable or disable warnings about using deprecated options or
features. The default is to warn.

@cindex @code{-mccs} command line option, ARM
@item -mccs
Turns on CodeComposer Studio assembly syntax compatibility mode.

@end table


Expand Down
9 changes: 9 additions & 0 deletions gas/doc/internals.texi
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,8 @@ comment.
@item tc_comment_chars
@cindex tc_comment_chars
If this macro is defined, GAS will use it instead of @code{comment_chars}.
This has the advantage that this macro does not have to refer to a constant
array.

@item tc_symbol_chars
@cindex tc_symbol_chars
Expand All @@ -908,6 +910,13 @@ listed in this array). Note that line_separator_chars do not separate lines
if found in a comment, such as after a character in line_comment_chars or
comment_chars.

@item tc_line_separator_chars
@cindex tc_line_separator_chars
If this macro is defined, GAS will use it instead of
@code{line_separator_chars}. This has the advantage that this macro does not
have to refer to a constant array.


@item EXP_CHARS
@cindex EXP_CHARS
This is a null terminated @code{const char} array of characters which may be
Expand Down
5 changes: 4 additions & 1 deletion gas/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,8 +263,11 @@ read_begin (void)
obstack_begin (&notes, chunksize);
obstack_begin (&cond_obstack, chunksize);

#ifndef tc_line_separator_chars
#define tc_line_separator_chars line_separator_chars
#endif
/* Use machine dependent syntax. */
for (p = line_separator_chars; *p; p++)
for (p = tc_line_separator_chars; *p; p++)
is_end_of_line[(unsigned char) *p] = 2;
/* Use more. FIXME-SOMEDAY. */

Expand Down
6 changes: 6 additions & 0 deletions gas/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2014-03-19 Daniel Gutson <[email protected]>`
Nick Clifton <[email protected]>

* gas/arm/ccs.s: New test case.
* gas/arm/ccs.d: New expected disassembly.

2014-03-19 Nick Clifton <[email protected]>

* gas/rx/mov.d: Update expected disassembly.
Expand Down
25 changes: 25 additions & 0 deletions gas/testsuite/gas/arm/ccs.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#objdump: -dr
# as: -mccs -mcpu=cortex-r4 -mthumb

.*: file format .*arm.*


Disassembly of section \.text:

00000000 <_test_func>:
0: e92d5fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
4: e59fc018 ldr ip, \[pc, #24\] ; 24 <sym1>
8: e59c0000 ldr r0, \[ip\]
c: e3100008 tst r0, #8
10: 1a000000 bne 18 <aLabel>
14: e59c0000 ldr r0, \[ip\]

00000018 <aLabel>:
18: eb...... bl . <ext_sy.*>
18: .* ext_sy.*
1c: e8bd5fff pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
20: e25ef008 subs pc, lr, #8

00000024 <sym1>:
24: fffff520 .*
#...
Loading

0 comments on commit 2e6976a

Please sign in to comment.