Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: bfd/coff-sh.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bfd/coff-rs6000.c ('k') | bfd/coff-sparc.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
None
OLDNEW
1 /* BFD back-end for Renesas Super-H COFF binaries. 1 /* BFD back-end for Renesas Super-H COFF binaries.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011 3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012
4 Free Software Foundation, Inc. 4 Free Software Foundation, Inc.
5 Contributed by Cygnus Support. 5 Contributed by Cygnus Support.
6 Written by Steve Chamberlain, <sac@cygnus.com>. 6 Written by Steve Chamberlain, <sac@cygnus.com>.
7 Relaxing code written by Ian Lance Taylor, <ian@cygnus.com>. 7 Relaxing code written by Ian Lance Taylor, <ian@cygnus.com>.
8 8
9 This file is part of BFD, the Binary File Descriptor library. 9 This file is part of BFD, the Binary File Descriptor library.
10 10
11 This program is free software; you can redistribute it and/or modify 11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by 12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation; either version 3 of the License, or 13 the Free Software Foundation; either version 3 of the License, or
(...skipping 17 matching lines...) Expand all
31 #include "coff/sh.h" 31 #include "coff/sh.h"
32 #include "coff/internal.h" 32 #include "coff/internal.h"
33 33
34 #undef bfd_pe_print_pdata 34 #undef bfd_pe_print_pdata
35 35
36 #ifdef COFF_WITH_PE 36 #ifdef COFF_WITH_PE
37 #include "coff/pe.h" 37 #include "coff/pe.h"
38 38
39 #ifndef COFF_IMAGE_WITH_PE 39 #ifndef COFF_IMAGE_WITH_PE
40 static bfd_boolean sh_align_load_span 40 static bfd_boolean sh_align_load_span
41 PARAMS ((bfd *, asection *, bfd_byte *, 41 (bfd *, asection *, bfd_byte *,
42 » bfd_boolean (*) (bfd *, asection *, PTR, bfd_byte *, bfd_vma), 42 bfd_boolean (*) (bfd *, asection *, void *, bfd_byte *, bfd_vma),
43 » PTR, bfd_vma **, bfd_vma *, bfd_vma, bfd_vma, bfd_boolean *)); 43 void *, bfd_vma **, bfd_vma *, bfd_vma, bfd_vma, bfd_boolean *);
44 44
45 #define _bfd_sh_align_load_span sh_align_load_span 45 #define _bfd_sh_align_load_span sh_align_load_span
46 #endif 46 #endif
47 47
48 #define bfd_pe_print_pdata _bfd_pe_print_ce_compressed_pdata 48 #define bfd_pe_print_pdata _bfd_pe_print_ce_compressed_pdata
49 49
50 #else 50 #else
51 51
52 #define bfd_pe_print_pdata NULL 52 #define bfd_pe_print_pdata NULL
53 53
54 #endif /* COFF_WITH_PE. */ 54 #endif /* COFF_WITH_PE. */
55 55
56 #include "libcoff.h" 56 #include "libcoff.h"
57 57
58 /* Internal functions. */ 58 /* Internal functions. */
59 static bfd_reloc_status_type sh_reloc
60 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
61 static long get_symbol_value PARAMS ((asymbol *));
62 static bfd_boolean sh_relax_section
63 PARAMS ((bfd *, asection *, struct bfd_link_info *, bfd_boolean *));
64 static bfd_boolean sh_relax_delete_bytes
65 PARAMS ((bfd *, asection *, bfd_vma, int));
66 #ifndef COFF_IMAGE_WITH_PE
67 static const struct sh_opcode *sh_insn_info PARAMS ((unsigned int));
68 #endif
69 static bfd_boolean sh_align_loads
70 PARAMS ((bfd *, asection *, struct internal_reloc *, bfd_byte *,
71 bfd_boolean *));
72 static bfd_boolean sh_swap_insns
73 PARAMS ((bfd *, asection *, PTR, bfd_byte *, bfd_vma));
74 static bfd_boolean sh_relocate_section
75 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
76 struct internal_reloc *, struct internal_syment *, asection **));
77 static bfd_byte *sh_coff_get_relocated_section_contents
78 PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
79 bfd_byte *, bfd_boolean, asymbol **));
80 static reloc_howto_type * sh_coff_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_co de_real_type));
81 59
82 #ifdef COFF_WITH_PE 60 #ifdef COFF_WITH_PE
83 /* Can't build import tables with 2**4 alignment. */ 61 /* Can't build import tables with 2**4 alignment. */
84 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 2 62 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 2
85 #else 63 #else
86 /* Default section alignment to 2**4. */ 64 /* Default section alignment to 2**4. */
87 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 4 65 #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 4
88 #endif 66 #endif
89 67
90 #ifdef COFF_IMAGE_WITH_PE 68 #ifdef COFF_IMAGE_WITH_PE
91 /* Align PE executables. */ 69 /* Align PE executables. */
92 #define COFF_PAGE_SIZE 0x1000 70 #define COFF_PAGE_SIZE 0x1000
93 #endif 71 #endif
94 72
95 /* Generate long file names. */ 73 /* Generate long file names. */
96 #define COFF_LONG_FILENAMES 74 #define COFF_LONG_FILENAMES
97 75
98 #ifdef COFF_WITH_PE 76 #ifdef COFF_WITH_PE
99 static bfd_boolean in_reloc_p PARAMS ((bfd *, reloc_howto_type *));
100 /* Return TRUE if this relocation should 77 /* Return TRUE if this relocation should
101 appear in the output .reloc section. */ 78 appear in the output .reloc section. */
102 static bfd_boolean in_reloc_p (abfd, howto) 79
103 bfd * abfd ATTRIBUTE_UNUSED; 80 static bfd_boolean
104 reloc_howto_type * howto; 81 in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
82 » reloc_howto_type * howto)
105 { 83 {
106 return ! howto->pc_relative && howto->type != R_SH_IMAGEBASE; 84 return ! howto->pc_relative && howto->type != R_SH_IMAGEBASE;
107 } 85 }
108 #endif 86 #endif
109 87
88 static bfd_reloc_status_type
89 sh_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
90 static bfd_boolean
91 sh_relocate_section (bfd *, struct bfd_link_info *, bfd *, asection *,
92 bfd_byte *, struct internal_reloc *,
93 struct internal_syment *, asection **);
94 static bfd_boolean
95 sh_align_loads (bfd *, asection *, struct internal_reloc *,
96 bfd_byte *, bfd_boolean *);
97
110 /* The supported relocations. There are a lot of relocations defined 98 /* The supported relocations. There are a lot of relocations defined
111 in coff/internal.h which we do not expect to ever see. */ 99 in coff/internal.h which we do not expect to ever see. */
112 static reloc_howto_type sh_coff_howtos[] = 100 static reloc_howto_type sh_coff_howtos[] =
113 { 101 {
114 EMPTY_HOWTO (0), 102 EMPTY_HOWTO (0),
115 EMPTY_HOWTO (1), 103 EMPTY_HOWTO (1),
116 #ifdef COFF_WITH_PE 104 #ifdef COFF_WITH_PE
117 /* Windows CE */ 105 /* Windows CE */
118 HOWTO (R_SH_IMM32CE, /* type */ 106 HOWTO (R_SH_IMM32CE, /* type */
119 0, /* rightshift */ 107 0, /* rightshift */
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 { \ 388 { \
401 dst->r_stuff[0] = 'S'; \ 389 dst->r_stuff[0] = 'S'; \
402 dst->r_stuff[1] = 'C'; \ 390 dst->r_stuff[1] = 'C'; \
403 } \ 391 } \
404 while (0) 392 while (0)
405 #endif 393 #endif
406 394
407 /* Get the value of a symbol, when performing a relocation. */ 395 /* Get the value of a symbol, when performing a relocation. */
408 396
409 static long 397 static long
410 get_symbol_value (symbol) 398 get_symbol_value (asymbol *symbol)
411 asymbol *symbol;
412 { 399 {
413 bfd_vma relocation; 400 bfd_vma relocation;
414 401
415 if (bfd_is_com_section (symbol->section)) 402 if (bfd_is_com_section (symbol->section))
416 relocation = 0; 403 relocation = 0;
417 else 404 else
418 relocation = (symbol->value + 405 relocation = (symbol->value +
419 symbol->section->output_section->vma + 406 symbol->section->output_section->vma +
420 symbol->section->output_offset); 407 symbol->section->output_offset);
421 408
422 return relocation; 409 return relocation;
423 } 410 }
424 411
425 #ifdef COFF_WITH_PE 412 #ifdef COFF_WITH_PE
426 /* Convert an rtype to howto for the COFF backend linker. 413 /* Convert an rtype to howto for the COFF backend linker.
427 Copied from coff-i386. */ 414 Copied from coff-i386. */
428 #define coff_rtype_to_howto coff_sh_rtype_to_howto 415 #define coff_rtype_to_howto coff_sh_rtype_to_howto
429 static reloc_howto_type * coff_sh_rtype_to_howto PARAMS ((bfd *, asection *, str uct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, b fd_vma *)); 416
430 417
431 static reloc_howto_type * 418 static reloc_howto_type *
432 coff_sh_rtype_to_howto (abfd, sec, rel, h, sym, addendp) 419 coff_sh_rtype_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
433 bfd * abfd ATTRIBUTE_UNUSED; 420 » » » asection * sec,
434 asection * sec; 421 » » » struct internal_reloc * rel,
435 struct internal_reloc * rel; 422 » » » struct coff_link_hash_entry * h,
436 struct coff_link_hash_entry * h; 423 » » » struct internal_syment * sym,
437 struct internal_syment * sym; 424 » » » bfd_vma * addendp)
438 bfd_vma * addendp;
439 { 425 {
440 reloc_howto_type * howto; 426 reloc_howto_type * howto;
441 427
442 howto = sh_coff_howtos + rel->r_type; 428 howto = sh_coff_howtos + rel->r_type;
443 429
444 *addendp = 0; 430 *addendp = 0;
445 431
446 if (howto->pc_relative) 432 if (howto->pc_relative)
447 *addendp += sec->vma; 433 *addendp += sec->vma;
448 434
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 { BFD_RELOC_CTOR, R_SH_IMM32 }, 487 { BFD_RELOC_CTOR, R_SH_IMM32 },
502 }; 488 };
503 #endif 489 #endif
504 490
505 /* Given a BFD reloc code, return the howto structure for the 491 /* Given a BFD reloc code, return the howto structure for the
506 corresponding SH PE reloc. */ 492 corresponding SH PE reloc. */
507 #define coff_bfd_reloc_type_lookup sh_coff_reloc_type_lookup 493 #define coff_bfd_reloc_type_lookup sh_coff_reloc_type_lookup
508 #define coff_bfd_reloc_name_lookup sh_coff_reloc_name_lookup 494 #define coff_bfd_reloc_name_lookup sh_coff_reloc_name_lookup
509 495
510 static reloc_howto_type * 496 static reloc_howto_type *
511 sh_coff_reloc_type_lookup (abfd, code) 497 sh_coff_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
512 bfd * abfd ATTRIBUTE_UNUSED; 498 » » » bfd_reloc_code_real_type code)
513 bfd_reloc_code_real_type code;
514 { 499 {
515 unsigned int i; 500 unsigned int i;
516 501
517 for (i = ARRAY_SIZE (sh_reloc_map); i--;) 502 for (i = ARRAY_SIZE (sh_reloc_map); i--;)
518 if (sh_reloc_map[i].bfd_reloc_val == code) 503 if (sh_reloc_map[i].bfd_reloc_val == code)
519 return &sh_coff_howtos[(int) sh_reloc_map[i].shcoff_reloc_val]; 504 return &sh_coff_howtos[(int) sh_reloc_map[i].shcoff_reloc_val];
520 505
521 (*_bfd_error_handler) (_("SH Error: unknown reloc type %d"), code); 506 (*_bfd_error_handler) (_("SH Error: unknown reloc type %d"), code);
522 return NULL; 507 return NULL;
523 } 508 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 || (reloc).r_type == R_SH_SWITCH32 \ 553 || (reloc).r_type == R_SH_SWITCH32 \
569 || (reloc).r_type == R_SH_USES \ 554 || (reloc).r_type == R_SH_USES \
570 || (reloc).r_type == R_SH_COUNT \ 555 || (reloc).r_type == R_SH_COUNT \
571 || (reloc).r_type == R_SH_ALIGN) \ 556 || (reloc).r_type == R_SH_ALIGN) \
572 cache_ptr->addend = (reloc).r_offset; \ 557 cache_ptr->addend = (reloc).r_offset; \
573 } 558 }
574 559
575 /* This is the howto function for the SH relocations. */ 560 /* This is the howto function for the SH relocations. */
576 561
577 static bfd_reloc_status_type 562 static bfd_reloc_status_type
578 sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, 563 sh_reloc (bfd * abfd,
579 » error_message) 564 » arelent * reloc_entry,
580 bfd *abfd; 565 » asymbol * symbol_in,
581 arelent *reloc_entry; 566 » void * data,
582 asymbol *symbol_in; 567 » asection * input_section,
583 PTR data; 568 » bfd * output_bfd,
584 asection *input_section; 569 » char ** error_message ATTRIBUTE_UNUSED)
585 bfd *output_bfd;
586 char **error_message ATTRIBUTE_UNUSED;
587 { 570 {
588 unsigned long insn; 571 unsigned long insn;
589 bfd_vma sym_value; 572 bfd_vma sym_value;
590 unsigned short r_type; 573 unsigned short r_type;
591 bfd_vma addr = reloc_entry->address; 574 bfd_vma addr = reloc_entry->address;
592 bfd_byte *hit_data = addr + (bfd_byte *) data; 575 bfd_byte *hit_data = addr + (bfd_byte *) data;
593 576
594 r_type = reloc_entry->howto->type; 577 r_type = reloc_entry->howto->type;
595 578
596 if (output_bfd != NULL) 579 if (output_bfd != NULL)
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 /* We can do relaxing. */ 646 /* We can do relaxing. */
664 #define coff_bfd_relax_section sh_relax_section 647 #define coff_bfd_relax_section sh_relax_section
665 648
666 /* We use the special COFF backend linker. */ 649 /* We use the special COFF backend linker. */
667 #define coff_relocate_section sh_relocate_section 650 #define coff_relocate_section sh_relocate_section
668 651
669 /* When relaxing, we need to use special code to get the relocated 652 /* When relaxing, we need to use special code to get the relocated
670 section contents. */ 653 section contents. */
671 #define coff_bfd_get_relocated_section_contents \ 654 #define coff_bfd_get_relocated_section_contents \
672 sh_coff_get_relocated_section_contents 655 sh_coff_get_relocated_section_contents

error: old chunk mismatch

OLDNEW
« no previous file with comments | « bfd/coff-rs6000.c ('k') | bfd/coff-sparc.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698