Implement GCC 10 style symbol versioning (#545)
authorTom Callaway <spotrh@gmail.com>
Fri, 11 Sep 2020 09:15:43 +0000 (05:15 -0400)
committerGitHub <noreply@github.com>
Fri, 11 Sep 2020 09:15:43 +0000 (10:15 +0100)
.travis.yml
lib/fuse.c
lib/fuse_loop_mt.c
lib/fuse_misc.h
meson.build
test/travis-build.sh

index bb1fbf926e361d9bddfa2b15f4fa696593a31bb2..48a92ff3a82056cbb3b2887425d4ec31bfd730f9 100644 (file)
@@ -1,5 +1,5 @@
 sudo: required
-dist: xenial
+dist: bionic
 
 language:
     - c
@@ -13,8 +13,10 @@ addons:
     - valgrind
     - clang
     - libstdc++-7-dev 
+    - libstdc++-10-dev
     - gcc
     - gcc-7
+    - gcc-10
     - python3-pip
     - python3-setuptools
     - ninja-build
index b0f5b304ec95689ba473b0ae7615d676a61a5ffe..70299ef1e7793b6aecf0e8259f828764e5b29136 100755 (executable)
@@ -4569,7 +4569,7 @@ int fuse_loop(struct fuse *f)
        return fuse_session_loop(f->se);
 }
 
-FUSE_SYMVER(".symver fuse_loop_mt_32,fuse_loop_mt@@FUSE_3.2");
+FUSE_SYMVER("fuse_loop_mt_32", "fuse_loop_mt@@FUSE_3.2")
 int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config)
 {
        if (f == NULL)
@@ -4585,7 +4585,7 @@ int fuse_loop_mt_32(struct fuse *f, struct fuse_loop_config *config)
 }
 
 int fuse_loop_mt_31(struct fuse *f, int clone_fd);
-FUSE_SYMVER(".symver fuse_loop_mt_31,fuse_loop_mt@FUSE_3.0");
+FUSE_SYMVER("fuse_loop_mt_31", "fuse_loop_mt@FUSE_3.0")
 int fuse_loop_mt_31(struct fuse *f, int clone_fd)
 {
        struct fuse_loop_config config;
@@ -4870,7 +4870,7 @@ void fuse_stop_cleanup_thread(struct fuse *f)
 }
 
 
-FUSE_SYMVER(".symver fuse_new_31,fuse_new@@FUSE_3.1");
+FUSE_SYMVER("fuse_new_31", "fuse_new@@FUSE_3.1")
 struct fuse *fuse_new_31(struct fuse_args *args,
                      const struct fuse_operations *op,
                      size_t op_size, void *user_data)
@@ -5024,7 +5024,7 @@ out:
 /* Emulates 3.0-style fuse_new(), which processes --help */
 struct fuse *fuse_new_30(struct fuse_args *args, const struct fuse_operations *op,
                         size_t op_size, void *private_data);
-FUSE_SYMVER(".symver fuse_new_30,fuse_new@FUSE_3.0");
+FUSE_SYMVER("fuse_new_30", "fuse_new@FUSE_3.0")
 struct fuse *fuse_new_30(struct fuse_args *args,
                         const struct fuse_operations *op,
                         size_t op_size, void *user_data)
index 445e9a0ab0764e3abce21e3b4df1ff1b0a0fa916..0c6a5b79f8fbb0646dbd88c12f81c60c2a64484b 100644 (file)
@@ -304,7 +304,7 @@ static void fuse_join_worker(struct fuse_mt *mt, struct fuse_worker *w)
        free(w);
 }
 
-FUSE_SYMVER(".symver fuse_session_loop_mt_32,fuse_session_loop_mt@@FUSE_3.2");
+FUSE_SYMVER("fuse_session_loop_mt_32", "fuse_session_loop_mt@@FUSE_3.2")
 int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *config)
 {
        int err;
@@ -352,7 +352,7 @@ int fuse_session_loop_mt_32(struct fuse_session *se, struct fuse_loop_config *co
 }
 
 int fuse_session_loop_mt_31(struct fuse_session *se, int clone_fd);
-FUSE_SYMVER(".symver fuse_session_loop_mt_31,fuse_session_loop_mt@FUSE_3.0");
+FUSE_SYMVER("fuse_session_loop_mt_31", "fuse_session_loop_mt@FUSE_3.0")
 int fuse_session_loop_mt_31(struct fuse_session *se, int clone_fd)
 {
        struct fuse_loop_config config;
index 2f6663ed7d8f3b5d2ba20d48003a96734608dd62..a8b59617f3b7ae768442b023cf972d65460b211a 100644 (file)
     - not supported on MacOSX (in MachO binary format)
 */
 #if (!defined(__UCLIBC__) && !defined(__APPLE__))
-#define FUSE_SYMVER(x) __asm__(x)
+# if HAVE_SYMVER_ATTRIBUTE
+#  define FUSE_SYMVER(sym1, sym2) __attribute__ ((symver (sym2)))
+# else
+#  define FUSE_SYMVER(sym1, sym2) __asm__("\t.symver " sym1 "," sym2);
+# endif
 #else
-#define FUSE_SYMVER(x)
+#define FUSE_SYMVER(sym1, sym2)
 #endif
 
 #ifndef USE_UCLIBC
index dbef8ab89269b10b516e073ce871d2dd35ed0871..e17ebb0441a2d5d87deeb0e06bfe349b46395c12 100644 (file)
@@ -87,6 +87,23 @@ if not cc.compiles(code, args: [ '-O0', '-Werror=unused-result' ])
      add_project_arguments('-Wno-unused-result', language: 'c')
 endif
 
+# gcc-10 and newer support the symver attribute which we need to use if we
+# want to support LTO
+code = '''
+__attribute__((symver ("get@@TEST_0"))) int get_4() {
+    return 4;
+}
+int main(void) {
+    (void) get_4();
+    return 0;
+}'''
+if cc.compiles(code, args: [ '-O0', '-c'])
+     message('Compiler supports symver attribute')
+     add_project_arguments('-DHAVE_SYMVER_ATTRIBUTE', language: 'c')
+else
+     message('Compiler does not support symver attribute')
+endif
+
 # '.' will refer to current build directory, which contains config.h
 include_dirs = include_directories('include', 'lib', '.')
 
index b2f36102f2f1879facccc6ad8eb353fd3898d39e..6e2afd5d56b2fe0fc983fa4e1fdc6e45fe9e6e5d 100755 (executable)
@@ -25,7 +25,7 @@ chmod 0755 "${TEST_DIR}"
 cd "${TEST_DIR}"
 
 # Standard build
-for CC in gcc gcc-7 clang; do
+for CC in gcc gcc-7 gcc-10 clang; do
     mkdir build-${CC}; cd build-${CC}
     if [ "${CC}" == "clang" ]; then
         export CXX="clang++"
@@ -35,6 +35,11 @@ for CC in gcc gcc-7 clang; do
     else
         build_opts=''
     fi
+    if [ ${CC} == 'gcc-10' ]; then
+        build_opts='-Dc_args="-flto=auto -ffat-lto-objects"'
+    else
+        build_opts=''
+    fi
     meson -D werror=true ${build_opts} "${SOURCE_DIR}" || (cat meson-logs/meson-log.txt; false)
     ninja