Add support for ARM assembler produced by CodeCompositor Studio.

* 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.
This commit is contained in:
Daniel Gutson
2014-03-19 14:31:25 +00:00
committed by Nick Clifton
parent e57190430e
commit 2e6976a881
12 changed files with 289 additions and 4 deletions

View File

@ -1,3 +1,34 @@
2014-03-19 Daniel Gutson <daniel.gutson@tallertechnologies.com>`
Nick Clifton <nickc@redhat.com>
* 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 <jiong.wang@arm.com> 2014-03-18 Jiong Wang <jiong.wang@arm.com>
* config/tc-aarch64.c (aarch64_opts): Add new option * config/tc-aarch64.c (aarch64_opts): Add new option

View File

@ -1,5 +1,8 @@
-*- text -*- -*- 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. * Add support for the Andes NDS32.
Changes in 2.24: Changes in 2.24:

View File

@ -158,7 +158,10 @@ do_scrub_begin (int m68k_mri ATTRIBUTE_UNUSED)
for (p = line_comment_chars; *p; p++) for (p = line_comment_chars; *p; p++)
lex[(unsigned char) *p] = LEX_IS_LINE_COMMENT_START; 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; lex[(unsigned char) *p] = LEX_IS_LINE_SEPARATOR;
#ifdef tc_parallel_separator_chars #ifdef tc_parallel_separator_chars

View File

@ -137,6 +137,8 @@ static int fix_v4bx = FALSE;
/* Warn on using deprecated features. */ /* Warn on using deprecated features. */
static int warn_on_deprecated = TRUE; 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 /* Variables that we set while parsing command-line options. Once all
options have been read we re-process these values to set the real options have been read we re-process these values to set the real
@ -795,6 +797,15 @@ typedef struct literal_pool
/* Pointer to a linked list of literal pools. */ /* Pointer to a linked list of literal pools. */
literal_pool * list_of_pools = NULL; 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 #ifdef OBJ_ELF
# define now_it seg_info (now_seg)->tc_segment_info_data.current_it # define now_it seg_info (now_seg)->tc_segment_info_data.current_it
#else #else
@ -853,7 +864,7 @@ static void it_fsm_post_encode (void);
/* This array holds the chars that always start a comment. If the /* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful. */ 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 /* 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' a line. If the line seems to have the form '# 123 filename'
@ -864,7 +875,7 @@ const char comment_chars[] = "@";
/* Also note that comments like this one will always work. */ /* Also note that comments like this one will always work. */
const char line_comment_chars[] = "#"; const char line_comment_chars[] = "#";
const char line_separator_chars[] = ";"; char arm_line_separator_chars[] = ";";
/* Chars that can be used to separate mant /* Chars that can be used to separate mant
from exp in floating point numbers. */ from exp in floating point numbers. */
@ -3012,6 +3023,104 @@ s_even (int ignore ATTRIBUTE_UNUSED)
demand_empty_rest_of_line (); 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. */ /* Directives: Literal pools. */
static literal_pool * static literal_pool *
@ -3128,6 +3237,32 @@ add_to_lit_pool (void)
return SUCCESS; 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 /* 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. */ a later date assign it a value. Thats what these functions do. */
@ -4486,6 +4621,13 @@ const pseudo_typeS md_pseudo_table[] =
#ifdef TE_PE #ifdef TE_PE
{"secrel32", pe_directive_secrel, 0}, {"secrel32", pe_directive_secrel, 0},
#endif #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 } { 0, 0, 0 }
}; };
@ -24523,6 +24665,15 @@ arm_parse_it_mode (char * str)
return ret; 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[] = struct arm_long_option_table arm_long_opts[] =
{ {
{"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"), {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
@ -24539,6 +24690,8 @@ struct arm_long_option_table arm_long_opts[] =
#endif #endif
{"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"), {"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"),
arm_parse_it_mode, NULL}, arm_parse_it_mode, NULL},
{"mccs", N_("\t\t\t TI CodeComposer Studio syntax compatibility mode"),
arm_ccs_mode, NULL},
{NULL, NULL, 0, NULL} {NULL, NULL, 0, NULL}
}; };

View File

@ -81,6 +81,10 @@ struct fix;
/* We support double slash line-comments for compatibility with the ARM AArch64 Assembler. */ /* We support double slash line-comments for compatibility with the ARM AArch64 Assembler. */
#define DOUBLESLASH_LINE_COMMENTS #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 #define tc_symbol_chars arm_symbol_chars
extern const char arm_symbol_chars[]; extern const char arm_symbol_chars[];
@ -100,6 +104,9 @@ extern int arm_optimize_expr (expressionS *, operatorT, expressionS *);
#define md_start_line_hook() arm_start_line_hook () #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) #define tc_frob_label(S) arm_frob_label (S)
/* We also need to mark assembler created symbols: */ /* We also need to mark assembler created symbols: */
@ -363,3 +370,9 @@ void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
extern int arm_convert_symbolic_attribute (const char *); extern int arm_convert_symbolic_attribute (const char *);
extern int arm_apply_sym_value (struct fix *); extern int arm_apply_sym_value (struct fix *);
#endif #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[];

View File

@ -848,6 +848,8 @@ Select either big-endian (-EB) or little-endian (-EL) output.
@item -mthumb-interwork @item -mthumb-interwork
Specify that the code has been generated with interworking between Thumb and Specify that the code has been generated with interworking between Thumb and
ARM code in mind. ARM code in mind.
@item -mccs
Turns on CodeComposer Studio assembly syntax compatibility mode.
@item -k @item -k
Specify that PIC code has been generated. Specify that PIC code has been generated.
@end table @end table

View File

@ -369,6 +369,10 @@ the linker option of the same name.
Enable or disable warnings about using deprecated options or Enable or disable warnings about using deprecated options or
features. The default is to warn. 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 @end table

View File

@ -884,6 +884,8 @@ comment.
@item tc_comment_chars @item tc_comment_chars
@cindex tc_comment_chars @cindex tc_comment_chars
If this macro is defined, GAS will use it instead of @code{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 @item tc_symbol_chars
@cindex tc_symbol_chars @cindex tc_symbol_chars
@ -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 if found in a comment, such as after a character in line_comment_chars or
comment_chars. 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 @item EXP_CHARS
@cindex EXP_CHARS @cindex EXP_CHARS
This is a null terminated @code{const char} array of characters which may be This is a null terminated @code{const char} array of characters which may be

View File

@ -263,8 +263,11 @@ read_begin (void)
obstack_begin (&notes, chunksize); obstack_begin (&notes, chunksize);
obstack_begin (&cond_obstack, chunksize); obstack_begin (&cond_obstack, chunksize);
#ifndef tc_line_separator_chars
#define tc_line_separator_chars line_separator_chars
#endif
/* Use machine dependent syntax. */ /* 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; is_end_of_line[(unsigned char) *p] = 2;
/* Use more. FIXME-SOMEDAY. */ /* Use more. FIXME-SOMEDAY. */

View File

@ -1,3 +1,9 @@
2014-03-19 Daniel Gutson <daniel.gutson@tallertechnologies.com>`
Nick Clifton <nickc@redhat.com>
* gas/arm/ccs.s: New test case.
* gas/arm/ccs.d: New expected disassembly.
2014-03-19 Nick Clifton <nickc@redhat.com> 2014-03-19 Nick Clifton <nickc@redhat.com>
* gas/rx/mov.d: Update expected disassembly. * gas/rx/mov.d: Update expected disassembly.

View File

@ -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 .*
#...

View File

@ -0,0 +1,33 @@
;-------------------------------------------------------------------------------
; Comments here
.text
.arm
;-------------------------------------------------------------------------------
.ref ext_sym
.def _test_func
.asmfunc
_test_func
stmfd r13!, {r0 - r12, lr}; push registers and link register on to stack
ldr r12, sym1 ; another comment
ldr r0, [r12]
tst r0, #0x8
bne aLabel
ldr r0, [r12]
aLabel
bl ext_sym ; custom data abort handler required
ldmfd r13!, {r0 - r12, lr}; pop registers and link register from stack
subs pc, lr, #8
sym1 .word 0xFFFFF520
.endasmfunc