gas/
2005-02-11 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.h (LEX_AT): Include LEX_BEGIN_NAME. (LEX_QM): Likewise. (ia64_parse_name): New third parameter. (md_parse_name): Pass third argument. * config/tc-ia64.c (pseudo_func): Placeholders use NULL as name. (md_operand): Handling of '@'-prefixed symbols moved from here... (ia64_parse_name): ...to here.
This commit is contained in:
parent
a911c10a55
commit
16a48f83f6
3 changed files with 105 additions and 100 deletions
|
@ -1,3 +1,13 @@
|
||||||
|
2005-02-11 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
* config/tc-ia64.h (LEX_AT): Include LEX_BEGIN_NAME.
|
||||||
|
(LEX_QM): Likewise.
|
||||||
|
(ia64_parse_name): New third parameter.
|
||||||
|
(md_parse_name): Pass third argument.
|
||||||
|
* config/tc-ia64.c (pseudo_func): Placeholders use NULL as name.
|
||||||
|
(md_operand): Handling of '@'-prefixed symbols moved from here...
|
||||||
|
(ia64_parse_name): ...to here.
|
||||||
|
|
||||||
2005-02-11 Jan Beulich <jbeulich@novell.com>
|
2005-02-11 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
* config/tc-ia64.c (md): Remove last_groups and group_idx.
|
* config/tc-ia64.c (md): Remove last_groups and group_idx.
|
||||||
|
|
|
@ -495,10 +495,10 @@ pseudo_func[] =
|
||||||
{ "segrel", PSEUDO_FUNC_RELOC, { 0 } },
|
{ "segrel", PSEUDO_FUNC_RELOC, { 0 } },
|
||||||
{ "tprel", PSEUDO_FUNC_RELOC, { 0 } },
|
{ "tprel", PSEUDO_FUNC_RELOC, { 0 } },
|
||||||
{ "ltv", PSEUDO_FUNC_RELOC, { 0 } },
|
{ "ltv", PSEUDO_FUNC_RELOC, { 0 } },
|
||||||
{ "", 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
|
{ NULL, 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
|
||||||
{ "", 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
|
{ NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
|
||||||
{ "", 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
|
{ NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
|
||||||
{ "", 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
|
{ NULL, 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
|
||||||
{ "iplt", PSEUDO_FUNC_RELOC, { 0 } },
|
{ "iplt", PSEUDO_FUNC_RELOC, { 0 } },
|
||||||
|
|
||||||
/* mbtype4 constants: */
|
/* mbtype4 constants: */
|
||||||
|
@ -7475,16 +7475,101 @@ ia64_optimize_expr (l, op, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ia64_parse_name (name, e)
|
ia64_parse_name (name, e, nextcharP)
|
||||||
char *name;
|
char *name;
|
||||||
expressionS *e;
|
expressionS *e;
|
||||||
|
char *nextcharP;
|
||||||
{
|
{
|
||||||
struct const_desc *cdesc;
|
struct const_desc *cdesc;
|
||||||
struct dynreg *dr = 0;
|
struct dynreg *dr = 0;
|
||||||
unsigned int regnum;
|
unsigned int regnum;
|
||||||
|
unsigned int idx;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
char *end;
|
char *end;
|
||||||
|
|
||||||
|
if (*name == '@')
|
||||||
|
{
|
||||||
|
enum pseudo_type pseudo_type = PSEUDO_FUNC_NONE;
|
||||||
|
|
||||||
|
/* Find what relocation pseudo-function we're dealing with. */
|
||||||
|
for (idx = 0; idx < NELEMS (pseudo_func); ++idx)
|
||||||
|
if (pseudo_func[idx].name
|
||||||
|
&& pseudo_func[idx].name[0] == name[1]
|
||||||
|
&& strcmp (pseudo_func[idx].name + 1, name + 2) == 0)
|
||||||
|
{
|
||||||
|
pseudo_type = pseudo_func[idx].type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (pseudo_type)
|
||||||
|
{
|
||||||
|
case PSEUDO_FUNC_RELOC:
|
||||||
|
end = input_line_pointer;
|
||||||
|
if (*nextcharP != '(')
|
||||||
|
{
|
||||||
|
as_bad ("Expected '('");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
/* Skip '('. */
|
||||||
|
++input_line_pointer;
|
||||||
|
expression (e);
|
||||||
|
if (*input_line_pointer != ')')
|
||||||
|
{
|
||||||
|
as_bad ("Missing ')'");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
/* Skip ')'. */
|
||||||
|
++input_line_pointer;
|
||||||
|
if (e->X_op != O_symbol)
|
||||||
|
{
|
||||||
|
if (e->X_op != O_pseudo_fixup)
|
||||||
|
{
|
||||||
|
as_bad ("Not a symbolic expression");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (idx != FUNC_LT_RELATIVE)
|
||||||
|
{
|
||||||
|
as_bad ("Illegal combination of relocation functions");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
switch (S_GET_VALUE (e->X_op_symbol))
|
||||||
|
{
|
||||||
|
case FUNC_FPTR_RELATIVE:
|
||||||
|
idx = FUNC_LT_FPTR_RELATIVE; break;
|
||||||
|
case FUNC_DTP_MODULE:
|
||||||
|
idx = FUNC_LT_DTP_MODULE; break;
|
||||||
|
case FUNC_DTP_RELATIVE:
|
||||||
|
idx = FUNC_LT_DTP_RELATIVE; break;
|
||||||
|
case FUNC_TP_RELATIVE:
|
||||||
|
idx = FUNC_LT_TP_RELATIVE; break;
|
||||||
|
default:
|
||||||
|
as_bad ("Illegal combination of relocation functions");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Make sure gas doesn't get rid of local symbols that are used
|
||||||
|
in relocs. */
|
||||||
|
e->X_op = O_pseudo_fixup;
|
||||||
|
e->X_op_symbol = pseudo_func[idx].u.sym;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PSEUDO_FUNC_CONST:
|
||||||
|
e->X_op = O_constant;
|
||||||
|
e->X_add_number = pseudo_func[idx].u.ival;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PSEUDO_FUNC_REG:
|
||||||
|
e->X_op = O_register;
|
||||||
|
e->X_add_number = pseudo_func[idx].u.ival;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
*nextcharP = *input_line_pointer;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* first see if NAME is a known register name: */
|
/* first see if NAME is a known register name: */
|
||||||
sym = hash_find (md.reg_hash, name);
|
sym = hash_find (md.reg_hash, name);
|
||||||
if (sym)
|
if (sym)
|
||||||
|
@ -10310,104 +10395,14 @@ void
|
||||||
md_operand (e)
|
md_operand (e)
|
||||||
expressionS *e;
|
expressionS *e;
|
||||||
{
|
{
|
||||||
enum pseudo_type pseudo_type;
|
|
||||||
const char *name;
|
|
||||||
size_t len;
|
|
||||||
int ch, i;
|
|
||||||
|
|
||||||
switch (*input_line_pointer)
|
switch (*input_line_pointer)
|
||||||
{
|
{
|
||||||
case '@':
|
|
||||||
/* Find what relocation pseudo-function we're dealing with. */
|
|
||||||
pseudo_type = 0;
|
|
||||||
ch = *++input_line_pointer;
|
|
||||||
for (i = 0; i < NELEMS (pseudo_func); ++i)
|
|
||||||
if (pseudo_func[i].name && pseudo_func[i].name[0] == ch)
|
|
||||||
{
|
|
||||||
len = strlen (pseudo_func[i].name);
|
|
||||||
if (strncmp (pseudo_func[i].name + 1,
|
|
||||||
input_line_pointer + 1, len - 1) == 0
|
|
||||||
&& !is_part_of_name (input_line_pointer[len]))
|
|
||||||
{
|
|
||||||
input_line_pointer += len;
|
|
||||||
pseudo_type = pseudo_func[i].type;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch (pseudo_type)
|
|
||||||
{
|
|
||||||
case PSEUDO_FUNC_RELOC:
|
|
||||||
SKIP_WHITESPACE ();
|
|
||||||
if (*input_line_pointer != '(')
|
|
||||||
{
|
|
||||||
as_bad ("Expected '('");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
/* Skip '('. */
|
|
||||||
++input_line_pointer;
|
|
||||||
expression (e);
|
|
||||||
if (*input_line_pointer++ != ')')
|
|
||||||
{
|
|
||||||
as_bad ("Missing ')'");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (e->X_op != O_symbol)
|
|
||||||
{
|
|
||||||
if (e->X_op != O_pseudo_fixup)
|
|
||||||
{
|
|
||||||
as_bad ("Not a symbolic expression");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
if (i != FUNC_LT_RELATIVE)
|
|
||||||
{
|
|
||||||
as_bad ("Illegal combination of relocation functions");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
switch (S_GET_VALUE (e->X_op_symbol))
|
|
||||||
{
|
|
||||||
case FUNC_FPTR_RELATIVE:
|
|
||||||
i = FUNC_LT_FPTR_RELATIVE; break;
|
|
||||||
case FUNC_DTP_MODULE:
|
|
||||||
i = FUNC_LT_DTP_MODULE; break;
|
|
||||||
case FUNC_DTP_RELATIVE:
|
|
||||||
i = FUNC_LT_DTP_RELATIVE; break;
|
|
||||||
case FUNC_TP_RELATIVE:
|
|
||||||
i = FUNC_LT_TP_RELATIVE; break;
|
|
||||||
default:
|
|
||||||
as_bad ("Illegal combination of relocation functions");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Make sure gas doesn't get rid of local symbols that are used
|
|
||||||
in relocs. */
|
|
||||||
e->X_op = O_pseudo_fixup;
|
|
||||||
e->X_op_symbol = pseudo_func[i].u.sym;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PSEUDO_FUNC_CONST:
|
|
||||||
e->X_op = O_constant;
|
|
||||||
e->X_add_number = pseudo_func[i].u.ival;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PSEUDO_FUNC_REG:
|
|
||||||
e->X_op = O_register;
|
|
||||||
e->X_add_number = pseudo_func[i].u.ival;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
name = input_line_pointer - 1;
|
|
||||||
get_symbol_end ();
|
|
||||||
as_bad ("Unknown pseudo function `%s'", name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '[':
|
case '[':
|
||||||
++input_line_pointer;
|
++input_line_pointer;
|
||||||
expression (e);
|
expression (e);
|
||||||
if (*input_line_pointer != ']')
|
if (*input_line_pointer != ']')
|
||||||
{
|
{
|
||||||
as_bad ("Closing bracket misssing");
|
as_bad ("Closing bracket missing");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -74,8 +74,8 @@ extern const char *ia64_target_format PARAMS ((void));
|
||||||
#define NEED_INDEX_OPERATOR /* [ ] is index operator */
|
#define NEED_INDEX_OPERATOR /* [ ] is index operator */
|
||||||
|
|
||||||
#define QUOTES_IN_INSN /* allow `string "foo;bar"' */
|
#define QUOTES_IN_INSN /* allow `string "foo;bar"' */
|
||||||
#define LEX_AT LEX_NAME /* allow `@' inside name */
|
#define LEX_AT (LEX_NAME|LEX_BEGIN_NAME) /* allow `@' inside name */
|
||||||
#define LEX_QM LEX_NAME /* allow `?' inside name */
|
#define LEX_QM (LEX_NAME|LEX_BEGIN_NAME) /* allow `?' inside name */
|
||||||
#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
|
#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
|
||||||
|
|
||||||
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
|
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
|
||||||
|
@ -94,7 +94,7 @@ extern void ia64_frob_label PARAMS((struct symbol *sym));
|
||||||
extern int ia64_frob_symbol PARAMS((struct symbol *sym));
|
extern int ia64_frob_symbol PARAMS((struct symbol *sym));
|
||||||
#endif
|
#endif
|
||||||
extern void ia64_flush_pending_output PARAMS((void));
|
extern void ia64_flush_pending_output PARAMS((void));
|
||||||
extern int ia64_parse_name (char *name, expressionS *e);
|
extern int ia64_parse_name PARAMS((char *name, expressionS *e, char *nextP));
|
||||||
extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
|
extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
|
||||||
expressionS *r));
|
expressionS *r));
|
||||||
extern void ia64_cons_align PARAMS((int));
|
extern void ia64_cons_align PARAMS((int));
|
||||||
|
@ -125,7 +125,7 @@ extern void ia64_convert_frag (fragS *);
|
||||||
#define tc_frob_symbol(s,p) p |= ia64_frob_symbol (s)
|
#define tc_frob_symbol(s,p) p |= ia64_frob_symbol (s)
|
||||||
#endif /* TE_HPUX */
|
#endif /* TE_HPUX */
|
||||||
#define md_flush_pending_output() ia64_flush_pending_output ()
|
#define md_flush_pending_output() ia64_flush_pending_output ()
|
||||||
#define md_parse_name(s,e,c) ia64_parse_name (s, e)
|
#define md_parse_name(s,e,c) ia64_parse_name (s, e, c)
|
||||||
#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
|
#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
|
||||||
#define tc_canonicalize_section_name(s) ia64_canonicalize_symbol_name (s)
|
#define tc_canonicalize_section_name(s) ia64_canonicalize_symbol_name (s)
|
||||||
#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
|
#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
|
||||||
|
|
Loading…
Reference in a new issue