PR gold/5986
authorIan Lance Taylor <ian@airs.com>
Wed, 26 Mar 2008 23:36:46 +0000 (23:36 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 26 Mar 2008 23:36:46 +0000 (23:36 +0000)
Fix problems building gold with gcc 4.3.0.
* gold.h (TEMPLATE_ATTRIBUTE_PRINTF_4): Define.
(gold_error_at_location, gold_warning_at_location): Use it.
* configure.ac: Check whether we can compile and use a template
function with a printf attribute.
* x86_64.cc (Target_x86_64::do_code_fill): Swap out a 32-bit value
when jumping over bytes.
* object.cc: Instantiate Object::read_section_data.
* debug.h: Include <cstring>
* dwarf_reader.cc: Include <algorithm>
* main.cc: Include <cstring>.
* options.cc: Include <cstring>.
* output.cc: Include <cstring>.
* script.cc: Include <cstring>.
* script.h: Include <string>.
* symtab.cc: Include <cstring> and <algorithm>.
* target-select.cc: Include <cstring>.
* version.cc: Include <string>.
* testsuite/testmain.cc: Include <cstdlib>.
* configure, config.in: Rebuild.

18 files changed:
gold/ChangeLog
gold/config.in
gold/configure
gold/configure.ac
gold/debug.h
gold/dwarf_reader.cc
gold/gold.h
gold/main.cc
gold/object.cc
gold/options.cc
gold/output.cc
gold/script.cc
gold/script.h
gold/symtab.cc
gold/target-select.cc
gold/testsuite/testmain.cc
gold/version.cc
gold/x86_64.cc

index 5a98a0784eb6935b793ee917d0083f72cafd23ea..0e207acaaeae351aa13fb042b3ba5d380fccdb97 100644 (file)
@@ -1,3 +1,27 @@
+2008-03-26  Ian Lance Taylor  <iant@google.com>
+
+       PR gold/5986
+       Fix problems building gold with gcc 4.3.0.
+       * gold.h (TEMPLATE_ATTRIBUTE_PRINTF_4): Define.
+       (gold_error_at_location, gold_warning_at_location): Use it.
+       * configure.ac: Check whether we can compile and use a template
+       function with a printf attribute.
+       * x86_64.cc (Target_x86_64::do_code_fill): Swap out a 32-bit value
+       when jumping over bytes.
+       * object.cc: Instantiate Object::read_section_data.
+       * debug.h: Include <cstring>
+       * dwarf_reader.cc: Include <algorithm>
+       * main.cc: Include <cstring>.
+       * options.cc: Include <cstring>.
+       * output.cc: Include <cstring>.
+       * script.cc: Include <cstring>.
+       * script.h: Include <string>.
+       * symtab.cc: Include <cstring> and <algorithm>.
+       * target-select.cc: Include <cstring>.
+       * version.cc: Include <string>.
+       * testsuite/testmain.cc: Include <cstdlib>.
+       * configure, config.in: Rebuild.
+
 2008-03-25  Ian Lance Taylor  <iant@google.com>
 
        * options.cc: Include "../bfd/bfdver.h".
index 81da6aaad3338f3b4e3b85ada96630fdb34cfe98..4f544fc8dc27095af62e34a56483d0932e164f64 100644 (file)
@@ -64,6 +64,9 @@
 /* Define to support 64-bit little-endian targets */
 #undef HAVE_TARGET_64_LITTLE
 
+/* Define if attributes work on C++ templates */
+#undef HAVE_TEMPLATE_ATTRIBUTES
+
 /* Define to 1 if you have the <tr1/unordered_map> header file. */
 #undef HAVE_TR1_UNORDERED_MAP
 
index 45e84d968cb5f20075788670defdeb6893f152b5..01cdf169d063f4e66a2f9c5989a146f4391251eb 100755 (executable)
@@ -4666,6 +4666,16 @@ echo "$as_me: error: bad value ${enableval} for --enable-werror" >&2;}
    esac
 fi;
 
+# Enable -Wno-format by default when using gcc on mingw
+case "${host}" in
+  *-*-mingw32*)
+    if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
+      GCC_WARN_CFLAGS="$GCC_WARN_CFLAGS -Wno-format"
+    fi
+    ;;
+  *) ;;
+esac
+
 # Enable -Werror by default when using gcc
 if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
     ERROR_ON_WARNING=yes
@@ -6233,6 +6243,63 @@ fi
 done
 
 
+# gcc 4.3.0 doesn't recognize the printf attribute on a template
+# function.  Check for that.  This is gcc bug 35546.  This test can
+# probably be removed after the bug has been fixed for a while.
+echo "$as_me:$LINENO: checking whether we can use attributes with template functions" >&5
+echo $ECHO_N "checking whether we can use attributes with template functions... $ECHO_C" >&6
+if test "${gold_cv_template_attribute+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+
+template<typename T> extern void foo(const char*, ...)
+  __attribute__ ((__format__ (__printf__, 1, 2)));
+template<typename T> void foo(const char* format, ...) {}
+void bar() { foo<int>("%s\n", "foo"); }
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_cxx_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gold_cv_template_attribute=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+gold_cv_template_attribute=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $gold_cv_template_attribute" >&5
+echo "${ECHO_T}$gold_cv_template_attribute" >&6
+if test "$gold_cv_template_attribute" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TEMPLATE_ATTRIBUTES 1
+_ACEOF
+
+fi
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
index e930fd6cb7fe5353ce6fe2586238dba2bcad9bd0..d9d965e1c36667ddf7559b1569e7669d6bcbb2d1 100644 (file)
@@ -244,6 +244,22 @@ AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map)
 AC_CHECK_HEADERS(ext/hash_map ext/hash_set)
 AC_CHECK_FUNCS(mallinfo)
 
+# gcc 4.3.0 doesn't recognize the printf attribute on a template
+# function.  Check for that.  This is gcc bug 35546.  This test can
+# probably be removed after the bug has been fixed for a while.
+AC_CACHE_CHECK([whether we can use attributes with template functions],
+[gold_cv_template_attribute],
+[AC_COMPILE_IFELSE([
+template<typename T> extern void foo(const char*, ...)
+  __attribute__ ((__format__ (__printf__, 1, 2)));
+template<typename T> void foo(const char* format, ...) {}
+void bar() { foo<int>("%s\n", "foo"); }
+], [gold_cv_template_attribute=yes], [gold_cv_template_attribute=no])])
+if test "$gold_cv_template_attribute" = "yes"; then
+  AC_DEFINE(HAVE_TEMPLATE_ATTRIBUTES, 1,
+           [Define if attributes work on C++ templates])
+fi
+
 AC_LANG_POP(C++)
 
 AM_MAINTAINER_MODE
index 9bc9c8551101e6d25c2a6e84f047655825e9741d..8428dc81f0700cd4537da94ed2cf067650fa2bba 100644 (file)
@@ -23,6 +23,8 @@
 #ifndef GOLD_DEBUG_H
 #define GOLD_DEBUG_H
 
+#include <cstring>
+
 #include "parameters.h"
 #include "errors.h"
 
index f2ae53a955fa1be46484e2d5ecd4ab2ec9cd029e..7ce6c7effe28ffa5dad51deac22653fac43165a3 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "gold.h"
 
+#include <algorithm>
+
 #include "elfcpp_swap.h"
 #include "dwarf.h"
 #include "object.h"
index b34e0320b065c6b8b4d997422c8b8d26afc9a469..1b1a84c1b02453b33448fd9635f281cf7bb84bd2 100644 (file)
@@ -157,13 +157,21 @@ gold_error(const char* msg, ...) ATTRIBUTE_PRINTF_1;
 extern void
 gold_warning(const char* msg, ...) ATTRIBUTE_PRINTF_1;
 
+// Work around a bug in gcc 4.3.0.  http://gcc.gnu.org/PR35546 .  This
+// can probably be removed after the bug has been fixed for a while.
+#ifdef HAVE_TEMPLATE_ATTRIBUTES
+#define TEMPLATE_ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF_4
+#else
+#define TEMPLATE_ATTRIBUTE_PRINTF_4
+#endif
+
 // This function is called to issue an error at the location of a
 // reloc.
 template<int size, bool big_endian>
 extern void
 gold_error_at_location(const Relocate_info<size, big_endian>*,
                       size_t, off_t, const char* format, ...)
-  ATTRIBUTE_PRINTF_4;
+  TEMPLATE_ATTRIBUTE_PRINTF_4;
 
 // This function is called to issue a warning at the location of a
 // reloc.
@@ -171,7 +179,7 @@ template<int size, bool big_endian>
 extern void
 gold_warning_at_location(const Relocate_info<size, big_endian>*,
                         size_t, off_t, const char* format, ...)
-  ATTRIBUTE_PRINTF_4;
+  TEMPLATE_ATTRIBUTE_PRINTF_4;
 
 // This function is called to report an undefined symbol.
 template<int size, bool big_endian>
index e4f9003b21510303ea7b88ab30bd7635f20245e4..2966d0351edf619a80ce3e4032b747dbab36948e 100644 (file)
 
 #include "gold.h"
 
+#include <cstring>
+
 #ifdef HAVE_MALLINFO
 #include <malloc.h>
 #endif
+
 #include "libiberty.h"
 
 #include "script.h"
index 6c81f231bc6edce2dec33866f816d35968f0db07..378238d3fdcc29c2ad4626ed8cfca9deb2f034a9 100644 (file)
@@ -1546,8 +1546,35 @@ make_elf_object(const std::string& name, Input_file* input_file, off_t offset,
     }
 }
 
-// Instantiate the templates we need.  We could use the configure
-// script to restrict this to only the ones for implemented targets.
+// Instantiate the templates we need.
+
+#ifdef HAVE_TARGET_32_LITTLE
+template
+void
+Object::read_section_data<32, false>(elfcpp::Elf_file<32, false, Object>*,
+                                    Read_symbols_data*);
+#endif
+
+#ifdef HAVE_TARGET_32_BIG
+template
+void
+Object::read_section_data<32, true>(elfcpp::Elf_file<32, true, Object>*,
+                                   Read_symbols_data*);
+#endif
+
+#ifdef HAVE_TARGET_64_LITTLE
+template
+void
+Object::read_section_data<64, false>(elfcpp::Elf_file<64, false, Object>*,
+                                    Read_symbols_data*);
+#endif
+
+#ifdef HAVE_TARGET_64_BIG
+template
+void
+Object::read_section_data<64, true>(elfcpp::Elf_file<64, true, Object>*,
+                                   Read_symbols_data*);
+#endif
 
 #ifdef HAVE_TARGET_32_LITTLE
 template
index 58ac9cf9ac5210fa1a34d5f2535ceb03454d3291..b6e4711881c417687bf92ea1c5ab3bb06b0e3dc1 100644 (file)
@@ -23,6 +23,7 @@
 #include "gold.h"
 
 #include <cstdlib>
+#include <cstring>
 #include <vector>
 #include <iostream>
 #include <sys/stat.h>
index 3a11aa48e80c943100fb059cdd419813faa07547..d4fc2a7a9a376e8ec9004fc2f9b14c0d6a83561f 100644 (file)
@@ -23,6 +23,7 @@
 #include "gold.h"
 
 #include <cstdlib>
+#include <cstring>
 #include <cerrno>
 #include <fcntl.h>
 #include <unistd.h>
index b8ecf9d9acf13d9f567f706134a1fc056d57a79a..a808b2e31d1c4d734d89a70e77c8b67d1077628b 100644 (file)
 
 #include "gold.h"
 
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
 #include <fnmatch.h>
 #include <string>
 #include <vector>
-#include <cstdio>
-#include <cstdlib>
 #include "filenames.h"
 
 #include "elfcpp.h"
index 26abd463ac416745329cccf66ef7deaad8f8561d..af0f53cb4aefca5da8f503fef290ff003b012bfe 100644 (file)
@@ -31,6 +31,7 @@
 #define GOLD_SCRIPT_H
 
 #include <cstdio>
+#include <string>
 #include <vector>
 
 #include "script-sections.h"
index 3bd38337179ab65ebe4a59926f098db625655138..5ad5ae83c717685914c68f186b16eaa5339fe714 100644 (file)
@@ -22,7 +22,9 @@
 
 #include "gold.h"
 
+#include <cstring>
 #include <stdint.h>
+#include <algorithm>
 #include <set>
 #include <string>
 #include <utility>
index 092a1df46fa8f25dd70d047b550bfc222fe7b65e..b81f5a28ea8e38ebc2d180b3a8b1c37e43993d69 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "gold.h"
 
+#include <cstring>
+
 #include "elfcpp.h"
 #include "target-select.h"
 
index 47c59b607458ee15265bf5f2d2df7380e8778f1c..ac99000edc79b10950f89c0ca5e276eeebbdb8a2 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "gold.h"
 
+#include <cstdlib>
+
 #include "test.h"
 
 using namespace gold_testsuite;
index 9e3ec2877a29a0547fce8df5c4a417f5b62cbf55..4b034b99d3c1f5d4b87e0d34413c29b580f57fe7 100644 (file)
@@ -22,6 +22,8 @@
 
 #include "gold.h"
 
+#include <string>
+
 #include "../bfd/bfdver.h"
 
 namespace gold
index 26f73480924ea9f298c6d198acf0de6a4a8afcfe..973787fe7d14c96d47af02368ef0aa2d4c5cc038 100644 (file)
@@ -2161,7 +2161,7 @@ Target_x86_64::do_code_fill(section_size_type length) const
       // Build a jmpq instruction to skip over the bytes.
       unsigned char jmp[5];
       jmp[0] = 0xe9;
-      elfcpp::Swap_unaligned<64, false>::writeval(jmp + 1, length - 5);
+      elfcpp::Swap_unaligned<32, false>::writeval(jmp + 1, length - 5);
       return (std::string(reinterpret_cast<char*>(&jmp[0]), 5)
               + std::string(length - 5, '\0'));
     }