* elf32-xtensa.c (elf_xtensa_special_sections): Add .xtensa.info.
gas/
	* config/tc-xtensa.c (XSHAL_ABI): Add default definition.
	(directive_state): Disable scheduling by default.
	(xtensa_add_config_info): New.
	(xtensa_end): Call xtensa_add_config_info.
gas/testsuite/
	* gas/elf/section2.e-xtensa: New file.
	* gas/elf/elf.exp: Use it.
include/
	* xtensa-config.h (XSHAL_ABI): New.
	(XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New.
ld/
	* emultempl/xtensaelf.em (XSHAL_ABI): Add default definition.
	(replace_insn_sec_with_prop_sec): Use bfd_make_section_with_flags.
	Delete redundant code to set sections flags and alignment.
	(xt_config_info_unpack_and_check, check_xtensa_info): New.
	(elf_xtensa_after_open): Iterate over input statements instead of
	link_info.input_bfds.
	(elf_xtensa_before_allocation): Likewise.  Call check_xtensa_info for
	each input, and write a new .xtensa.info section in the output.
This commit is contained in:
Bob Wilson 2006-11-27 20:14:53 +00:00
parent 0154116a20
commit 2caa7ca0aa
11 changed files with 301 additions and 32 deletions

View File

@ -1,3 +1,7 @@
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* elf32-xtensa.c (elf_xtensa_special_sections): Add .xtensa.info.
2006-11-24 H.J. Lu <hongjiu.lu@intel.com>
* elf.c (IS_SECTION_IN_INPUT_SEGMENT): New.

View File

@ -9801,6 +9801,7 @@ static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
{ STRING_COMMA_LEN (".fini.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
{ STRING_COMMA_LEN (".init.literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
{ STRING_COMMA_LEN (".literal"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
{ STRING_COMMA_LEN (".xtensa.info"), 0, SHT_NOTE, 0 },
{ NULL, 0, 0, 0, 0 }
};

View File

@ -1,3 +1,10 @@
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* config/tc-xtensa.c (XSHAL_ABI): Add default definition.
(directive_state): Disable scheduling by default.
(xtensa_add_config_info): New.
(xtensa_end): Call xtensa_add_config_info.
2006-11-27 Eric Botcazou <ebotcazou@adacore.com>
* config/tc-sparc.c (tc_gen_reloc): Turn aligned relocs into

View File

@ -30,6 +30,11 @@
#include "struc-symbol.h"
#include "xtensa-config.h"
/* Provide default values for new configuration settings. */
#ifndef XSHAL_ABI
#define XSHAL_ABI 0
#endif
#ifndef uint32
#define uint32 unsigned int
#endif
@ -396,7 +401,7 @@ bfd_boolean directive_state[] =
FALSE, /* freeregs */
FALSE, /* longcalls */
FALSE, /* literal_prefix */
TRUE, /* schedule */
FALSE, /* schedule */
#if XSHAL_USE_ABSOLUTE_LITERALS
TRUE /* absolute_literals */
#else
@ -6859,6 +6864,7 @@ static void xtensa_fix_b_j_loop_end_frags (void);
static void xtensa_fix_close_loop_end_frags (void);
static void xtensa_fix_short_loop_frags (void);
static void xtensa_sanity_check (void);
static void xtensa_add_config_info (void);
void
xtensa_end (void)
@ -6889,6 +6895,8 @@ xtensa_end (void)
xtensa_mark_zcl_first_insns ();
xtensa_sanity_check ();
xtensa_add_config_info ();
}
@ -7797,6 +7805,55 @@ is_local_forward_loop (const TInsn *insn, fragS *fragP)
return FALSE;
}
#define XTINFO_NAME "Xtensa_Info"
#define XTINFO_NAMESZ 12
#define XTINFO_TYPE 1
static void
xtensa_add_config_info (void)
{
asection *info_sec;
char *data, *p;
int sz;
info_sec = subseg_new (".xtensa.info", 0);
bfd_set_section_flags (stdoutput, info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
data = xmalloc (100);
sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
sz = strlen (data) + 1;
/* Add enough null terminators to pad to a word boundary. */
do
data[sz++] = 0;
while ((sz & 3) != 0);
/* Follow the standard note section layout:
First write the length of the name string. */
p = frag_more (4);
md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
/* Next comes the length of the "descriptor", i.e., the actual data. */
p = frag_more (4);
md_number_to_chars (p, (valueT) sz, 4);
/* Write the note type. */
p = frag_more (4);
md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
/* Write the name field. */
p = frag_more (XTINFO_NAMESZ);
memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
/* Finally, write the descriptor. */
p = frag_more (sz);
memcpy (p, data, sz);
free (data);
}
/* Alignment Functions. */

View File

@ -1,3 +1,8 @@
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* gas/elf/section2.e-xtensa: New file.
* gas/elf/elf.exp: Use it.
2006-11-22 Daniel Jacobowitz <dan@codesourcery.com>
* gas/arm/arm7t.d, gas/arm/neon-ldst-rm.d, gas/arm/thumb2_pool.d,

View File

@ -53,6 +53,9 @@ if { ([istarget "*-*-*elf*"]
if {[istarget "score-*-*"]} then {
set target_machine -score
}
if {[istarget "xtensa-*-*"]} then {
set target_machine -xtensa
}
if { ([istarget "*arm*-*-*"]
|| [istarget "xscale*-*-*"]) } {

View File

@ -0,0 +1,9 @@
Symbol table '.symtab' contains 6 entries:
Num: Value[ ]* Size Type Bind Vis Ndx Name
0: 0+0 0 NOTYPE LOCAL DEFAULT UND
1: 0+0 0 SECTION LOCAL DEFAULT 1
2: 0+0 0 SECTION LOCAL DEFAULT 2
3: 0+0 0 SECTION LOCAL DEFAULT 3
4: 0+0 0 SECTION LOCAL DEFAULT 4
5: 0+0 0 SECTION LOCAL DEFAULT 5

View File

@ -1,3 +1,8 @@
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* xtensa-config.h (XSHAL_ABI): New.
(XTHAL_ABI_WINDOWED, XTHAL_ABI_CALL0): New.
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* xtensa-isa.h (STATIC_LIBISA): Delete.

View File

@ -1,5 +1,6 @@
/* Xtensa configuration settings.
Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica.
This program is free software; you can redistribute it and/or modify
@ -145,4 +146,12 @@
#undef XCHAL_INST_FETCH_WIDTH
#define XCHAL_INST_FETCH_WIDTH 4
#undef XSHAL_ABI
#undef XTHAL_ABI_WINDOWED
#undef XTHAL_ABI_CALL0
#define XSHAL_ABI XTHAL_ABI_WINDOWED
#define XTHAL_ABI_WINDOWED 0
#define XTHAL_ABI_CALL0 1
#endif /* !XTENSA_CONFIG_H */

View File

@ -1,3 +1,14 @@
2006-11-27 Bob Wilson <bob.wilson@acm.org>
* emultempl/xtensaelf.em (XSHAL_ABI): Add default definition.
(replace_insn_sec_with_prop_sec): Use bfd_make_section_with_flags.
Delete redundant code to set sections flags and alignment.
(xt_config_info_unpack_and_check, check_xtensa_info): New.
(elf_xtensa_after_open): Iterate over input statements instead of
link_info.input_bfds.
(elf_xtensa_before_allocation): Likewise. Call check_xtensa_info for
each input, and write a new .xtensa.info section in the output.
2006-11-22 Nick Clifton <nickc@redhat.com>
* configure.in (LINGUAS): Add ga.

View File

@ -16,7 +16,8 @@
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301 USA.
#
# This file is sourced from elf32.em, and defines extra xtensa-elf
@ -30,6 +31,11 @@ cat >>e${EMULATION_NAME}.c <<EOF
#include "elf/xtensa.h"
#include "bfd.h"
/* Provide default values for new configuration settings. */
#ifndef XSHAL_ABI
#define XSHAL_ABI 0
#endif
static void xtensa_wild_group_interleave (lang_statement_union_type *);
static void xtensa_colocate_output_literals (lang_statement_union_type *);
static void xtensa_strip_inconsistent_linkonce_sections
@ -128,25 +134,17 @@ replace_insn_sec_with_prop_sec (bfd *abfd,
}
}
/* Create a Property table section and relocation section for it. */
/* Create a property table section for it. */
prop_sec_name = strdup (prop_sec_name);
prop_sec = bfd_make_section (abfd, prop_sec_name);
prop_sec = bfd_make_section_with_flags
(abfd, prop_sec_name, bfd_get_section_flags (abfd, insn_sec));
if (prop_sec == NULL
|| ! bfd_set_section_flags (abfd, prop_sec,
bfd_get_section_flags (abfd, insn_sec))
|| ! bfd_set_section_alignment (abfd, prop_sec, 2))
{
*error_message = _("could not create new section");
goto cleanup;
}
if (! bfd_set_section_flags (abfd, prop_sec,
bfd_get_section_flags (abfd, insn_sec))
|| ! bfd_set_section_alignment (abfd, prop_sec, 2))
{
*error_message = _("could not set new section properties");
goto cleanup;
}
prop_sec->size = entry_count * 12;
prop_contents = (bfd_byte *) bfd_zalloc (abfd, prop_sec->size);
elf_section_data (prop_sec)->this_hdr.contents = prop_contents;
@ -297,17 +295,13 @@ replace_instruction_table_sections (bfd *abfd, asection *sec)
static void
elf_xtensa_after_open (void)
{
bfd *abfd;
/* First call the ELF version. */
gld${EMULATION_NAME}_after_open ();
/* Now search the input files looking for instruction table sections. */
for (abfd = link_info.input_bfds;
abfd != NULL;
abfd = abfd->link_next)
LANG_FOR_EACH_INPUT_STATEMENT (f)
{
asection *sec = abfd->sections;
asection *sec = f->the_bfd->sections;
asection *next_sec;
/* Do not use bfd_map_over_sections here since we are removing
@ -315,20 +309,122 @@ elf_xtensa_after_open (void)
while (sec != NULL)
{
next_sec = sec->next;
replace_instruction_table_sections (abfd, sec);
replace_instruction_table_sections (f->the_bfd, sec);
sec = next_sec;
}
}
}
static bfd_boolean
xt_config_info_unpack_and_check (char *data,
bfd_boolean *pmismatch,
char **pmsg)
{
char *d, *key;
unsigned num;
*pmismatch = FALSE;
d = data;
while (*d)
{
key = d;
d = strchr (d, '=');
if (! d)
goto error;
/* Overwrite the equal sign. */
*d++ = 0;
/* Check if this is a quoted string or a number. */
if (*d == '"')
{
/* No string values are currently checked by LD;
just skip over the quotes. */
d++;
d = strchr (d, '"');
if (! d)
goto error;
/* Overwrite the trailing quote. */
*d++ = 0;
}
else
{
if (*d == 0)
goto error;
num = strtoul (d, &d, 0);
if (! strcmp (key, "ABI"))
{
if (num != XSHAL_ABI)
{
*pmismatch = TRUE;
*pmsg = "ABI does not match";
}
}
else if (! strcmp (key, "USE_ABSOLUTE_LITERALS"))
{
if (num != XSHAL_USE_ABSOLUTE_LITERALS)
{
*pmismatch = TRUE;
*pmsg = "incompatible use of the Extended L32R option";
}
}
}
if (*d++ != '\n')
goto error;
}
return TRUE;
error:
return FALSE;
}
#define XTINFO_NAME "Xtensa_Info"
#define XTINFO_NAMESZ 12
#define XTINFO_TYPE 1
static void
check_xtensa_info (bfd *abfd, asection *info_sec)
{
char *data, *errmsg = "";
bfd_boolean mismatch;
data = xmalloc (info_sec->size);
if (! bfd_get_section_contents (abfd, info_sec, data, 0, info_sec->size))
einfo (_("%F%P:%B: cannot read contents of section %A\n"), abfd, info_sec);
if (info_sec->size > 24
&& info_sec->size >= 24 + bfd_get_32 (abfd, data + 4)
&& bfd_get_32 (abfd, data + 0) == XTINFO_NAMESZ
&& bfd_get_32 (abfd, data + 8) == XTINFO_TYPE
&& strcmp (data + 12, XTINFO_NAME) == 0
&& xt_config_info_unpack_and_check (data + 12 + XTINFO_NAMESZ,
&mismatch, &errmsg))
{
if (mismatch)
einfo (_("%P:%B: warning: incompatible Xtensa configuration (%s)\n"),
abfd, errmsg);
}
else
einfo (_("%P:%B: warning: cannot parse .xtensa.info section\n"), abfd);
free (data);
}
/* This is called after the sections have been attached to output
sections, but before any sizes or addresses have been set. */
static void
elf_xtensa_before_allocation (void)
{
bfd *in_bfd;
asection *info_sec, *first_info_sec;
bfd *first_bfd;
bfd_boolean is_big_endian = XCHAL_HAVE_BE;
/* Check that the output endianness matches the Xtensa
@ -349,18 +445,80 @@ elf_xtensa_before_allocation (void)
"Xtensa configuration\n"));
}
/* Check that the endianness for each input file matches the output.
The merge_private_bfd_data hook has already reported any mismatches
as errors, but those errors are not fatal. At this point, we
cannot go any further if there are any mismatches. */
/* Keep track of the first input .xtensa.info section, and as a fallback,
the first input bfd where a .xtensa.info section could be created.
After the input .xtensa.info has been checked, the contents of the
first one will be replaced with the output .xtensa.info table. */
first_info_sec = 0;
first_bfd = 0;
for (in_bfd = link_info.input_bfds;
in_bfd != NULL;
in_bfd = in_bfd->link_next)
LANG_FOR_EACH_INPUT_STATEMENT (f)
{
if ((is_big_endian && in_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
|| (!is_big_endian && in_bfd->xvec->byteorder == BFD_ENDIAN_BIG))
einfo (_("%F%P: cross-endian linking not supported\n"));
/* Check that the endianness for each input file matches the output.
The merge_private_bfd_data hook has already reported any mismatches
as errors, but those errors are not fatal. At this point, we
cannot go any further if there are any mismatches. */
if ((is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
|| (!is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_BIG))
einfo (_("%F%P: cross-endian linking for %B not supported\n"),
f->the_bfd);
if (! first_bfd)
first_bfd = f->the_bfd;
info_sec = bfd_get_section_by_name (f->the_bfd, ".xtensa.info");
if (! info_sec)
continue;
if (! first_info_sec)
first_info_sec = info_sec;
/* Unpack the .xtensa.info section and check it against the current
Xtensa configuration. */
check_xtensa_info (f->the_bfd, info_sec);
/* Do not include this copy of .xtensa.info in the output. */
info_sec->size = 0;
info_sec->flags |= SEC_EXCLUDE;
}
/* Reuse the first .xtensa.info input section to hold the output
.xtensa.info; or, if none were found, create a new section in the
first input bfd (assuming there is one). */
info_sec = first_info_sec;
if (! info_sec && first_bfd)
{
info_sec = bfd_make_section_with_flags (first_bfd, ".xtensa.info",
SEC_HAS_CONTENTS | SEC_READONLY);
if (! info_sec)
einfo (_("%F%P: failed to create .xtensa.info section\n"));
}
if (info_sec)
{
int xtensa_info_size;
char *data;
info_sec->flags &= ~SEC_EXCLUDE;
info_sec->flags |= SEC_IN_MEMORY;
data = xmalloc (100);
sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
xtensa_info_size = strlen (data) + 1;
/* Add enough null terminators to pad to a word boundary. */
do
data[xtensa_info_size++] = 0;
while ((xtensa_info_size & 3) != 0);
info_sec->size = 12 + XTINFO_NAMESZ + xtensa_info_size;
info_sec->contents = xmalloc (info_sec->size);
bfd_put_32 (info_sec->owner, XTINFO_NAMESZ, info_sec->contents + 0);
bfd_put_32 (info_sec->owner, xtensa_info_size, info_sec->contents + 4);
bfd_put_32 (info_sec->owner, XTINFO_TYPE, info_sec->contents + 8);
memcpy (info_sec->contents + 12, XTINFO_NAME, XTINFO_NAMESZ);
memcpy (info_sec->contents + 12 + XTINFO_NAMESZ, data, xtensa_info_size);
free (data);
}
/* Enable relaxation by default if the "--no-relax" option was not