[19/36] Exported const objects

Message ID 1423524046-20605-20-git-send-email-palves@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves Feb. 9, 2015, 11:20 p.m. UTC
  const works different in C vs C++.  In C++, a global "const" variable
has internal linkage by default, resulting in link errors like:

  ...
  extension.o: In function `get_ext_lang_defn(extension_language)':
  gdb/extension.c:126: undefined reference to `extension_language_guile'
  gdb/extension.c:124: undefined reference to `extension_language_guile'
  ...

The fix is to define exported const objects with "extern const".  But
that in C would not be a definition.  So we need to #ifdef C vs C++ in
this case.

EXPORTED_CONST comes from include/ansidecl.h, but in the
feature_to_c.sh case I think it's better to leave the script with no
dependencies.

gdb/ChangeLog:
2015-02-09  Pedro Alves  <palves@redhat.com>

	* cp-valprint.c (vtbl_ptr_name): Use EXPORTED_CONST.
	* guile/guile.c (extension_language_guile): Use EXPORTED_CONST.
	* features/feature_to_c.sh: Tag the generated xml_builtin array
	with extern const in C++ mode.
---
 gdb/cp-valprint.c            | 2 +-
 gdb/features/feature_to_c.sh | 8 +++++++-
 gdb/guile/guile.c            | 2 +-
 3 files changed, 9 insertions(+), 3 deletions(-)
  

Patch

diff --git a/gdb/cp-valprint.c b/gdb/cp-valprint.c
index 93f4c1b..0ddc96e 100644
--- a/gdb/cp-valprint.c
+++ b/gdb/cp-valprint.c
@@ -88,7 +88,7 @@  static void cp_print_value (struct type *, struct type *,
 
 
 /* GCC versions after 2.4.5 use this.  */
-const char vtbl_ptr_name[] = "__vtbl_ptr_type";
+EXPORTED_CONST char vtbl_ptr_name[] = "__vtbl_ptr_type";
 
 /* Return truth value for assertion that TYPE is of the type
    "pointer to virtual function".  */
diff --git a/gdb/features/feature_to_c.sh b/gdb/features/feature_to_c.sh
index fb37a6b..35db791 100644
--- a/gdb/features/feature_to_c.sh
+++ b/gdb/features/feature_to_c.sh
@@ -63,7 +63,13 @@  for input; do
 done
 
 echo >> $output
-echo "const char *const xml_builtin[][2] = {" >> $output
+
+echo "#ifdef __cplusplus"                    >> $output
+echo "#  define EXPORTED_CONST extern const" >> $output
+echo "#else"                                 >> $output
+echo "#  define EXPORTED_CONST const"        >> $output
+echo "#endif"                                >> $output
+echo "EXPORTED_CONST char *const xml_builtin[][2] = {" >> $output
 
 for input; do
   basename=`echo $input | sed 's,.*/,,'`
diff --git a/gdb/guile/guile.c b/gdb/guile/guile.c
index 3e0d11a..1895118 100644
--- a/gdb/guile/guile.c
+++ b/gdb/guile/guile.c
@@ -77,7 +77,7 @@  extern const struct extension_language_ops guile_extension_ops;
 
 /* The main struct describing GDB's interface to the Guile
    extension language.  */
-const struct extension_language_defn extension_language_guile =
+EXPORTED_CONST struct extension_language_defn extension_language_guile =
 {
   EXT_LANG_GUILE,
   "guile",