X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fspuelf.em;h=1b4d72f0dfbae19b54104cd55f65b9733a9ecddb;hb=7341d5e22f1061016411734ba162d362ac5928db;hp=1b549ada10132081b0d032a76134e8cb16fa15f3;hpb=cdc83fba739acf894c08d5aa92746f30e552c465;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/spuelf.em b/ld/emultempl/spuelf.em index 1b549ada10..1b4d72f0df 100644 --- a/ld/emultempl/spuelf.em +++ b/ld/emultempl/spuelf.em @@ -1,5 +1,5 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is part of the GNU Binutils. # @@ -37,12 +37,12 @@ static struct spu_elf_params params = &spu_elf_load_ovl_mgr, &spu_elf_open_overlay_script, &spu_elf_relink, - 0, ovly_normal, 0, 0, 0, 0, 0, 0, 0, + 0, ovly_normal, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3ffff, 1, 0, 16, 0, 0, 2000 }; -static unsigned int no_overlays = 0; +static unsigned int no_overlays = 0; static unsigned int num_lines_set = 0; static unsigned int line_size_set = 0; static char *auto_overlay_file = 0; @@ -89,9 +89,9 @@ static const struct _ovl_stream icache_mgr_stream = { static int is_spu_target (void) { - extern const bfd_target bfd_elf32_spu_vec; + extern const bfd_target spu_elf32_vec; - return link_info.output_bfd->xvec == &bfd_elf32_spu_vec; + return link_info.output_bfd->xvec == &spu_elf32_vec; } /* Create our note section. */ @@ -137,8 +137,9 @@ spu_place_special_section (asection *s, asection *o, const char *output_name) lang_output_section_statement_type *os; if (o != NULL) - output_name = o->name; - os = lang_output_section_find (output_name); + os = lang_output_section_get (o); + else + os = lang_output_section_find (output_name); if (os == NULL) { os = gld${EMULATION_NAME}_place_orphan (s, output_name, 0); @@ -150,7 +151,7 @@ spu_place_special_section (asection *s, asection *o, const char *output_name) lang_statement_list_type add; lang_list_init (&add); - lang_add_section (&add, s, os); + lang_add_section (&add, s, NULL, os); *add.tail = os->children.head; os->children.head = add.head; } @@ -164,10 +165,10 @@ spu_place_special_section (asection *s, asection *o, const char *output_name) push_stat_ptr (&os->children); e_size = exp_intop (params.line_size - s->size); - lang_add_assignment (exp_assop ('=', ".", e_size)); + lang_add_assignment (exp_assign (".", e_size, FALSE)); pop_stat_ptr (); } - lang_add_section (&os->children, s, os); + lang_add_section (&os->children, s, NULL, os); } s->output_section->size += s->size; @@ -316,6 +317,10 @@ spu_before_allocation (void) lang_reset_memory_regions (); } + if (is_spu_target () + && !link_info.relocatable) + spu_elf_size_sections (link_info.output_bfd, &link_info); + gld${EMULATION_NAME}_before_allocation (); } @@ -351,7 +356,7 @@ new_tmp_file (char **fname) *fname = mktemp (*fname); if (*fname == NULL) return -1; - fd = open (fname, O_RDWR | O_CREAT | O_EXCL, 0600); + fd = open (*fname, O_RDWR | O_CREAT | O_EXCL, 0600); #endif return fd; } @@ -379,9 +384,13 @@ spu_elf_open_overlay_script (void) return script; } +#include + static void spu_elf_relink (void) { + const char *pex_return; + int status; char **argv = xmalloc ((my_argc + 4) * sizeof (*argv)); memcpy (argv, my_argv, my_argc * sizeof (*argv)); @@ -392,9 +401,16 @@ spu_elf_relink (void) argv[my_argc++] = "-T"; argv[my_argc++] = auto_overlay_file; argv[my_argc] = 0; - execvp (argv[0], (char *const *) argv); - perror (argv[0]); - _exit (127); + + pex_return = pex_one (PEX_SEARCH | PEX_LAST, (const char *) argv[0], + (char * const *) argv, (const char *) argv[0], + NULL, NULL, & status, & errno); + if (pex_return != NULL) + { + perror (pex_return); + _exit (127); + } + exit (status); } /* Final emulation specific call. */ @@ -402,12 +418,6 @@ spu_elf_relink (void) static void gld${EMULATION_NAME}_finish (void) { - int need_laying_out; - - need_laying_out = bfd_elf_discard_info (link_info.output_bfd, &link_info); - - gld${EMULATION_NAME}_map_segments (need_laying_out); - if (is_spu_target ()) { if (params.local_store_lo < params.local_store_hi) @@ -437,7 +447,7 @@ EOF if grep -q 'ld_elf.*ppc.*_emulation' ldemul-list.h; then fragment < +#include "safe-ctype.h" #include "filenames.h" #include "libiberty.h" @@ -525,7 +535,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags) cmd[3] = entry->the_bfd->filename; cmd[4] = oname; cmd[5] = NULL; - if (trace_file_tries) + if (verbose) { info_msg (_("running: %s \"%s\" \"%s\" \"%s\" \"%s\"\n"), cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); @@ -541,7 +551,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags) pex_return = pex_one (PEX_SEARCH | PEX_LAST, cmd[0], (char *const *) cmd, cmd[0], NULL, NULL, &status, &errno); } - if (NULL != pex_return) { + if (NULL != pex_return) { perror (pex_return); _exit (127); } @@ -569,7 +579,7 @@ embedded_spu_file (lang_input_statement_type *entry, const char *flags) /* Ensure bfd sections are excluded from the output. */ bfd_section_list_clear (entry->the_bfd); - entry->loaded = TRUE; + entry->flags.loaded = TRUE; return TRUE; } @@ -600,6 +610,7 @@ PARSE_AND_LIST_PROLOGUE=' #define OPTION_SPU_RESERVED_SPACE (OPTION_SPU_FIXED_SPACE + 1) #define OPTION_SPU_EXTRA_STACK (OPTION_SPU_RESERVED_SPACE + 1) #define OPTION_SPU_NO_AUTO_OVERLAY (OPTION_SPU_EXTRA_STACK + 1) +#define OPTION_SPU_EMIT_FIXUPS (OPTION_SPU_NO_AUTO_OVERLAY + 1) ' PARSE_AND_LIST_LONGOPTS=' @@ -625,6 +636,7 @@ PARSE_AND_LIST_LONGOPTS=' { "reserved-space", required_argument, NULL, OPTION_SPU_RESERVED_SPACE }, { "extra-stack-space", required_argument, NULL, OPTION_SPU_EXTRA_STACK }, { "no-auto-overlay", optional_argument, NULL, OPTION_SPU_NO_AUTO_OVERLAY }, + { "emit-fixups", optional_argument, NULL, OPTION_SPU_EMIT_FIXUPS }, ' PARSE_AND_LIST_OPTIONS=' @@ -812,6 +824,10 @@ PARSE_AND_LIST_ARGS_CASES=' break; } break; + + case OPTION_SPU_EMIT_FIXUPS: + params.emit_fixups = 1; + break; ' LDEMUL_AFTER_OPEN=spu_after_open