From a48931cc2df9f87596d93b319236c73ef0fe0f4e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 17 Sep 2019 08:59:25 +0930 Subject: [PATCH] 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. --- bfd/ChangeLog | 23 +++ bfd/bfd-in.h | 25 ---- bfd/bfd-in2.h | 299 ++++++++++++++++++++++---------------- bfd/bfd.c | 99 +++++++++++++ bfd/section.c | 179 ++++++++++------------- gas/ChangeLog | 4 + gas/config/tc-tic6x.c | 2 +- ld/ChangeLog | 11 ++ ld/emultempl/xtensaelf.em | 10 +- ld/ldlang.c | 12 +- ld/ldlang.h | 2 - 11 files changed, 407 insertions(+), 259 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5222063bf01..080c628feeb 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,26 @@ +2019-09-20 Alan Modra + + * 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. + 2019-09-20 Alan Modra * bfd-in.h (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name), diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index e9ada8d27fb..969a9657967 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -285,31 +285,6 @@ typedef struct bfd_section *sec_ptr; ((((bfd_vma) (this) + (boundary) - 1) >= (bfd_vma) (this)) \ ? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \ : ~ (bfd_vma) 0) - -#define bfd_section_name(sec) ((sec)->name) -#define bfd_section_size(sec) ((sec)->size) -#define bfd_section_vma(sec) ((sec)->vma) -#define bfd_section_lma(sec) ((sec)->lma) -#define bfd_section_alignment(sec) ((sec)->alignment_power) -#define bfd_section_flags(sec) ((sec)->flags) -#define bfd_section_userdata(sec) ((sec)->userdata) - -#define bfd_is_com_section(sec) (((sec)->flags & SEC_IS_COMMON) != 0) - -#define bfd_get_section_limit_octets(bfd, sec) \ - ((bfd)->direction != write_direction && (sec)->rawsize != 0 \ - ? (sec)->rawsize : (sec)->size) - -/* Find the address one past the end of SEC. */ -#define bfd_get_section_limit(bfd, sec) \ - (bfd_get_section_limit_octets(bfd, sec) / bfd_octets_per_byte (bfd)) - -/* Return TRUE if input section SEC has been discarded. */ -#define discarded_section(sec) \ - (!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) typedef enum bfd_print_symbol { diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 5ac3f41b7ad..44bce06191f 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -292,31 +292,6 @@ typedef struct bfd_section *sec_ptr; ((((bfd_vma) (this) + (boundary) - 1) >= (bfd_vma) (this)) \ ? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \ : ~ (bfd_vma) 0) - -#define bfd_section_name(sec) ((sec)->name) -#define bfd_section_size(sec) ((sec)->size) -#define bfd_section_vma(sec) ((sec)->vma) -#define bfd_section_lma(sec) ((sec)->lma) -#define bfd_section_alignment(sec) ((sec)->alignment_power) -#define bfd_section_flags(sec) ((sec)->flags) -#define bfd_section_userdata(sec) ((sec)->userdata) - -#define bfd_is_com_section(sec) (((sec)->flags & SEC_IS_COMMON) != 0) - -#define bfd_get_section_limit_octets(bfd, sec) \ - ((bfd)->direction != write_direction && (sec)->rawsize != 0 \ - ? (sec)->rawsize : (sec)->size) - -/* Find the address one past the end of SEC. */ -#define bfd_get_section_limit(bfd, sec) \ - (bfd_get_section_limit_octets(bfd, sec) / bfd_octets_per_byte (bfd)) - -/* Return TRUE if input section SEC has been discarded. */ -#define discarded_section(sec) \ - (!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) typedef enum bfd_print_symbol { @@ -1686,6 +1661,53 @@ struct relax_table { 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 @@ -1738,105 +1760,39 @@ extern asection _bfd_std_section[4]; /* 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, */ \ @@ -7398,6 +7354,105 @@ bfd_set_asymbol_name (asymbol *sy, const char *name) 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; +} + typedef enum bfd_error { diff --git a/bfd/bfd.c b/bfd/bfd.c index 9270e118d3f..af2c192260d 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -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" diff --git a/bfd/section.c b/bfd/section.c index 3a9cb260234..34e08aef57e 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, *} \ diff --git a/gas/ChangeLog b/gas/ChangeLog index bcd2f9af357..482ab08c296 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2019-09-20 Alan Modra + + * config/tc-tic6x.c (tc_gen_reloc): Correct common symbol check. + 2018-09-20 Jan Beulich PR gas/25012 diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c index 0433d9e409e..cd12c82dce1 100644 --- a/gas/config/tc-tic6x.c +++ b/gas/config/tc-tic6x.c @@ -4526,7 +4526,7 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace) { reloc->addend += reloc->address; - if (!bfd_is_com_section (symbol)) + if (!bfd_is_com_section (bfd_asymbol_section (symbol))) reloc->addend -= symbol->value; } if (r_type == BFD_RELOC_C6000_PCR_H16 diff --git a/ld/ChangeLog b/ld/ChangeLog index 705a2b2de8d..3f62dad9cce 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2019-09-20 Alan Modra + + * 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. + 2019-09-20 Alan Modra * ldelf.c (ldelf_after_open, ldelf_place_orphan diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index 569df615ce0..0b11fdcd698 100644 --- a/ld/emultempl/xtensaelf.em +++ b/ld/emultempl/xtensaelf.em @@ -596,8 +596,12 @@ xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, /* We have a separate function for this so that we could in the future keep a completely independent structure that maps a section to its dependence edges. - For now, we place these in the sec->userdata field. */ - reloc_deps_section *sec_deps = sec->userdata; + For now, we place these in the sec->userdata field. + This doesn't clash with ldlang.c use of userdata for output + sections, and during map output for input sections, since the + xtensa use is only for input sections and only extant in + before_allocation. */ + reloc_deps_section *sec_deps = bfd_section_userdata (sec); return sec_deps; } @@ -606,7 +610,7 @@ xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, asection *sec, reloc_deps_section *deps_section) { - sec->userdata = deps_section; + bfd_set_section_userdata (sec, deps_section); } diff --git a/ld/ldlang.c b/ld/ldlang.c index 0ffcf34473c..1a49f69d908 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1414,7 +1414,7 @@ lang_memory_default (asection *section) lang_output_section_statement_type * lang_output_section_get (const asection *output_section) { - return get_userdata (output_section); + return bfd_section_userdata (output_section); } /* Find or create an output_section_statement with the given NAME. @@ -2316,12 +2316,11 @@ sort_def_symbol (struct bfd_link_hash_entry *hash_entry, input_section_userdata_type *ud; struct map_symbol_def *def; - ud = ((input_section_userdata_type *) - get_userdata (hash_entry->u.def.section)); + ud = bfd_section_userdata (hash_entry->u.def.section); if (!ud) { ud = stat_alloc (sizeof (*ud)); - get_userdata (hash_entry->u.def.section) = ud; + bfd_set_section_userdata (hash_entry->u.def.section, ud); ud->map_symbol_def_tail = &ud->map_symbol_def_head; ud->map_symbol_def_count = 0; } @@ -2361,7 +2360,7 @@ init_os (lang_output_section_statement_type *s, flagword flags) /* Set the userdata of the output section to the output section statement to avoid lookup. */ - get_userdata (s->bfd_section) = s; + bfd_set_section_userdata (s->bfd_section, s); /* If there is a base address, make sure that any sections it might mention are initialized. */ @@ -4390,8 +4389,7 @@ hash_entry_addr_cmp (const void *a, const void *b) static void print_all_symbols (asection *sec) { - input_section_userdata_type *ud - = (input_section_userdata_type *) get_userdata (sec); + input_section_userdata_type *ud = bfd_section_userdata (sec); struct map_symbol_def *def; struct bfd_link_hash_entry **entries; unsigned int i; diff --git a/ld/ldlang.h b/ld/ldlang.h index 9fb10f80a78..5ab62e32792 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -329,8 +329,6 @@ typedef struct input_section_userdata_struct unsigned long map_symbol_def_count; } input_section_userdata_type; -#define get_userdata(x) ((x)->userdata) - static inline bfd_boolean bfd_input_just_syms (const bfd *abfd) { -- 2.30.2