From patchwork Mon Feb 9 23:20:29 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 4993 Received: (qmail 12505 invoked by alias); 9 Feb 2015 23:21:41 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 12484 invoked by uid 89); 9 Feb 2015 23:21:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 09 Feb 2015 23:21:40 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t19NLdpX011734 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 9 Feb 2015 18:21:39 -0500 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19NKkui026307 for ; Mon, 9 Feb 2015 18:21:38 -0500 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 19/36] Exported const objects Date: Mon, 9 Feb 2015 23:20:29 +0000 Message-Id: <1423524046-20605-20-git-send-email-palves@redhat.com> In-Reply-To: <1423524046-20605-1-git-send-email-palves@redhat.com> References: <1423524046-20605-1-git-send-email-palves@redhat.com> 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 * 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(-) 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",