]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
Improve building with LTO
authorAlexander Miller <alex.miller@gmx.de>
Thu, 18 Feb 2021 02:38:56 +0000 (03:38 +0100)
committerMark Wielaard <mark@klomp.org>
Mon, 8 Nov 2021 21:33:05 +0000 (22:33 +0100)
Use symver attribute for symbol versioning instead of .symver
assembler directive when available. Convert to use double @ syntax
for default version in all cases (required when using the attribute).

Add the attributes externally_visible, no_reorder if available when
using assembler directives to improve the situation for < gcc-10.
This is not 100% reliable, though; -flto-partition=none may still be
needed in some cases.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24498
Signed-off-by: Alexander Miller <alex.miller@gmx.de>
18 files changed:
lib/ChangeLog
lib/eu-config.h
libdw/ChangeLog
libdw/dwarf_aggregate_size.c
libdw/dwarf_arrayorder.c
libdw/dwarf_bitoffset.c
libdw/dwarf_bitsize.c
libdw/dwarf_bytesize.c
libdw/dwarf_decl_column.c
libdw/dwarf_decl_file.c
libdw/dwarf_decl_line.c
libdw/dwarf_srclang.c
libdwelf/ChangeLog
libdwelf/dwelf_elf_begin.c
libdwfl/ChangeLog
libdwfl/core-file.c
libdwfl/dwfl_module_build_id.c
libdwfl/dwfl_report_elf.c

index c72452b179acaa8b1914ef451f4aa433e2226cd5..8f4d4d9f55dde8a0c8c4fa4954b90992b1701776 100644 (file)
@@ -1,3 +1,16 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+       * eu-config.h (used_in_asm): New macro.
+       (NEW_INTDEF): New macro.
+       (NEW_VERSION): Mark symbol as used_in_asm.  Use @@ symver and change
+       asm name instead.  New variant using symver attribute if available.
+       (OLD_VERSION): Update new symbol name. Indent asm directives.  New
+       variant using symver attribute.
+       (COMPAT_VERSION_NEWPROTO): Mark symbol as used_in_asm.  Reorder
+       lines.  Replace asm with __asm__ in declaration.  New variant using
+       symver attribute.
+       (COMPAT_VERSION): Likewise.
+
 2021-09-10  Colin Cross <ccross@google.com>
 
        * error.c (error): Call fflush on stdout and stderr. Setup errno and
index f0e3d07a6290727e3d2b1f742f980c51687c3bf5..c7d7cbb2ec1c415372e7ab18a2c30c3a6d23bd90 100644 (file)
@@ -176,27 +176,68 @@ asm (".section predict_data, \"aw\"; .previous\n"
 /* This macro is used by the tests conditionalize for standalone building.  */
 #define ELFUTILS_HEADER(name) <lib##name.h>
 
+/* Don't reorder with global asm blocks or optimize away. (Doesn't reliably
+   keep it in the same LTO partition, though; -flto-partition=none may be
+   still needed for some gcc versions < 10.) */
+#ifdef __has_attribute
+# if __has_attribute(no_reorder)
+#  define used_in_asm __attribute__ ((externally_visible, no_reorder))
+# endif
+#endif
+#ifndef used_in_asm
+# define used_in_asm /* empty */
+#endif
 
 #ifdef SYMBOL_VERSIONING
-# define OLD_VERSION(name, version) \
-  asm (".globl _compat." #version "." #name "\n" \
-       "_compat." #version "." #name " = " #name "\n" \
-       ".symver _compat." #version "." #name "," #name "@" #version);
-# define NEW_VERSION(name, version) \
-  asm (".symver " #name "," #name "@@@" #version);
-# define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
-  asm (".symver _compat." #version "." #name "," #name "@" #version); \
+# define NEW_INTDEF(name) __typeof (name) INTUSE(name) \
+  __attribute__ ((alias ("_new." #name))) attribute_hidden;
+# ifdef __has_attribute
+#  if __has_attribute(symver)
+#   define NEW_VERSION(name, version) \
+  __typeof (name) name __asm__ ("_new." #name) \
+    __attribute__ ((symver (#name "@@" #version)));
+#   define OLD_VERSION(name, version) _OLD_VERSION1(name, __COUNTER__, version)
+#   define _OLD_VERSION1(name, num, version) _OLD_VERSION2(name, num, version)
+#   define _OLD_VERSION2(name, num, version) \
+  __typeof (name) _compat_old##num##_##name \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((alias ("_new." #name), symver (#name "@" #version)));
+#   define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
   __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
-    asm ("_compat." #version "." #name);
-# define COMPAT_VERSION(name, version, prefix) \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((symver (#name "@" #version)));
+#   define COMPAT_VERSION(name, version, prefix) \
   asm (".symver _compat." #version "." #name "," #name "@" #version); \
-  __typeof (name) _compat_##prefix##_##name asm ("_compat." #version "." #name);
+  __typeof (name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) \
+    __attribute__ ((symver (#name "@" #version)));
+#  endif
+# endif
+# ifndef NEW_VERSION
+#  define OLD_VERSION(name, version) \
+  asm (".globl _compat." #version "." #name "\n\t" \
+       "_compat." #version "." #name " = _new." #name "\n\t" \
+       ".symver _compat." #version "." #name "," #name "@" #version);
+#  define NEW_VERSION(name, version) \
+  __typeof (name) name __asm__ ("_new." #name) used_in_asm; \
+  asm (".symver _new." #name ", " #name "@@" #version);
+#  define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
+  __typeof (_compat_##prefix##_##name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) used_in_asm; \
+  asm (".symver _compat." #version "." #name ", " #name "@" #version);
+#  define COMPAT_VERSION(name, version, prefix) \
+  __typeof (name) _compat_##prefix##_##name \
+    __asm__ ("_compat." #version "." #name) used_in_asm; \
+  asm (".symver _compat." #version "." #name ", " #name "@" #version);
+# endif
 #else
+# define NEW_INTDEF(name) INTDEF(name)
 # define OLD_VERSION(name, version) /* Nothing for static linking.  */
 # define NEW_VERSION(name, version) /* Nothing for static linking.  */
 # define COMPAT_VERSION_NEWPROTO(name, version, prefix) \
   error "should use #ifdef SYMBOL_VERSIONING"
-# define COMPAT_VERSION(name, version, prefix) error "should use #ifdef SYMBOL_VERSIONING"
+# define COMPAT_VERSION(name, version, prefix) \
+  error "should use #ifdef SYMBOL_VERSIONING"
 #endif
 
 #ifndef FALLTHROUGH
index 311f34b5fb3b2e8242e292c2496042b6b8566949..b38368338d65aa109d21a5725a66658f884072c8 100644 (file)
@@ -1,3 +1,14 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+       * dwarf_aggregate_size.c (dwarf_aggregate_size): Move NEW_VERSION
+       before definition.  Replace INTDEF with NEW_INTDEF.
+       * dwarf_srclang.c (dwarf_srclang): Likewise.
+       * dwarf_arrayorder.c (dwarf_arrayorder): Move NEW_VERSION.
+       * dwarf_bitoffset.c (dwarf_bitoffset): Likewise.
+       * dwarf_bitsize.c (dwarf_bitsize): Likewise.
+       * dwarf_bytesize.c (dwarf_bytesize): Likewise.
+       * dwarf_decl_column.c (dwarf_decl_column): Likewise.
+
 2021-10-18  Mark Wielaard  <mark@klomp.org>
 
        * dwarf_aggregate_size.c (get_type): Don't pass NULL to
index 89f2029ed7418e02962e8a83f75883c1a41d27f0..8216ae42e424927c92929e0675b5036d2550da62 100644 (file)
@@ -241,6 +241,7 @@ aggregate_size (Dwarf_Die *die, Dwarf_Word *size,
   return -1;
 }
 
+NEW_VERSION (dwarf_aggregate_size, ELFUTILS_0.161)
 int
 dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size)
 {
@@ -251,6 +252,5 @@ dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size)
 
   return aggregate_size (&die_mem, size, &type_mem, 0);
 }
-INTDEF (dwarf_aggregate_size)
+NEW_INTDEF (dwarf_aggregate_size)
 OLD_VERSION (dwarf_aggregate_size, ELFUTILS_0.144)
-NEW_VERSION (dwarf_aggregate_size, ELFUTILS_0.161)
index da64f99251e4150dccc27eeb60af38e974f9e560..782e075c126718cf73c4c961305a3bbe9555f0b5 100644 (file)
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_arrayorder, ELFUTILS_0.143)
 int
 dwarf_arrayorder (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@ dwarf_arrayorder (Dwarf_Die *die)
                                  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_arrayorder, ELFUTILS_0.122)
-NEW_VERSION (dwarf_arrayorder, ELFUTILS_0.143)
index c1a3a343d98754390c359267e801229ba8a93f44..61a0d593e6e1c80c93d189db87e2de98e2cf7d8f 100644 (file)
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bitoffset, ELFUTILS_0.143)
 int
 dwarf_bitoffset (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@ dwarf_bitoffset (Dwarf_Die *die)
                                  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bitoffset, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bitoffset, ELFUTILS_0.143)
index 0ed9b71005efb889d35544b4fb92e271a5fb153b..35e8744cbfd0601ad10c76f506850dce5c6da9b1 100644 (file)
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bitsize, ELFUTILS_0.143)
 int
 dwarf_bitsize (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@ dwarf_bitsize (Dwarf_Die *die)
                                  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bitsize, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bitsize, ELFUTILS_0.143)
index 116cd32150828b947f2304483ec54c0a806799eb..6d1ff9ae1b4035ba60ecb6a6814de8496ab10fd9 100644 (file)
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_bytesize, ELFUTILS_0.143)
 int
 dwarf_bytesize (Dwarf_Die *die)
 {
@@ -46,4 +47,3 @@ dwarf_bytesize (Dwarf_Die *die)
                                  &value) == 0 ? (int) value : -1;
 }
 OLD_VERSION (dwarf_bytesize, ELFUTILS_0.122)
-NEW_VERSION (dwarf_bytesize, ELFUTILS_0.143)
index 08d36b87aad41604b6b899c6259f0eab228084e4..3225fd18d09b295e3b4f5cb337e56e056e951090 100644 (file)
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_column, ELFUTILS_0.143)
 int
 dwarf_decl_column (Dwarf_Die *decl, int *colp)
 {
   return __libdw_attr_intval (decl, colp, DW_AT_decl_column);
 }
 OLD_VERSION (dwarf_decl_column, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_column, ELFUTILS_0.143)
index d4aa0a18e9866a24227e02e5b90fc260cdbdeb89..75662a334843f91002a3649fdd53f948518e5834 100644 (file)
@@ -36,6 +36,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_file, ELFUTILS_0.143)
 const char *
 dwarf_decl_file (Dwarf_Die *die)
 {
@@ -86,4 +87,3 @@ dwarf_decl_file (Dwarf_Die *die)
   return cu->files->info[idx].name;
 }
 OLD_VERSION (dwarf_decl_file, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_file, ELFUTILS_0.143)
index 80fae6c900175fa7c6f157cd3d3d2145a5a865a7..6b31eebe089e13a1a2782f4ccc020708c2917234 100644 (file)
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_decl_line, ELFUTILS_0.143)
 int
 dwarf_decl_line (Dwarf_Die *func, int *linep)
 {
   return __libdw_attr_intval (func, linep, DW_AT_decl_line);
 }
 OLD_VERSION (dwarf_decl_line, ELFUTILS_0.122)
-NEW_VERSION (dwarf_decl_line, ELFUTILS_0.143)
 
 
 int internal_function
index f10e7642b7654b02eca9ae43ad613e502758110a..77bd58c2f703ada471922b7316935f25d92f1f9a 100644 (file)
@@ -35,6 +35,7 @@
 #include "libdwP.h"
 
 
+NEW_VERSION (dwarf_srclang, ELFUTILS_0.143)
 int
 dwarf_srclang (Dwarf_Die *die)
 {
@@ -45,6 +46,5 @@ dwarf_srclang (Dwarf_Die *die)
                                  (die, DW_AT_language, &attr_mem),
                                  &value) == 0 ? (int) value : -1;
 }
-INTDEF (dwarf_srclang)
+NEW_INTDEF (dwarf_srclang)
 OLD_VERSION (dwarf_srclang, ELFUTILS_0.122)
-NEW_VERSION (dwarf_srclang, ELFUTILS_0.143)
index 1abee0e8934d23af9912966947f27010f6b86d3a..5f7fb4ed3625c978a02034c855e97ef5423ca418 100644 (file)
@@ -1,3 +1,8 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+       * dwelf_elf_begin.c (dwelf_elf_begin): Move NEW_VERSION before
+       definition.
+
 2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
 
        * dwelf_strtab.c (dwelf_strtab_init): Remove cast of calloc return
index c7d63a1c214ea029fa14adbe05931fb4fcb4129a..c3cfe633a8483b1be1e6a29b467572ba805a2eae 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <unistd.h>
 
+NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177)
 Elf *
 dwelf_elf_begin (int fd)
 {
@@ -61,4 +62,3 @@ dwelf_elf_begin (int fd)
   return NULL;
 }
 OLD_VERSION (dwelf_elf_begin, ELFUTILS_0.175)
-NEW_VERSION (dwelf_elf_begin, ELFUTILS_0.177)
index d35674c7bb97399029cb20464d559e0c0659be36..f7e24a211de9ed65448abc02cf664d488baa9f3a 100644 (file)
@@ -1,3 +1,10 @@
+2021-02-14  Alexander Miller  <alex.miller@gmx.de>
+
+       * core-file.c (dwfl_core_file_report): Move NEW_VERSION before
+       definition.  Replace INTDEF with NEW_INTDEF.
+       * dwfl_module_build_id.c (dwfl_module_build_id): Likewise.
+       * dwfl_report_elf.c (dwfl_report_elf): Likewise.
+
 2021-09-06  Dmitry V. Levin  <ldv@altlinux.org>
 
        * linux-pid-attach.c (read_cached_memory): Remove cast of malloc
index a0ccc9b3daf6564634ba1592d36a92ba0eeab2a1..4e4c9b3cff1a9f1f4b9b9d2ac665897a3e638a01 100644 (file)
@@ -440,6 +440,7 @@ __libdwfl_dynamic_vaddr_get (Elf *elf, GElf_Addr *vaddrp)
   return false;
 }
 
+NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
 int
 dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
 {
@@ -625,8 +626,7 @@ dwfl_core_file_report (Dwfl *dwfl, Elf *elf, const char *executable)
      error rather than just nothing found.  */
   return listed > 0 ? listed : retval;
 }
-INTDEF (dwfl_core_file_report)
-NEW_VERSION (dwfl_core_file_report, ELFUTILS_0.158)
+NEW_INTDEF (dwfl_core_file_report)
 
 #ifdef SYMBOL_VERSIONING
 int _compat_without_executable_dwfl_core_file_report (Dwfl *dwfl, Elf *elf);
index 6ca937613116be1d9b0244cdbf6dd748412bc965..0c198f23ce96da904239b4ec3e5f8e220a724b11 100644 (file)
@@ -77,6 +77,7 @@ __libdwfl_find_build_id (Dwfl_Module *mod, bool set, Elf *elf)
   return found_build_id (mod, set, build_id_bits, build_id_len, build_id_vaddr);
 }
 
+NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
 int
 dwfl_module_build_id (Dwfl_Module *mod,
                      const unsigned char **bits, GElf_Addr *vaddr)
@@ -102,8 +103,7 @@ dwfl_module_build_id (Dwfl_Module *mod,
   *vaddr = mod->build_id_vaddr;
   return mod->build_id_len;
 }
-INTDEF (dwfl_module_build_id)
-NEW_VERSION (dwfl_module_build_id, ELFUTILS_0.138)
+NEW_INTDEF (dwfl_module_build_id)
 
 #ifdef SYMBOL_VERSIONING
 COMPAT_VERSION (dwfl_module_build_id, ELFUTILS_0.130, vaddr_at_end)
index 9da86698bd1ba6c9621b2eca2218d296f57d1028..a5f0e5e55e1375e83c4a5f836e46f6f92628c840 100644 (file)
@@ -287,6 +287,7 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name,
   return m;
 }
 
+NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
 Dwfl_Module *
 dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
                 GElf_Addr base, bool add_p_vaddr)
@@ -322,8 +323,7 @@ dwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, int fd,
 
   return mod;
 }
-INTDEF (dwfl_report_elf)
-NEW_VERSION (dwfl_report_elf, ELFUTILS_0.156)
+NEW_INTDEF (dwfl_report_elf)
 
 #ifdef SYMBOL_VERSIONING
 Dwfl_Module *