bfd macro conversion to inline functions, section
authorAlan Modra <amodra@gmail.com>
Mon, 16 Sep 2019 23:29:25 +0000 (08:59 +0930)
committerAlan Modra <amodra@gmail.com>
Fri, 20 Sep 2019 08:34:03 +0000 (18:04 +0930)
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
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/bfd.c
bfd/section.c
gas/ChangeLog
gas/config/tc-tic6x.c
ld/ChangeLog
ld/emultempl/xtensaelf.em
ld/ldlang.c
ld/ldlang.h

index 5222063bf015e35b55253709762fe73eaf0df188..080c628feeb047f456303e57634ca362e3414ad8 100644 (file)
@@ -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>
 
        * bfd-in.h (bfd_asymbol_section, bfd_asymbol_value, bfd_asymbol_name),
index e9ada8d27fbd9f9562332c02035de1a39ebd6ce5..969a9657967c4a94f8aa8a78809787b4f54ab5b5 100644 (file)
@@ -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)
 \f
 typedef enum bfd_print_symbol
 {
index 5ac3f41b7adc8eb88845f0485d7177bf676dc30f..44bce06191f8c53692493c4119fb60785b331324 100644 (file)
@@ -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)
 \f
 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
 {
index 9270e118d3f5e62344553b6e7ab9d5fc6eb593be..af2c192260d4b776995b8128ac9a195c530c1c8c 100644 (file)
--- 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"
index 3a9cb26023453746e30ebf9ff56f072e53a0d141..34e08aef57eb9e02559100bb324d7df410b55923 100644 (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)
-.
-.#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,            *} \
index bcd2f9af3571c7c6b8352878b674c1959b733ec4..482ab08c2969f694d2f10ba584f63ab0017968a7 100644 (file)
@@ -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
index 0433d9e409ed9724ff6675cc687309a70faa55bf..cd12c82dce164c01d60922115f5dfc1ef13dd0dd 100644 (file)
@@ -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
index 705a2b2de8ddee488b82e7a48efb17a46a3e1a9e..3f62dad9cceaabb00c56965ea07410a221560bbd 100644 (file)
@@ -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>
 
        * ldelf.c (ldelf_after_open, ldelf_place_orphan
index 569df615ce04091150ac18e9aea505443d25ad99..0b11fdcd6988c7b0b90c3c5295e41c1b56b8794d 100644 (file)
@@ -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);
 }
 
 
index 0ffcf34473ccf8426deb355eb6370fa11169d44f..1a49f69d90800c6f9f54dc834b0aabf83db6dae1 100644 (file)
@@ -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;
index 9fb10f80a78b283309df2df9e07c69ceaad311e8..5ab62e327929b94ff762a147a1bf47dc242769d1 100644 (file)
@@ -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)
 {