From: Pedro Alves <palves@redhat.com>
To: asmwarrior <asmwarrior@gmail.com>,
GDB Patches <gdb-patches@sourceware.org>
Subject: Re: [all pushed] Re: [PATCH 00/36] Support building GDB as a C++ program
Date: Fri, 15 May 2015 15:04:00 -0000 [thread overview]
Message-ID: <55560B0D.8030307@redhat.com> (raw)
In-Reply-To: <5555AC9F.7020206@gmail.com>
On 05/15/2015 09:21 AM, asmwarrior wrote:
> Hi, Pedro, I just found another build issue when building gdb under g++.
Thanks!
>
> Building mingw GDB with --enable-build-with-cxx shows:
>
> ../../binutils-gdb/gdb/python/py-unwind.c:500:45: error: cannot convert 'cached_frame_info::reg_info*' to 'pyuw_prev_register(frame_info*, void**, int)::reg_info*' in initialization
> struct reg_info *reg_info = cached_frame->reg;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:501:60: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> struct reg_info *reg_info_end = reg_info + cached_frame->reg_count;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> struct reg_info *reg_info = cached_frame->reg;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:505:37: error: cannot increment a pointer to incomplete type 'pyuw_prev_register(frame_info*, void**, int)::reg_info'
> for (; reg_info < reg_info_end; ++reg_info)
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:507:29: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> if (regnum == reg_info->number)
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> struct reg_info *reg_info = cached_frame->reg;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:508:68: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> return frame_unwind_got_bytes (this_frame, regnum, reg_info->data);
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
> struct reg_info *reg_info = cached_frame->reg;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c: In function 'int pyuw_sniffer(const frame_unwind*, frame_info*, void**)':
> ../../binutils-gdb/gdb/python/py-unwind.c:574:70: warning: invalid conversion from 'void*' to 'cached_frame_info*' [-fpermissive]
> reg_count * sizeof (cached_frame->reg[0]));
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c: In function 'void pyuw_on_new_gdbarch(gdbarch*)':
> ../../binutils-gdb/gdb/python/py-unwind.c:636:47: warning: invalid conversion from 'void*' to 'pyuw_gdbarch_data_type*' [-fpermissive]
> gdbarch_data (newarch, pyuw_gdbarch_data);
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:647:29: warning: invalid conversion from 'void*' to 'const frame_data*' [-fpermissive]
> unwinder->unwind_data = (void *) newarch;
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c: At global scope:
> ../../binutils-gdb/gdb/python/py-unwind.c:699:21: error: redefinition of 'PyTypeObject pending_frame_object_type'
> static PyTypeObject pending_frame_object_type =
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:96:21: error: 'PyTypeObject pending_frame_object_type' previously declared here
> static PyTypeObject pending_frame_object_type
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:749:21: error: redefinition of 'PyTypeObject unwind_info_object_type'
> static PyTypeObject unwind_info_object_type =
> ^
> ../../binutils-gdb/gdb/python/py-unwind.c:99:21: error: 'PyTypeObject unwind_info_object_type' previously declared here
> static PyTypeObject unwind_info_object_type
> ^
>
>
> The first kind of error is caused by embedded struct definition, so I moved it out of the parent struct.
That's the right fix.
> The second kind of error is caused by using static keyword on a CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF decoreated variable, I see that all other files use extern, so I changed to extern.
That too, is the right fix, though the problem isn't caused by
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF. The problem is that with C we
can "forward declare" variables like this:
static int foo;
void
use_foo (void)
{
if (foo == 2)
bar ();
}
static int foo = 3;
But that's not valid C++ (and a link error with C and -fno-common).
So we need to fix the definition too, though, otherwise we have a
static / extern mismatch. G++ warns about it, but until we get rid
of -fpermissive and enable -Werror in C++ mode, it's easy to
miss. Building in C mode does catch that with an error though.
Here's what I pushed.
From 13fa0398d7dd8d2b468acf0aba5610ce014709a6 Mon Sep 17 00:00:00 2001
From: Yuanhui Zhang <asmwarrior@gmail.com>
Date: Fri, 15 May 2015 16:00:40 +0100
Subject: [PATCH] Fix a couple C++ build issues
Building mingw GDB with --enable-build-with-cxx shows:
../../binutils-gdb/gdb/python/py-unwind.c:500:45: error: cannot convert 'cached_frame_info::reg_info*' to 'pyuw_prev_register(frame_info*, void**, int)::reg_info*' in initialization
struct reg_info *reg_info = cached_frame->reg;
^
../../binutils-gdb/gdb/python/py-unwind.c:501:60: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
struct reg_info *reg_info_end = reg_info + cached_frame->reg_count;
^
../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
struct reg_info *reg_info = cached_frame->reg;
^
../../binutils-gdb/gdb/python/py-unwind.c:505:37: error: cannot increment a pointer to incomplete type 'pyuw_prev_register(frame_info*, void**, int)::reg_info'
for (; reg_info < reg_info_end; ++reg_info)
^
../../binutils-gdb/gdb/python/py-unwind.c:507:29: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
if (regnum == reg_info->number)
^
../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
struct reg_info *reg_info = cached_frame->reg;
^
../../binutils-gdb/gdb/python/py-unwind.c:508:68: error: invalid use of incomplete type 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
return frame_unwind_got_bytes (this_frame, regnum, reg_info->data);
^
../../binutils-gdb/gdb/python/py-unwind.c:500:10: error: forward declaration of 'struct pyuw_prev_register(frame_info*, void**, int)::reg_info'
struct reg_info *reg_info = cached_frame->reg;
^
../../binutils-gdb/gdb/python/py-unwind.c: In function 'int pyuw_sniffer(const frame_unwind*, frame_info*, void**)':
../../binutils-gdb/gdb/python/py-unwind.c:574:70: warning: invalid conversion from 'void*' to 'cached_frame_info*' [-fpermissive]
reg_count * sizeof (cached_frame->reg[0]));
^
../../binutils-gdb/gdb/python/py-unwind.c: In function 'void pyuw_on_new_gdbarch(gdbarch*)':
../../binutils-gdb/gdb/python/py-unwind.c:636:47: warning: invalid conversion from 'void*' to 'pyuw_gdbarch_data_type*' [-fpermissive]
gdbarch_data (newarch, pyuw_gdbarch_data);
^
../../binutils-gdb/gdb/python/py-unwind.c:647:29: warning: invalid conversion from 'void*' to 'const frame_data*' [-fpermissive]
unwinder->unwind_data = (void *) newarch;
^
../../binutils-gdb/gdb/python/py-unwind.c: At global scope:
../../binutils-gdb/gdb/python/py-unwind.c:699:21: error: redefinition of 'PyTypeObject pending_frame_object_type'
static PyTypeObject pending_frame_object_type =
^
../../binutils-gdb/gdb/python/py-unwind.c:96:21: error: 'PyTypeObject pending_frame_object_type' previously declared here
static PyTypeObject pending_frame_object_type
^
../../binutils-gdb/gdb/python/py-unwind.c:749:21: error: redefinition of 'PyTypeObject unwind_info_object_type'
static PyTypeObject unwind_info_object_type =
^
../../binutils-gdb/gdb/python/py-unwind.c:99:21: error: 'PyTypeObject unwind_info_object_type' previously declared here
static PyTypeObject unwind_info_object_type
^
The first kind of error is caused by the embedded struct definition,
so move it out of the parent struct.
The second kind of error is caused by forward declaring a static
global variable, which works in C, but not in C++ (or C with
-fno-common). Make it using extern instead, like done in other
similar cases.
gdb/ChangeLog:
2015-05-15 Yuanhui Zhang <asmwarrior@gmail.com>
* python/py-unwind.c (struct reg_info): Move out of ...
(struct cached_frame_info): ... this scope.
(pending_frame_object_type, unwind_info_object_type): Make extern.
---
gdb/ChangeLog | 6 ++++++
gdb/python/py-unwind.c | 26 ++++++++++++++------------
2 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1492981..1fdc4f4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-15 Yuanhui Zhang <asmwarrior@gmail.com>
+
+ * python/py-unwind.c (struct reg_info): Move out of ...
+ (struct cached_frame_info): ... this scope.
+ (pending_frame_object_type, unwind_info_object_type): Make extern.
+
2015-05-15 Joel Brobecker <brobecker@adacore.com>
* ada-lang.c (ada_value_primitive_packed_val): Make sure
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index bcfea4b..b6e8a75 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -72,6 +72,15 @@ typedef struct
/* The data we keep for a frame we can unwind: frame ID and an array of
(register_number, register_value) pairs. */
+struct reg_info
+{
+ /* Register number. */
+ int number;
+
+ /* Register data bytes pointer. */
+ gdb_byte data[MAX_REGISTER_SIZE];
+};
+
typedef struct
{
/* Frame ID. */
@@ -83,20 +92,13 @@ typedef struct
/* Length of the `reg' array below. */
int reg_count;
- struct reg_info
- {
- /* Register number. */
- int number;
-
- /* Register data bytes pointer. */
- gdb_byte data[MAX_REGISTER_SIZE];
- } reg[];
+ struct reg_info reg[];
} cached_frame_info;
-static PyTypeObject pending_frame_object_type
+extern PyTypeObject pending_frame_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("pending_frame_object");
-static PyTypeObject unwind_info_object_type
+extern PyTypeObject unwind_info_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("unwind_info_object");
static unsigned int pyuw_debug = 0;
@@ -696,7 +698,7 @@ static PyMethodDef pending_frame_object_methods[] =
{NULL} /* Sentinel */
};
-static PyTypeObject pending_frame_object_type =
+PyTypeObject pending_frame_object_type =
{
PyVarObject_HEAD_INIT (NULL, 0)
"gdb.PendingFrame", /* tp_name */
@@ -746,7 +748,7 @@ static PyMethodDef unwind_info_object_methods[] =
{ NULL } /* Sentinel */
};
-static PyTypeObject unwind_info_object_type =
+PyTypeObject unwind_info_object_type =
{
PyVarObject_HEAD_INIT (NULL, 0)
"gdb.UnwindInfo", /* tp_name */
--
1.9.3
prev parent reply other threads:[~2015-05-15 15:04 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-09 23:20 Pedro Alves
2015-02-09 23:20 ` [PATCH 02/36] Add --enable-build-with-cxx configure switch Pedro Alves
2015-02-10 22:11 ` Yao Qi
2015-02-27 13:24 ` Pedro Alves
2015-02-27 14:20 ` Yao Qi
2015-02-27 16:29 ` Pedro Alves
2015-02-09 23:21 ` [PATCH 11/36] Make functions and variables exported by the IPA be extern "C" Pedro Alves
2015-02-09 23:21 ` [PATCH 29/36] Normalize TRY_CATCH exception handling block Pedro Alves
2015-02-09 23:21 ` [PATCH 27/36] catch_command_errors: Remove 'mask' parameter Pedro Alves
2015-02-09 23:21 ` [PATCH 04/36] Fix struct, union, and enum nesting in C++ Pedro Alves
2015-02-09 23:21 ` [PATCH 26/36] Adjust self tests to cope with GDB built as a C++ program Pedro Alves
2015-02-09 23:21 ` [PATCH 03/36] C++ keyword cleanliness, mostly auto-generated Pedro Alves
2015-02-11 7:57 ` Joel Brobecker
2015-02-11 8:52 ` Phil Muldoon
2015-02-11 10:27 ` Pedro Alves
2015-02-11 10:51 ` Pedro Alves
2015-02-12 12:19 ` Joel Brobecker
2015-02-12 13:14 ` Pedro Alves
2015-02-12 14:43 ` Pedro Alves
2015-02-12 14:59 ` Joel Brobecker
2015-02-27 17:41 ` Pedro Alves
2015-02-09 23:21 ` [PATCH 19/36] Exported const objects Pedro Alves
2015-02-09 23:21 ` [PATCH 16/36] x86 Linux/ptrace: fix offsetof usage in C++ mode Pedro Alves
2015-02-09 23:21 ` [PATCH 25/36] python/python-internal.h: enum ‘ext_lang_rc’ not defined Pedro Alves
2015-02-09 23:21 ` [PATCH 28/36] Move exception_none to common code, and use it Pedro Alves
2015-02-09 23:21 ` [PATCH 17/36] mi/mi-cmd-stack.c|frame filters: print_values <-> ext_lang_frame_args Pedro Alves
2015-02-09 23:21 ` [PATCH 05/36] Fix redefinition errors in C++ mode Pedro Alves
2015-02-11 10:09 ` Yao Qi
2015-02-11 11:30 ` Pedro Alves
2015-02-11 11:39 ` [PATCH] xcoffread.c: delete 'within_function' definition (Re: [PATCH 05/36] Fix redefinition errors in C++ mode) Pedro Alves
2015-02-09 23:21 ` [PATCH 09/36] floatformat.h: Wrap in extern "C" Pedro Alves
2015-02-09 23:35 ` Andrew Pinski
2015-02-09 23:49 ` Pedro Alves
2015-02-12 11:49 ` Pedro Alves
2015-02-18 19:55 ` Jakub Jelinek
2015-02-14 17:29 ` Doug Evans
2015-02-14 18:36 ` Pedro Alves
2015-02-14 22:46 ` Doug Evans
2015-02-09 23:21 ` [PATCH 20/36] gdbserver/tracepoint: Add cast sockaddr_un/sockaddr cast Pedro Alves
2015-02-09 23:21 ` [PATCH 08/36] elf-bfd.h: Wrap in extern "C" Pedro Alves
2015-02-09 23:33 ` Andrew Pinski
2015-02-10 12:05 ` [PATCH v2] Wrap BFD headers " Pedro Alves
2015-02-11 0:36 ` Alan Modra
2015-02-11 10:08 ` Pedro Alves
2015-02-09 23:21 ` [PATCH 13/36] target.h: Include infrun.h Pedro Alves
2015-02-09 23:21 ` [PATCH 21/36] opcodes/microblaze: Rename 'or', 'and', 'xor' to avoid C++ conflict Pedro Alves
2015-02-10 15:05 ` Michael Eager
2015-02-10 18:11 ` Pedro Alves
2015-02-09 23:21 ` [PATCH 22/36] Remove duplicate const Pedro Alves
2015-02-09 23:21 ` [PATCH 23/36] gdbarch.h: include regcache.h Pedro Alves
2015-02-09 23:21 ` [PATCH 15/36] Don't forward declare enum target_hw_bp_type Pedro Alves
2015-02-09 23:21 ` [PATCH 31/36] Split TRY_CATCH into TRY + CATCH Pedro Alves
2015-03-07 15:58 ` Pedro Alves
2015-02-09 23:21 ` [PATCH 12/36] proc-service, extern "C" Pedro Alves
2015-02-09 23:22 ` [PATCH 32/36] TRY_CATCH -> TRY+CATCH+END_CATCH everywhere Pedro Alves
2015-02-09 23:22 ` [PATCH 36/36] Make TRY/CATCH use real C++ try/catch in C++ mode Pedro Alves
2015-02-09 23:22 ` [PATCH 33/36] TRY_CATCH -> TRY+CATCH+END_CATCH, the manual conversions Pedro Alves
2015-02-09 23:35 ` [PATCH 18/36] Rename struct lzma_stream to avoid clash with system header Pedro Alves
2015-02-09 23:45 ` [PATCH 06/36] record-btrace.c: Remove redefinitions Pedro Alves
2015-02-09 23:46 ` [PATCH 35/36] kill volatile struct gdb_exception Pedro Alves
2015-02-09 23:49 ` [PATCH 00/36] Support building GDB as a C++ program Doug Evans
2015-02-09 23:50 ` [PATCH 34/36] more making TRY/CATCH callers look more like real C++ try/catch blocks Pedro Alves
2015-03-07 15:59 ` Pedro Alves
2015-02-09 23:51 ` [PATCH 14/36] Do not do arithmetic on enum types Pedro Alves
2015-02-09 23:51 ` [PATCH 07/36] Make array object extern Pedro Alves
2015-02-27 22:47 ` Simon Marchi
2015-02-27 22:58 ` Pedro Alves
2015-02-27 23:04 ` Simon Marchi
2015-02-09 23:53 ` [PATCH 01/36] Create libiberty/libiberty.m4, have GDB and GDBserver use it Pedro Alves
2015-02-09 23:35 ` Pedro Alves
2015-02-27 16:23 ` Pedro Alves
2015-02-09 23:54 ` [PATCH 30/36] quit_force: Replace TRY_CATCH wrapper macros Pedro Alves
2015-02-09 23:54 ` [PATCH 10/36] Add extern "C" to declarations of C symbols Pedro Alves
2015-02-11 11:51 ` Pedro Alves
2015-02-10 0:21 ` [PATCH 24/36] breakpoint.h: move enum ‘print_stop_action’ Pedro Alves
2015-02-11 12:28 ` Yao Qi
2015-02-10 15:07 ` [PATCH 00/36] Support building GDB as a C++ program Michael Eager
2015-02-11 17:15 ` Yao Qi
2015-02-12 11:34 ` Pedro Alves
2015-02-17 23:19 ` Patrick Palka
2015-02-18 21:54 ` Yao Qi
2015-02-18 23:49 ` Patrick Palka
2015-02-27 18:19 ` Pedro Alves
2015-02-27 23:52 ` Patrick Palka
2015-02-28 0:09 ` Pedro Alves
2015-03-07 16:01 ` Pedro Alves
2015-03-07 17:58 ` [all pushed] " Pedro Alves
2015-03-16 4:42 ` asmwarrior
2015-03-16 5:05 ` asmwarrior
2015-03-16 5:22 ` asmwarrior
2015-03-16 7:15 ` asmwarrior
2015-03-16 8:20 ` asmwarrior
2015-03-16 11:43 ` [pushed] stub-termcap.c: prototype tputs's parameter's parameter, for C++ mode (Re: [all pushed] Re: [PATCH 00/36] Support building GDB as a C++ program) Pedro Alves
2015-03-16 11:46 ` [pushed] stub termcap, add extern "C" " Pedro Alves
2015-03-16 11:55 ` [all pushed] Re: [PATCH 00/36] Support building GDB as a C++ program Pedro Alves
2015-03-16 11:42 ` Pedro Alves
2015-05-15 8:13 ` asmwarrior
2015-05-15 8:24 ` asmwarrior
2015-05-15 15:09 ` Pedro Alves
2015-05-15 15:04 ` Pedro Alves [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55560B0D.8030307@redhat.com \
--to=palves@redhat.com \
--cc=asmwarrior@gmail.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox