aboutsummaryrefslogtreecommitdiff
path: root/ld/relax.c
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1992-01-28 18:21:36 +0000
committerSteve Chamberlain <sac@cygnus>1992-01-28 18:21:36 +0000
commit870f54b2c887f03258f78baf5e772cb055c69b06 (patch)
tree22bef9ed29165e535059ab56d5b52a478784eda9 /ld/relax.c
parentdaa91756f11404bc87d38eb1e1a6bc9435e0326a (diff)
downloadgdb-870f54b2c887f03258f78baf5e772cb055c69b06.zip
gdb-870f54b2c887f03258f78baf5e772cb055c69b06.tar.gz
gdb-870f54b2c887f03258f78baf5e772cb055c69b06.tar.bz2
* ldgram.y: map -M behave in the same way as -Map (sets file name
to be "-". * ldsym.c, ldlang.c: remember that size of a section is dependent on whether or not relaxing has been done. * ldmain.c: don't open a map file if it doesn't have a name * relax.c: all the brains have moved into bfd. * ldwrite.c: ammend comment
Diffstat (limited to 'ld/relax.c')
-rw-r--r--ld/relax.c140
1 files changed, 1 insertions, 139 deletions
diff --git a/ld/relax.c b/ld/relax.c
index 6db5590..5500f5e 100644
--- a/ld/relax.c
+++ b/ld/relax.c
@@ -141,99 +141,6 @@ DEFUN(write_relaxnorel,(output_bfd),
-static void
-DEFUN(perform_slip,(s, slip, input_section, value),
- asymbol **s AND
- unsigned int slip AND
- asection *input_section AND
- bfd_vma value)
-{
-
- /* Find all symbols past this point, and make them know
- what's happened */
- while (*s)
- {
- asymbol *p = *s;
- if (p->section == input_section)
- {
- /* This was pointing into this section, so mangle it */
- if (p->value > value)
- {
- p->value -=2;
- }
- }
- s++;
-
- }
-}
-static int
-DEFUN(movb1,(input_section, symbols, r, shrink),
- asection *input_section AND
- asymbol **symbols AND
- arelent *r AND
- unsigned int shrink)
-{
-
-
- bfd_vma value = get_value(r, input_section);
-
- if (value >= 0xff00)
- {
-
- /* Change the reloc type from 16bit, possible 8 to 8bit
- possible 16 */
- r->howto = r->howto + 1;
- /* The place to relc moves back by one */
- r->address -=1;
-
- /* This will be two bytes smaller in the long run */
- shrink +=2 ;
- perform_slip(symbols, 2, input_section, r->address - shrink +1);
-
-
- }
- return shrink;
-}
-
-static int
-DEFUN(jmp1,(input_section, symbols, r, shrink),
- asection *input_section AND
- asymbol **symbols AND
- arelent *r AND
- unsigned int shrink)
-{
-
-
- bfd_vma value = get_value(r, 0);
-
- bfd_vma dot = input_section->output_section->vma +
- input_section->output_offset + r->address;
- bfd_vma gap;
-
- /* See if the address we're looking at within 127 bytes of where
- we are, if so then we can use a small branch rather than the
- jump we were going to */
-
- gap = value - (dot - shrink);
-
-
- if (-120 < (long)gap && (long)gap < 120 )
- {
-
- /* Change the reloc type from 16bit, possible 8 to 8bit
- possible 16 */
- r->howto = r->howto + 1;
- /* The place to relc moves back by one */
- r->address -=1;
-
- /* This will be two bytes smaller in the long run */
- shrink +=2 ;
- perform_slip(symbols, 2, input_section, r->address-shrink +1);
-
-
- }
- return shrink;
-}
/* See if we can change the size of this section by shrinking the
@@ -248,52 +155,7 @@ DEFUN(relax_section,(this_ptr),
lang_input_section_type *is = &((*this_ptr)->input_section);
asection *i = is->section;
-
- /* Get enough memory to hold the stuff */
- bfd *input_bfd = i->owner;
- asection *input_section = i;
- int shrink = 0 ;
- int new = 0;
-
- bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
- input_section);
- arelent **reloc_vector = (arelent **)ldmalloc(reloc_size);
-
- /* Get the relocs and think about them */
- if (bfd_canonicalize_reloc(input_bfd,
- input_section,
- reloc_vector,
- is->ifile->asymbols) )
- {
- arelent **parent;
- asymbol **symbols = is->ifile->asymbols;
- for (parent = reloc_vector; *parent; parent++)
- {
- arelent *r = *parent;
- switch (r->howto->type) {
- case R_MOVB2:
- case R_JMP2:
-
- shrink+=2;
- break;
-
- case R_MOVB1:
- shrink = movb1(input_section, symbols, r, shrink);
- new = 1;
-
- break;
- case R_JMP1:
- shrink = jmp1(input_section, symbols, r, shrink);
- new = 1;
-
- break;
- }
- }
-
- }
- input_section->_cooked_size -= shrink;
- free((char *)reloc_vector);
- return new;
+ return bfd_relax_section(i->owner, i, is->ifile->asymbols);
}