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 | |
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.
-rw-r--r-- | bfd/ChangeLog | 23 | ||||
-rw-r--r-- | bfd/bfd-in.h | 25 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 299 | ||||
-rw-r--r-- | bfd/bfd.c | 99 | ||||
-rw-r--r-- | bfd/section.c | 179 | ||||
-rw-r--r-- | gas/ChangeLog | 4 | ||||
-rw-r--r-- | gas/config/tc-tic6x.c | 2 | ||||
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/emultempl/xtensaelf.em | 10 | ||||
-rw-r--r-- | ld/ldlang.c | 12 | ||||
-rw-r--r-- | ld/ldlang.h | 2 |
11 files changed, 407 insertions, 259 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5222063..080c628 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,28 @@ 2019-09-20 Alan Modra <amodra@gmail.com> + * 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 <amodra@gmail.com> + * bfd-in.h (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name), (bfd_asymbol_bfd, bfd_asymbol_flavour, bfd_set_asymbol_name): Delete. * bfd.c (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name), diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index e9ada8d..969a965 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 5ac3f41..44bce06 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 { @@ -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 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, *} \ diff --git a/gas/ChangeLog b/gas/ChangeLog index bcd2f9a..482ab08 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2019-09-20 Alan Modra <amodra@gmail.com> + + * config/tc-tic6x.c (tc_gen_reloc): Correct common symbol check. + 2018-09-20 Jan Beulich <jbeulich@suse.com> PR gas/25012 diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c index 0433d9e..cd12c82 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 705a2b2..3f62dad 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,16 @@ 2019-09-20 Alan Modra <amodra@gmail.com> + * 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 <amodra@gmail.com> + * ldelf.c (ldelf_after_open, ldelf_place_orphan * ldlang.c (walk_wild_file, lang_process): Use bfd_usrdata. (load_symbols, ldlang_add_file): Use bfd_set_usrdata. diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index 569df61..0b11fdc 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 0ffcf34..1a49f69 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 9fb10f8..5ab62e3 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) { |