gas/
2003-05-07 H.J. Lu <hongjiu.lu@intel.com> * config/tc-ia64.c (alias_hash): New. (alias_name_hash): New. (secalias_hash): New. (secalias_name_hash): New. (md_pseudo_table): Add "secalias". (md_begin): Initialize alias_hash, alias_name_hash, secalias_hash and secalias_name_hash. (struct alias): New. (dot_alias): Implement .alias and .secalias directives. (do_alias): New. (ia64_adjust_symtab): New. (do_secalias): New. (ia64_frob_file): New. * config/tc-ia64.h (ia64_adjust_symtab): New. (tc_adjust_symtab): Defined. (ia64_frob_file): New. (tc_frob_file): Defined. gas/testsuite/ 2003-05-07 H.J. Lu <hongjiu.lu@intel.com> * gas/ia64/ia64.exp: Add alias. * gas/ia64/alias.s: New. * gas/ia64/alias.d: Likewise.
This commit is contained in:
parent
f6684c3170
commit
35f5df7fe8
@ -1,3 +1,24 @@
|
||||
2003-05-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/tc-ia64.c (alias_hash): New.
|
||||
(alias_name_hash): New.
|
||||
(secalias_hash): New.
|
||||
(secalias_name_hash): New.
|
||||
(md_pseudo_table): Add "secalias".
|
||||
(md_begin): Initialize alias_hash, alias_name_hash,
|
||||
secalias_hash and secalias_name_hash.
|
||||
(struct alias): New.
|
||||
(dot_alias): Implement .alias and .secalias directives.
|
||||
(do_alias): New.
|
||||
(ia64_adjust_symtab): New.
|
||||
(do_secalias): New.
|
||||
(ia64_frob_file): New.
|
||||
|
||||
* config/tc-ia64.h (ia64_adjust_symtab): New.
|
||||
(tc_adjust_symtab): Defined.
|
||||
(ia64_frob_file): New.
|
||||
(tc_frob_file): Defined.
|
||||
|
||||
2003-05-07 Dmitry Diky <diwil@mail.ru>
|
||||
|
||||
* tc-msp430.c: Add missing lines to known cpus list.
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
- optional operands
|
||||
- directives:
|
||||
.alias
|
||||
.eb
|
||||
.estate
|
||||
.lb
|
||||
@ -165,6 +164,11 @@ static void ia64_float_to_chars_littleendian
|
||||
static void (*ia64_float_to_chars)
|
||||
PARAMS ((char *, LITTLENUM_TYPE *, int));
|
||||
|
||||
static struct hash_control *alias_hash;
|
||||
static struct hash_control *alias_name_hash;
|
||||
static struct hash_control *secalias_hash;
|
||||
static struct hash_control *secalias_name_hash;
|
||||
|
||||
/* Characters which always start a comment. */
|
||||
const char comment_chars[] = "";
|
||||
|
||||
@ -4383,13 +4387,6 @@ dot_psr (dummy)
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
static void
|
||||
dot_alias (dummy)
|
||||
int dummy ATTRIBUTE_UNUSED;
|
||||
{
|
||||
as_bad (".alias not implemented yet");
|
||||
}
|
||||
|
||||
static void
|
||||
dot_ln (dummy)
|
||||
int dummy ATTRIBUTE_UNUSED;
|
||||
@ -4935,6 +4932,7 @@ const pseudo_typeS md_pseudo_table[] =
|
||||
{ "msb", dot_byteorder, 1 },
|
||||
{ "psr", dot_psr, 0 },
|
||||
{ "alias", dot_alias, 0 },
|
||||
{ "secalias", dot_alias, 1 },
|
||||
{ "ln", dot_ln, 0 }, /* source line info (for debugging) */
|
||||
|
||||
{ "xdata1", dot_xdata, 1 },
|
||||
@ -6578,6 +6576,11 @@ md_begin ()
|
||||
target_big_endian = -1;
|
||||
dot_byteorder (TARGET_BYTES_BIG_ENDIAN);
|
||||
|
||||
alias_hash = hash_new ();
|
||||
alias_name_hash = hash_new ();
|
||||
secalias_hash = hash_new ();
|
||||
secalias_name_hash = hash_new ();
|
||||
|
||||
pseudo_func[FUNC_DTP_MODULE].u.sym =
|
||||
symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
|
||||
&zero_address_frag);
|
||||
@ -10737,3 +10740,169 @@ ia64_check_label (symbolS *label)
|
||||
input_line_pointer++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Used to remember where .alias and .secalias directives are seen. We
|
||||
will rename symbol and section names when we are about to output
|
||||
the relocatable file. */
|
||||
struct alias
|
||||
{
|
||||
char *file; /* The file where the directive is seen. */
|
||||
unsigned int line; /* The line number the directive is at. */
|
||||
const char *name; /* The orignale name of the symbol. */
|
||||
};
|
||||
|
||||
/* Called for .alias and .secalias directives. If SECTION is 1, it is
|
||||
.secalias. Otherwise, it is .alias. */
|
||||
static void
|
||||
dot_alias (int section)
|
||||
{
|
||||
char *name, *alias;
|
||||
char delim;
|
||||
char *end_name;
|
||||
int len;
|
||||
const char *error_string;
|
||||
struct alias *h;
|
||||
const char *a;
|
||||
struct hash_control *ahash, *nhash;
|
||||
const char *kind;
|
||||
|
||||
name = input_line_pointer;
|
||||
delim = get_symbol_end ();
|
||||
end_name = input_line_pointer;
|
||||
*end_name = delim;
|
||||
|
||||
if (name == end_name)
|
||||
{
|
||||
as_bad (_("expected symbol name"));
|
||||
discard_rest_of_line ();
|
||||
return;
|
||||
}
|
||||
|
||||
SKIP_WHITESPACE ();
|
||||
|
||||
if (*input_line_pointer != ',')
|
||||
{
|
||||
*end_name = 0;
|
||||
as_bad (_("expected comma after \"%s\""), name);
|
||||
*end_name = delim;
|
||||
ignore_rest_of_line ();
|
||||
return;
|
||||
}
|
||||
|
||||
input_line_pointer++;
|
||||
*end_name = 0;
|
||||
|
||||
/* We call demand_copy_C_string to check if alias string is valid.
|
||||
There should be a closing `"' and no `\0' in the string. */
|
||||
alias = demand_copy_C_string (&len);
|
||||
if (alias == NULL)
|
||||
{
|
||||
ignore_rest_of_line ();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make a copy of name string. */
|
||||
len = strlen (name) + 1;
|
||||
obstack_grow (¬es, name, len);
|
||||
name = obstack_finish (¬es);
|
||||
|
||||
if (section)
|
||||
{
|
||||
kind = "section";
|
||||
ahash = secalias_hash;
|
||||
nhash = secalias_name_hash;
|
||||
}
|
||||
else
|
||||
{
|
||||
kind = "symbol";
|
||||
ahash = alias_hash;
|
||||
nhash = alias_name_hash;
|
||||
}
|
||||
|
||||
/* Check if alias has been used before. */
|
||||
h = (struct alias *) hash_find (ahash, alias);
|
||||
if (h)
|
||||
{
|
||||
if (strcmp (h->name, name))
|
||||
as_bad (_("`%s' is already the alias of %s `%s'"),
|
||||
alias, kind, h->name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check if name already has an alias. */
|
||||
a = (const char *) hash_find (nhash, name);
|
||||
if (a)
|
||||
{
|
||||
if (strcmp (a, alias))
|
||||
as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
|
||||
goto out;
|
||||
}
|
||||
|
||||
h = (struct alias *) xmalloc (sizeof (struct alias));
|
||||
as_where (&h->file, &h->line);
|
||||
h->name = name;
|
||||
|
||||
error_string = hash_jam (ahash, alias, (PTR) h);
|
||||
if (error_string)
|
||||
{
|
||||
as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
|
||||
alias, kind, error_string);
|
||||
goto out;
|
||||
}
|
||||
|
||||
error_string = hash_jam (nhash, name, (PTR) alias);
|
||||
if (error_string)
|
||||
{
|
||||
as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
|
||||
alias, kind, error_string);
|
||||
out:
|
||||
obstack_free (¬es, name);
|
||||
obstack_free (¬es, alias);
|
||||
}
|
||||
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
/* It renames the original symbol name to its alias. */
|
||||
static void
|
||||
do_alias (const char *alias, PTR value)
|
||||
{
|
||||
struct alias *h = (struct alias *) value;
|
||||
symbolS *sym = symbol_find (h->name);
|
||||
|
||||
if (sym == NULL)
|
||||
as_warn_where (h->file, h->line,
|
||||
_("symbol `%s' aliased to `%s' is not used"),
|
||||
h->name, alias);
|
||||
else
|
||||
S_SET_NAME (sym, (char *) alias);
|
||||
}
|
||||
|
||||
/* Called from write_object_file. */
|
||||
void
|
||||
ia64_adjust_symtab (void)
|
||||
{
|
||||
hash_traverse (alias_hash, do_alias);
|
||||
}
|
||||
|
||||
/* It renames the original section name to its alias. */
|
||||
static void
|
||||
do_secalias (const char *alias, PTR value)
|
||||
{
|
||||
struct alias *h = (struct alias *) value;
|
||||
segT sec = bfd_get_section_by_name (stdoutput, h->name);
|
||||
|
||||
if (sec == NULL)
|
||||
as_warn_where (h->file, h->line,
|
||||
_("section `%s' aliased to `%s' is not used"),
|
||||
h->name, alias);
|
||||
else
|
||||
sec->name = alias;
|
||||
}
|
||||
|
||||
/* Called from write_object_file. */
|
||||
void
|
||||
ia64_frob_file (void)
|
||||
{
|
||||
hash_traverse (secalias_hash, do_secalias);
|
||||
}
|
||||
|
@ -48,6 +48,12 @@ struct ia64_segment_info_type
|
||||
|
||||
#define TC_SEGMENT_INFO_TYPE struct ia64_segment_info_type
|
||||
|
||||
extern void ia64_adjust_symtab PARAMS ((void));
|
||||
#define tc_adjust_symtab() ia64_adjust_symtab ()
|
||||
|
||||
extern void ia64_frob_file PARAMS ((void));
|
||||
#define tc_frob_file() ia64_frob_file ()
|
||||
|
||||
/* We need to set the default object file format in ia64_init and not in
|
||||
md_begin. This is because parse_args is called before md_begin, and we
|
||||
do not want md_begin to wipe out the flag settings set by options parsed in
|
||||
|
@ -1,3 +1,10 @@
|
||||
2003-05-07 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gas/ia64/ia64.exp: Add alias.
|
||||
|
||||
* gas/ia64/alias.s: New.
|
||||
* gas/ia64/alias.d: Likewise.
|
||||
|
||||
2003-05-06 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* gas/mips/abs.d, gas/mips/add.d, gas/mips/and.d,
|
||||
|
37
gas/testsuite/gas/ia64/alias.d
Normal file
37
gas/testsuite/gas/ia64/alias.d
Normal file
@ -0,0 +1,37 @@
|
||||
#readelf: -Ss
|
||||
#name: ia64 alias and secalias
|
||||
|
||||
There are 8 section headers, starting at offset 0x78:
|
||||
|
||||
Section Headers:
|
||||
\[Nr\] Name Type Address Offset
|
||||
Size EntSize Flags Link Info Align
|
||||
\[ 0\] NULL 0000000000000000 00000000
|
||||
0000000000000000 0000000000000000 0 0 0
|
||||
\[ 1\] \.text PROGBITS 0000000000000000 00000040
|
||||
0000000000000000 0000000000000000 AX 0 0 16
|
||||
\[ 2\] \.data PROGBITS 0000000000000000 00000040
|
||||
0000000000000000 0000000000000000 WA 0 0 1
|
||||
\[ 3\] \.bss NOBITS 0000000000000000 00000040
|
||||
0000000000000000 0000000000000000 WA 0 0 1
|
||||
\[ 4\] 1234 PROGBITS 0000000000000000 00000040
|
||||
0000000000000005 0000000000000000 WA 0 0 1
|
||||
\[ 5\] \.shstrtab STRTAB 0000000000000000 00000045
|
||||
0000000000000031 0000000000000000 0 0 1
|
||||
\[ 6\] \.symtab SYMTAB 0000000000000000 00000278
|
||||
0000000000000090 0000000000000018 7 6 8
|
||||
\[ 7\] \.strtab STRTAB 0000000000000000 00000308
|
||||
0000000000000006 0000000000000000 0 0 1
|
||||
Key to Flags:
|
||||
W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
|
||||
I \(info\), L \(link order\), G \(group\), x \(unknown\)
|
||||
O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
|
||||
|
||||
Symbol table '\.symtab' contains 6 entries:
|
||||
Num: Value Size Type Bind Vis Ndx Name
|
||||
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
|
||||
1: 0000000000000000 0 SECTION LOCAL DEFAULT 1
|
||||
2: 0000000000000000 0 SECTION LOCAL DEFAULT 2
|
||||
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
|
||||
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
|
||||
5: 0000000000000000 0 NOTYPE LOCAL DEFAULT 4 "@D"
|
11
gas/testsuite/gas/ia64/alias.s
Normal file
11
gas/testsuite/gas/ia64/alias.s
Normal file
@ -0,0 +1,11 @@
|
||||
.section .foo,"aw","progbits"
|
||||
.secalias .foo,"1234"
|
||||
.secalias .foo,"1234"
|
||||
.alias foo, "\"\80\84\""
|
||||
.alias foo, "\"\80\84\""
|
||||
foo:
|
||||
stringz "\"\80\84\""
|
||||
.secalias .foo,"1234"
|
||||
.secalias .foo,"1234"
|
||||
.alias foo, "\"\80\84\""
|
||||
.alias foo, "\"\80\84\""
|
@ -48,4 +48,5 @@ if [istarget "ia64-*"] then {
|
||||
run_dump_test "global"
|
||||
run_dump_test "secname"
|
||||
run_dump_test "unwind"
|
||||
run_dump_test "alias"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user