diff options
author | Alan Modra <amodra@gmail.com> | 2019-09-17 08:59:25 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-09-20 18:04:03 +0930 |
commit | a48931cc2df9f87596d93b319236c73ef0fe0f4e (patch) | |
tree | 8a344cb919102bf891b6b172cde5548bfdc45f6e /bfd/bfd.c | |
parent | af30dc128be191dc6179763203035ff62c634284 (diff) | |
download | gdb-a48931cc2df9f87596d93b319236c73ef0fe0f4e.zip gdb-a48931cc2df9f87596d93b319236c73ef0fe0f4e.tar.gz gdb-a48931cc2df9f87596d93b319236c73ef0fe0f4e.tar.bz2 |
bfd macro conversion to inline functions, section
This one exposed a bug in tic6x gas, found with inline function
parameter type checking. struct bfd_section and struct bfd_symbol
both have a flags field, so bfd_is_com_section (symbol) compiled OK
when bfd_is_com_section was a macro but didn't special case common
symbols.
bfd/
* bfd-in.h (bfd_section_name, bfd_section_size, bfd_section_vma),
(bfd_section_lma, bfd_section_alignment, bfd_section_flags),
(bfd_section_userdata, bfd_is_com_section, discarded_section),
(bfd_get_section_limit_octets, bfd_get_section_limit): Delete macros.
* bfd.c (bfd_get_section_limit_octets, bfd_get_section_limit),
(bfd_section_list_remove, bfd_section_list_append),
(bfd_section_list_prepend, bfd_section_list_insert_after),
(bfd_section_list_insert_before, bfd_section_removed_from_list):
New inline functions.
* section.c (bfd_is_und_section, bfd_is_abs_section),
(bfd_is_ind_section, bfd_is_const_section, bfd_section_list_remove),
(bfd_section_list_append, bfd_section_list_prepend),
(bfd_section_list_insert_after, bfd_section_list_insert_before),
(bfd_section_removed_from_list): Delete macros.
(bfd_section_name, bfd_section_size, bfd_section_vma),
(bfd_section_lma, bfd_section_alignment, bfd_section_flags),
(bfd_section_userdata, bfd_is_com_section, bfd_is_und_section),
(bfd_is_abs_section, bfd_is_ind_section, bfd_is_const_section),
(discarded_section): New inline functions.
* bfd-in2.h: Regenerate.
gas/
* config/tc-tic6x.c (tc_gen_reloc): Correct common symbol check.
ld/
* emultempl/xtensaelf.em (xtensa_get_section_deps): Comment.
Use bfd_section_userdata.
(xtensa_set_section_deps): Use bfd_set_section_userdata.
* ldlang.c (lang_output_section_get): Use bfd_section_userdata.
(sort_def_symbol): Likewise, and bfd_set_section_userdata.
(init_os): Use bfd_set_section_userdata.
(print_all_symbols): Use bfd_section_userdata.
* ldlang.h (get_userdata): Delete.
Diffstat (limited to 'bfd/bfd.c')
-rw-r--r-- | bfd/bfd.c | 99 |
1 files changed, 99 insertions, 0 deletions
@@ -477,6 +477,105 @@ CODE_FRAGMENT . sy->name = name; .} . +.static inline bfd_size_type +.bfd_get_section_limit_octets (const bfd *abfd, const asection *sec) +.{ +. if (abfd->direction != write_direction && sec->rawsize != 0) +. return sec->rawsize; +. return sec->size; +.} +. +.{* Find the address one past the end of SEC. *} +.static inline bfd_size_type +.bfd_get_section_limit (const bfd *abfd, const asection *sec) +.{ +. return bfd_get_section_limit_octets (abfd, sec) / bfd_octets_per_byte (abfd); +.} +. +.{* Functions to handle insertion and deletion of a bfd's sections. These +. only handle the list pointers, ie. do not adjust section_count, +. target_index etc. *} +.static inline void +.bfd_section_list_remove (bfd *abfd, asection *s) +.{ +. asection *next = s->next; +. asection *prev = s->prev; +. if (prev) +. prev->next = next; +. else +. abfd->sections = next; +. if (next) +. next->prev = prev; +. else +. abfd->section_last = prev; +.} +. +.static inline void +.bfd_section_list_append (bfd *abfd, asection *s) +.{ +. s->next = 0; +. if (abfd->section_last) +. { +. s->prev = abfd->section_last; +. abfd->section_last->next = s; +. } +. else +. { +. s->prev = 0; +. abfd->sections = s; +. } +. abfd->section_last = s; +.} +. +.static inline void +.bfd_section_list_prepend (bfd *abfd, asection *s) +.{ +. s->prev = 0; +. if (abfd->sections) +. { +. s->next = abfd->sections; +. abfd->sections->prev = s; +. } +. else +. { +. s->next = 0; +. abfd->section_last = s; +. } +. abfd->sections = s; +.} +. +.static inline void +.bfd_section_list_insert_after (bfd *abfd, asection *a, asection *s) +.{ +. asection *next = a->next; +. s->next = next; +. s->prev = a; +. a->next = s; +. if (next) +. next->prev = s; +. else +. abfd->section_last = s; +.} +. +.static inline void +.bfd_section_list_insert_before (bfd *abfd, asection *b, asection *s) +.{ +. asection *prev = b->prev; +. s->prev = prev; +. s->next = b; +. b->prev = s; +. if (prev) +. prev->next = s; +. else +. abfd->sections = s; +.} +. +.static inline bfd_boolean +.bfd_section_removed_from_list (const bfd *abfd, const asection *s) +.{ +. return s->next ? s->next->prev != s : abfd->section_last != s; +.} +. */ #include "sysdep.h" |