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.
This commit is contained in:
Alan Modra
2019-09-17 08:59:25 +09:30
parent af30dc128b
commit a48931cc2d
11 changed files with 405 additions and 257 deletions

View File

@@ -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)
.static inline bfd_boolean
.bfd_is_und_section (const asection *sec)
.{
. return sec == bfd_und_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))
.static inline bfd_boolean
.bfd_is_abs_section (const asection *sec)
.{
. return sec == bfd_abs_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_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, *} \