Patches for eCos: Dump literal pool on section change. Mark thumb function
aliases as being thumb functions as well.
This commit is contained in:
parent
aec89efbf6
commit
fed881b14b
|
@ -1,3 +1,23 @@
|
||||||
|
1999-06-16 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
* config/tc-arm.c (thumb_set): New pseudo op.
|
||||||
|
(text, data, section): Override these pseudo ops with ARM
|
||||||
|
specific versions.
|
||||||
|
(s_thumb_set): New function: Perform the same as a .set pseudo
|
||||||
|
op, but also mark the alias'ed symbol as being a Thumb
|
||||||
|
function.
|
||||||
|
(arm_s_text): New function: Perform the same as the .text
|
||||||
|
pseudo op, but dump the literal pool before changing
|
||||||
|
sections.
|
||||||
|
(arm_s_data): New function: Perform the same as the .data
|
||||||
|
pseudo op, but dump the literal pool before changing
|
||||||
|
sections.
|
||||||
|
(arm_s_section): New function: Perform the same as the
|
||||||
|
.section pseudo op, but dump the literal pool before changing
|
||||||
|
sections.
|
||||||
|
(arm_cleanup): Do not reset the current section before dumping
|
||||||
|
the literal pool.
|
||||||
|
|
||||||
1999-06-17 Nick Clifton <nickc@cygnus.com>
|
1999-06-17 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
* config/tc-m32r.c (md_longopts): Fix OPTION_WARN_UNMATCHED and
|
* config/tc-m32r.c (md_longopts): Fix OPTION_WARN_UNMATCHED and
|
||||||
|
|
|
@ -897,7 +897,11 @@ static void s_thumb PARAMS ((int));
|
||||||
static void s_code PARAMS ((int));
|
static void s_code PARAMS ((int));
|
||||||
static void s_force_thumb PARAMS ((int));
|
static void s_force_thumb PARAMS ((int));
|
||||||
static void s_thumb_func PARAMS ((int));
|
static void s_thumb_func PARAMS ((int));
|
||||||
|
static void s_thumb_set PARAMS ((int));
|
||||||
|
static void arm_s_text PARAMS ((int));
|
||||||
|
static void arm_s_data PARAMS ((int));
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
|
static void arm_s_section PARAMS ((int));
|
||||||
static void s_arm_elf_cons PARAMS ((int));
|
static void s_arm_elf_cons PARAMS ((int));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -905,27 +909,35 @@ static int my_get_expression PARAMS ((expressionS *, char **));
|
||||||
|
|
||||||
CONST pseudo_typeS md_pseudo_table[] =
|
CONST pseudo_typeS md_pseudo_table[] =
|
||||||
{
|
{
|
||||||
{"req", s_req, 0}, /* Never called becasue '.req' does not start line */
|
{ "req", s_req, 0 }, /* Never called becasue '.req' does not start line */
|
||||||
{"bss", s_bss, 0},
|
{ "bss", s_bss, 0 },
|
||||||
{"align", s_align, 0},
|
{ "align", s_align, 0 },
|
||||||
{"arm", s_arm, 0},
|
{ "arm", s_arm, 0 },
|
||||||
{"thumb", s_thumb, 0},
|
{ "thumb", s_thumb, 0 },
|
||||||
{"code", s_code, 0},
|
{ "code", s_code, 0 },
|
||||||
{"force_thumb", s_force_thumb, 0},
|
{ "force_thumb", s_force_thumb, 0 },
|
||||||
{"thumb_func", s_thumb_func, 0},
|
{ "thumb_func", s_thumb_func, 0 },
|
||||||
{"even", s_even, 0},
|
{ "thumb_set", s_thumb_set, 0 },
|
||||||
{"ltorg", s_ltorg, 0},
|
{ "even", s_even, 0 },
|
||||||
{"pool", s_ltorg, 0},
|
{ "ltorg", s_ltorg, 0 },
|
||||||
|
{ "pool", s_ltorg, 0 },
|
||||||
|
/* Allow for the effect of section changes. */
|
||||||
|
{ "text", arm_s_text, 0 },
|
||||||
|
{ "data", arm_s_data, 0 },
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
{"word", s_arm_elf_cons, 4},
|
{ "section", arm_s_section, 0 },
|
||||||
{"long", s_arm_elf_cons, 4},
|
{ "section.s", arm_s_section, 0 },
|
||||||
|
{ "sect", arm_s_section, 0 },
|
||||||
|
{ "sect.s", arm_s_section, 0 },
|
||||||
|
{ "word", s_arm_elf_cons, 4 },
|
||||||
|
{ "long", s_arm_elf_cons, 4 },
|
||||||
#else
|
#else
|
||||||
{"word", cons, 4},
|
{ "word", cons, 4},
|
||||||
#endif
|
#endif
|
||||||
{"extend", float_cons, 'x'},
|
{ "extend", float_cons, 'x' },
|
||||||
{"ldouble", float_cons, 'x'},
|
{ "ldouble", float_cons, 'x' },
|
||||||
{"packed", float_cons, 'p'},
|
{ "packed", float_cons, 'p' },
|
||||||
{0, 0, 0}
|
{ 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Stuff needed to resolve the label ambiguity
|
/* Stuff needed to resolve the label ambiguity
|
||||||
|
@ -1109,19 +1121,14 @@ s_even (ignore)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s_ltorg (internal)
|
s_ltorg (ignored)
|
||||||
int internal;
|
int ignored;
|
||||||
{
|
{
|
||||||
int lit_count = 0;
|
int lit_count = 0;
|
||||||
char sym_name[20];
|
char sym_name[20];
|
||||||
|
|
||||||
if (current_poolP == NULL)
|
if (current_poolP == NULL)
|
||||||
{
|
|
||||||
/* Nothing to do */
|
|
||||||
if (!internal)
|
|
||||||
as_tsktsk (_("Nothing to put in the pool\n"));
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
/* Align pool as you have word accesses */
|
/* Align pool as you have word accesses */
|
||||||
/* Only make a frag if we have to ... */
|
/* Only make a frag if we have to ... */
|
||||||
|
@ -1130,9 +1137,6 @@ s_ltorg (internal)
|
||||||
|
|
||||||
record_alignment (now_seg, 2);
|
record_alignment (now_seg, 2);
|
||||||
|
|
||||||
if (internal)
|
|
||||||
as_tsktsk (_("Inserting implicit pool at change of section"));
|
|
||||||
|
|
||||||
sprintf (sym_name, "$$lit_\002%x", lit_pool_num++);
|
sprintf (sym_name, "$$lit_\002%x", lit_pool_num++);
|
||||||
|
|
||||||
symbol_locate (current_poolP, sym_name, now_seg,
|
symbol_locate (current_poolP, sym_name, now_seg,
|
||||||
|
@ -1221,6 +1225,135 @@ s_thumb_func (ignore)
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Perform a .set directive, but also mark the alias as
|
||||||
|
being a thumb function. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
s_thumb_set (equiv)
|
||||||
|
int equiv;
|
||||||
|
{
|
||||||
|
/* XXX the following is a duplicate of the code for s_set() in read.c
|
||||||
|
We cannot just call that code as we need to get at the symbol that
|
||||||
|
is created. */
|
||||||
|
register char * name;
|
||||||
|
register char delim;
|
||||||
|
register char * end_name;
|
||||||
|
register symbolS * symbolP;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Especial apologies for the random logic:
|
||||||
|
* this just grew, and could be parsed much more simply!
|
||||||
|
* Dean in haste.
|
||||||
|
*/
|
||||||
|
name = input_line_pointer;
|
||||||
|
delim = get_symbol_end ();
|
||||||
|
end_name = input_line_pointer;
|
||||||
|
*end_name = delim;
|
||||||
|
|
||||||
|
SKIP_WHITESPACE ();
|
||||||
|
|
||||||
|
if (*input_line_pointer != ',')
|
||||||
|
{
|
||||||
|
*end_name = 0;
|
||||||
|
as_bad (_("Expected comma after name \"%s\""), name);
|
||||||
|
*end_name = delim;
|
||||||
|
ignore_rest_of_line ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
input_line_pointer++;
|
||||||
|
*end_name = 0;
|
||||||
|
|
||||||
|
if (name[0] == '.' && name[1] == '\0')
|
||||||
|
{
|
||||||
|
/* XXX - this should not happen to .thumb_set */
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((symbolP = symbol_find (name)) == NULL
|
||||||
|
&& (symbolP = md_undefined_symbol (name)) == NULL)
|
||||||
|
{
|
||||||
|
#ifndef NO_LISTING
|
||||||
|
/* When doing symbol listings, play games with dummy fragments living
|
||||||
|
outside the normal fragment chain to record the file and line info
|
||||||
|
for this symbol. */
|
||||||
|
if (listing & LISTING_SYMBOLS)
|
||||||
|
{
|
||||||
|
extern struct list_info_struct * listing_tail;
|
||||||
|
fragS * dummy_frag = (fragS *) xmalloc (sizeof(fragS));
|
||||||
|
memset (dummy_frag, 0, sizeof(fragS));
|
||||||
|
dummy_frag->fr_type = rs_fill;
|
||||||
|
dummy_frag->line = listing_tail;
|
||||||
|
symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
|
||||||
|
dummy_frag->fr_symbol = symbolP;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
|
||||||
|
|
||||||
|
#ifdef OBJ_COFF
|
||||||
|
/* "set" symbols are local unless otherwise specified. */
|
||||||
|
SF_SET_LOCAL (symbolP);
|
||||||
|
#endif /* OBJ_COFF */
|
||||||
|
} /* make a new symbol */
|
||||||
|
|
||||||
|
symbol_table_insert (symbolP);
|
||||||
|
|
||||||
|
* end_name = delim;
|
||||||
|
|
||||||
|
if (equiv
|
||||||
|
&& S_IS_DEFINED (symbolP)
|
||||||
|
&& S_GET_SEGMENT (symbolP) != reg_section)
|
||||||
|
as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
|
||||||
|
|
||||||
|
pseudo_set (symbolP);
|
||||||
|
|
||||||
|
demand_empty_rest_of_line ();
|
||||||
|
|
||||||
|
/* XXX now we come to the Thumb specific bit of code. */
|
||||||
|
|
||||||
|
THUMB_SET_FUNC (symbolP, 1);
|
||||||
|
ARM_SET_THUMB (symbolP, 1);
|
||||||
|
ARM_SET_INTERWORK (symbolP, support_interwork);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we change section we must dump the literal pool first. */
|
||||||
|
static void
|
||||||
|
arm_s_text (ignore)
|
||||||
|
int ignore;
|
||||||
|
{
|
||||||
|
if (now_seg != text_section)
|
||||||
|
s_ltorg (0);
|
||||||
|
|
||||||
|
s_text (ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
arm_s_data (ignore)
|
||||||
|
int ignore;
|
||||||
|
{
|
||||||
|
if (flag_readonly_data_in_text)
|
||||||
|
{
|
||||||
|
if (now_seg != text_section)
|
||||||
|
s_ltorg (0);
|
||||||
|
}
|
||||||
|
else if (now_seg != data_section)
|
||||||
|
s_ltorg (0);
|
||||||
|
|
||||||
|
s_data (ignore);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef OBJ_ELF
|
||||||
|
static void
|
||||||
|
arm_s_section (ignore)
|
||||||
|
int ignore;
|
||||||
|
{
|
||||||
|
s_ltorg (0);
|
||||||
|
|
||||||
|
obj_elf_section (ignore);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
opcode_select (width)
|
opcode_select (width)
|
||||||
int width;
|
int width;
|
||||||
|
@ -6845,4 +6978,3 @@ s_arm_elf_cons (nbytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* OBJ_ELF */
|
#endif /* OBJ_ELF */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue