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/section.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/section.c')
-rw-r--r-- | bfd/section.c | 179 |
1 files changed, 80 insertions, 99 deletions
diff --git a/bfd/section.c b/bfd/section.c index 3a9cb26..34e08ae 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -549,6 +549,53 @@ CODE_FRAGMENT . int size; .}; . +.static inline const char * +.bfd_section_name (const asection *sec) +.{ +. return sec->name; +.} +. +.static inline bfd_size_type +.bfd_section_size (const asection *sec) +.{ +. return sec->size; +.} +. +.static inline bfd_vma +.bfd_section_vma (const asection *sec) +.{ +. return sec->vma; +.} +. +.static inline bfd_vma +.bfd_section_lma (const asection *sec) +.{ +. return sec->lma; +.} +. +.static inline unsigned int +.bfd_section_alignment (const asection *sec) +.{ +. return sec->alignment_power; +.} +. +.static inline flagword +.bfd_section_flags (const asection *sec) +.{ +. return sec->flags; +.} +. +.static inline void * +.bfd_section_userdata (const asection *sec) +.{ +. return sec->userdata; +.} +.static inline bfd_boolean +.bfd_is_com_section (const asection *sec) +.{ +. return (sec->flags & SEC_IS_COMMON) != 0; +.} +. .{* Note: the following are provided as inline functions rather than macros . because not all callers use the return value. A macro implementation . would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some @@ -601,105 +648,39 @@ CODE_FRAGMENT .{* Pointer to the indirect section. *} .#define bfd_ind_section_ptr (&_bfd_std_section[3]) . -.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) -.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) -.#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) -. -.#define bfd_is_const_section(SEC) \ -. ( ((SEC) == bfd_abs_section_ptr) \ -. || ((SEC) == bfd_und_section_ptr) \ -. || ((SEC) == bfd_com_section_ptr) \ -. || ((SEC) == bfd_ind_section_ptr)) -. -.{* Macros 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. *} -.#define bfd_section_list_remove(ABFD, S) \ -. do \ -. { \ -. asection *_s = 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; \ -. } \ -. while (0) -.#define bfd_section_list_append(ABFD, S) \ -. do \ -. { \ -. asection *_s = S; \ -. bfd *_abfd = ABFD; \ -. _s->next = NULL; \ -. if (_abfd->section_last) \ -. { \ -. _s->prev = _abfd->section_last; \ -. _abfd->section_last->next = _s; \ -. } \ -. else \ -. { \ -. _s->prev = NULL; \ -. _abfd->sections = _s; \ -. } \ -. _abfd->section_last = _s; \ -. } \ -. while (0) -.#define bfd_section_list_prepend(ABFD, S) \ -. do \ -. { \ -. asection *_s = S; \ -. bfd *_abfd = ABFD; \ -. _s->prev = NULL; \ -. if (_abfd->sections) \ -. { \ -. _s->next = _abfd->sections; \ -. _abfd->sections->prev = _s; \ -. } \ -. else \ -. { \ -. _s->next = NULL; \ -. _abfd->section_last = _s; \ -. } \ -. _abfd->sections = _s; \ -. } \ -. while (0) -.#define bfd_section_list_insert_after(ABFD, A, S) \ -. do \ -. { \ -. asection *_a = A; \ -. asection *_s = S; \ -. asection *_next = _a->next; \ -. _s->next = _next; \ -. _s->prev = _a; \ -. _a->next = _s; \ -. if (_next) \ -. _next->prev = _s; \ -. else \ -. (ABFD)->section_last = _s; \ -. } \ -. while (0) -.#define bfd_section_list_insert_before(ABFD, B, S) \ -. do \ -. { \ -. asection *_b = B; \ -. asection *_s = S; \ -. asection *_prev = _b->prev; \ -. _s->prev = _prev; \ -. _s->next = _b; \ -. _b->prev = _s; \ -. if (_prev) \ -. _prev->next = _s; \ -. else \ -. (ABFD)->sections = _s; \ -. } \ -. while (0) -.#define bfd_section_removed_from_list(ABFD, S) \ -. ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S)) +.static inline bfd_boolean +.bfd_is_und_section (const asection *sec) +.{ +. return sec == bfd_und_section_ptr; +.} +. +.static inline bfd_boolean +.bfd_is_abs_section (const asection *sec) +.{ +. return sec == bfd_abs_section_ptr; +.} +. +.static inline bfd_boolean +.bfd_is_ind_section (const asection *sec) +.{ +. return sec == bfd_ind_section_ptr; +.} +. +.static inline bfd_boolean +.bfd_is_const_section (const asection *sec) +.{ +. return sec >= bfd_abs_section_ptr && sec <= bfd_ind_section_ptr; +.} +. +.{* Return TRUE if input section SEC has been discarded. *} +.static inline bfd_boolean +.discarded_section (const asection *sec) +.{ +. return (!bfd_is_abs_section (sec) +. && bfd_is_abs_section (sec->output_section) +. && sec->sec_info_type != SEC_INFO_TYPE_MERGE +. && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS); +.} . .#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \ . {* name, id, index, next, prev, flags, user_set_vma, *} \ |