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:
parent
af30dc128b
commit
a48931cc2d
@ -1,3 +1,26 @@
|
|||||||
|
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>
|
2019-09-20 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* bfd-in.h (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name),
|
* bfd-in.h (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name),
|
||||||
|
25
bfd/bfd-in.h
25
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) (this)) \
|
||||||
? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \
|
? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \
|
||||||
: ~ (bfd_vma) 0)
|
: ~ (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
|
typedef enum bfd_print_symbol
|
||||||
{
|
{
|
||||||
|
299
bfd/bfd-in2.h
299
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) (this)) \
|
||||||
? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \
|
? (((bfd_vma) (this) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary)-1)) \
|
||||||
: ~ (bfd_vma) 0)
|
: ~ (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
|
typedef enum bfd_print_symbol
|
||||||
{
|
{
|
||||||
@ -1686,6 +1661,53 @@ struct relax_table {
|
|||||||
int size;
|
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
|
/* Note: the following are provided as inline functions rather than macros
|
||||||
because not all callers use the return value. A macro implementation
|
because not all callers use the return value. A macro implementation
|
||||||
would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
|
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. */
|
/* Pointer to the indirect section. */
|
||||||
#define bfd_ind_section_ptr (&_bfd_std_section[3])
|
#define bfd_ind_section_ptr (&_bfd_std_section[3])
|
||||||
|
|
||||||
#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
|
static inline bfd_boolean
|
||||||
#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
|
bfd_is_und_section (const asection *sec)
|
||||||
#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
|
{
|
||||||
|
return sec == bfd_und_section_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
#define bfd_is_const_section(SEC) \
|
static inline bfd_boolean
|
||||||
( ((SEC) == bfd_abs_section_ptr) \
|
bfd_is_abs_section (const asection *sec)
|
||||||
|| ((SEC) == bfd_und_section_ptr) \
|
{
|
||||||
|| ((SEC) == bfd_com_section_ptr) \
|
return sec == bfd_abs_section_ptr;
|
||||||
|| ((SEC) == bfd_ind_section_ptr))
|
}
|
||||||
|
|
||||||
/* Macros to handle insertion and deletion of a bfd's sections. These
|
static inline bfd_boolean
|
||||||
only handle the list pointers, ie. do not adjust section_count,
|
bfd_is_ind_section (const asection *sec)
|
||||||
target_index etc. */
|
{
|
||||||
#define bfd_section_list_remove(ABFD, S) \
|
return sec == bfd_ind_section_ptr;
|
||||||
do \
|
}
|
||||||
{ \
|
|
||||||
asection *_s = S; \
|
static inline bfd_boolean
|
||||||
asection *_next = _s->next; \
|
bfd_is_const_section (const asection *sec)
|
||||||
asection *_prev = _s->prev; \
|
{
|
||||||
if (_prev) \
|
return sec >= bfd_abs_section_ptr && sec <= bfd_ind_section_ptr;
|
||||||
_prev->next = _next; \
|
}
|
||||||
else \
|
|
||||||
(ABFD)->sections = _next; \
|
/* Return TRUE if input section SEC has been discarded. */
|
||||||
if (_next) \
|
static inline bfd_boolean
|
||||||
_next->prev = _prev; \
|
discarded_section (const asection *sec)
|
||||||
else \
|
{
|
||||||
(ABFD)->section_last = _prev; \
|
return (!bfd_is_abs_section (sec)
|
||||||
} \
|
&& bfd_is_abs_section (sec->output_section)
|
||||||
while (0)
|
&& sec->sec_info_type != SEC_INFO_TYPE_MERGE
|
||||||
#define bfd_section_list_append(ABFD, S) \
|
&& sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS);
|
||||||
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))
|
|
||||||
|
|
||||||
#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \
|
#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \
|
||||||
/* name, id, index, next, prev, flags, user_set_vma, */ \
|
/* 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;
|
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
|
typedef enum bfd_error
|
||||||
{
|
{
|
||||||
|
99
bfd/bfd.c
99
bfd/bfd.c
@ -477,6 +477,105 @@ CODE_FRAGMENT
|
|||||||
. sy->name = 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;
|
||||||
|
.}
|
||||||
|
.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
|
175
bfd/section.c
175
bfd/section.c
@ -549,6 +549,53 @@ CODE_FRAGMENT
|
|||||||
. int size;
|
. 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
|
.{* Note: the following are provided as inline functions rather than macros
|
||||||
. because not all callers use the return value. A macro implementation
|
. because not all callers use the return value. A macro implementation
|
||||||
. would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
|
. would use a comma expression, eg: "((ptr)->foo = val, TRUE)" and some
|
||||||
@ -601,105 +648,39 @@ CODE_FRAGMENT
|
|||||||
.{* Pointer to the indirect section. *}
|
.{* Pointer to the indirect section. *}
|
||||||
.#define bfd_ind_section_ptr (&_bfd_std_section[3])
|
.#define bfd_ind_section_ptr (&_bfd_std_section[3])
|
||||||
.
|
.
|
||||||
.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr)
|
.static inline bfd_boolean
|
||||||
.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr)
|
.bfd_is_und_section (const asection *sec)
|
||||||
.#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr)
|
.{
|
||||||
|
. return sec == bfd_und_section_ptr;
|
||||||
|
.}
|
||||||
.
|
.
|
||||||
.#define bfd_is_const_section(SEC) \
|
.static inline bfd_boolean
|
||||||
. ( ((SEC) == bfd_abs_section_ptr) \
|
.bfd_is_abs_section (const asection *sec)
|
||||||
. || ((SEC) == bfd_und_section_ptr) \
|
.{
|
||||||
. || ((SEC) == bfd_com_section_ptr) \
|
. return sec == bfd_abs_section_ptr;
|
||||||
. || ((SEC) == bfd_ind_section_ptr))
|
.}
|
||||||
.
|
.
|
||||||
.{* Macros to handle insertion and deletion of a bfd's sections. These
|
.static inline bfd_boolean
|
||||||
. only handle the list pointers, ie. do not adjust section_count,
|
.bfd_is_ind_section (const asection *sec)
|
||||||
. target_index etc. *}
|
.{
|
||||||
.#define bfd_section_list_remove(ABFD, S) \
|
. return sec == bfd_ind_section_ptr;
|
||||||
. do \
|
.}
|
||||||
. { \
|
.
|
||||||
. asection *_s = S; \
|
.static inline bfd_boolean
|
||||||
. asection *_next = _s->next; \
|
.bfd_is_const_section (const asection *sec)
|
||||||
. asection *_prev = _s->prev; \
|
.{
|
||||||
. if (_prev) \
|
. return sec >= bfd_abs_section_ptr && sec <= bfd_ind_section_ptr;
|
||||||
. _prev->next = _next; \
|
.}
|
||||||
. else \
|
.
|
||||||
. (ABFD)->sections = _next; \
|
.{* Return TRUE if input section SEC has been discarded. *}
|
||||||
. if (_next) \
|
.static inline bfd_boolean
|
||||||
. _next->prev = _prev; \
|
.discarded_section (const asection *sec)
|
||||||
. else \
|
.{
|
||||||
. (ABFD)->section_last = _prev; \
|
. return (!bfd_is_abs_section (sec)
|
||||||
. } \
|
. && bfd_is_abs_section (sec->output_section)
|
||||||
. while (0)
|
. && sec->sec_info_type != SEC_INFO_TYPE_MERGE
|
||||||
.#define bfd_section_list_append(ABFD, S) \
|
. && sec->sec_info_type != SEC_INFO_TYPE_JUST_SYMS);
|
||||||
. 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))
|
|
||||||
.
|
.
|
||||||
.#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \
|
.#define BFD_FAKE_SECTION(SEC, SYM, NAME, IDX, FLAGS) \
|
||||||
. {* name, id, index, next, prev, flags, user_set_vma, *} \
|
. {* name, id, index, next, prev, flags, user_set_vma, *} \
|
||||||
|
@ -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>
|
2018-09-20 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
PR gas/25012
|
PR gas/25012
|
||||||
|
@ -4526,7 +4526,7 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
|
|||||||
if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
|
if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
|
||||||
{
|
{
|
||||||
reloc->addend += reloc->address;
|
reloc->addend += reloc->address;
|
||||||
if (!bfd_is_com_section (symbol))
|
if (!bfd_is_com_section (bfd_asymbol_section (symbol)))
|
||||||
reloc->addend -= symbol->value;
|
reloc->addend -= symbol->value;
|
||||||
}
|
}
|
||||||
if (r_type == BFD_RELOC_C6000_PCR_H16
|
if (r_type == BFD_RELOC_C6000_PCR_H16
|
||||||
|
11
ld/ChangeLog
11
ld/ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
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>
|
2019-09-20 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* ldelf.c (ldelf_after_open, ldelf_place_orphan
|
* ldelf.c (ldelf_after_open, ldelf_place_orphan
|
||||||
|
@ -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 have a separate function for this so that
|
||||||
we could in the future keep a completely independent
|
we could in the future keep a completely independent
|
||||||
structure that maps a section to its dependence edges.
|
structure that maps a section to its dependence edges.
|
||||||
For now, we place these in the sec->userdata field. */
|
For now, we place these in the sec->userdata field.
|
||||||
reloc_deps_section *sec_deps = sec->userdata;
|
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;
|
return sec_deps;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -606,7 +610,7 @@ xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
|
|||||||
asection *sec,
|
asection *sec,
|
||||||
reloc_deps_section *deps_section)
|
reloc_deps_section *deps_section)
|
||||||
{
|
{
|
||||||
sec->userdata = deps_section;
|
bfd_set_section_userdata (sec, deps_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
12
ld/ldlang.c
12
ld/ldlang.c
@ -1414,7 +1414,7 @@ lang_memory_default (asection *section)
|
|||||||
lang_output_section_statement_type *
|
lang_output_section_statement_type *
|
||||||
lang_output_section_get (const asection *output_section)
|
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.
|
/* 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;
|
input_section_userdata_type *ud;
|
||||||
struct map_symbol_def *def;
|
struct map_symbol_def *def;
|
||||||
|
|
||||||
ud = ((input_section_userdata_type *)
|
ud = bfd_section_userdata (hash_entry->u.def.section);
|
||||||
get_userdata (hash_entry->u.def.section));
|
|
||||||
if (!ud)
|
if (!ud)
|
||||||
{
|
{
|
||||||
ud = stat_alloc (sizeof (*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_tail = &ud->map_symbol_def_head;
|
||||||
ud->map_symbol_def_count = 0;
|
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
|
/* Set the userdata of the output section to the output section
|
||||||
statement to avoid lookup. */
|
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
|
/* If there is a base address, make sure that any sections it might
|
||||||
mention are initialized. */
|
mention are initialized. */
|
||||||
@ -4390,8 +4389,7 @@ hash_entry_addr_cmp (const void *a, const void *b)
|
|||||||
static void
|
static void
|
||||||
print_all_symbols (asection *sec)
|
print_all_symbols (asection *sec)
|
||||||
{
|
{
|
||||||
input_section_userdata_type *ud
|
input_section_userdata_type *ud = bfd_section_userdata (sec);
|
||||||
= (input_section_userdata_type *) get_userdata (sec);
|
|
||||||
struct map_symbol_def *def;
|
struct map_symbol_def *def;
|
||||||
struct bfd_link_hash_entry **entries;
|
struct bfd_link_hash_entry **entries;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -329,8 +329,6 @@ typedef struct input_section_userdata_struct
|
|||||||
unsigned long map_symbol_def_count;
|
unsigned long map_symbol_def_count;
|
||||||
} input_section_userdata_type;
|
} input_section_userdata_type;
|
||||||
|
|
||||||
#define get_userdata(x) ((x)->userdata)
|
|
||||||
|
|
||||||
static inline bfd_boolean
|
static inline bfd_boolean
|
||||||
bfd_input_just_syms (const bfd *abfd)
|
bfd_input_just_syms (const bfd *abfd)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user