Make target_read_alloc & al return vectors

Message ID 5ead66c6-e0cb-c9b6-b882-79c232cc389c@simark.ca
State New, archived
Headers

Commit Message

Simon Marchi July 7, 2018, 3:10 p.m. UTC
  On 2018-07-07 04:54 AM, Andreas Schwab wrote:
> ../../gdb/ia64-tdep.c: In function ‘LONGEST getunwind_table(gdb_byte**)’:
> ../../gdb/ia64-tdep.c:2664:16: error: too many arguments to function ‘gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > > target_read_alloc(target_ops*, target_object, const char*)’
>      NULL, buf_p);
>                 ^
> In file included from ../../gdb/inferior.h:41:0,
>                  from ../../gdb/ia64-tdep.c:21:
> ../../gdb/target.h:341:40: note: declared here
>  extern gdb::optional<gdb::byte_vector> target_read_alloc
>                                         ^
> ../../gdb/ia64-tdep.c:2663:5: error: cannot convert ‘gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > >’ to ‘LONGEST {aka long int}’ in assignment
>    x = target_read_alloc (current_top_target (), TARGET_OBJECT_UNWIND_TABLE,
>      ^
> 
> Andreas.
> 

Hi Andreas,

I have been unable to build libunwind for ia64 before (using the 1.2
branch), that's why I missed it.  Now I tried to build the 1.1 and it
works fine.

I fixed up the call to target_read_alloc to the best of my knowledge,
with as little changes to the code as possible.  However, I can't test
the result more than build it.  Can you please review the patch below?

Just to confirm, do you also see errors later in the build, like:

In file included from /home/simark/src/binutils-gdb/gdb/ia64-libunwind-tdep.c:39:
/home/simark/src/binutils-gdb/gdb/ia64-libunwind-tdep.c:114:1: error: ISO C++ forbids converting a string constant to ‘char*’ [-Werror=write-strings]
 static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
 ^~~~~~~~~~~~~~
/home/simark/src/binutils-gdb/gdb/common/preprocessor.h:28:25: note: in definition of macro ‘STRINGIFY_1’
 #define STRINGIFY_1(x) #x
                         ^
?

----

From efd663c4d54b64f394d51faabc74f249d0bf32a7 Mon Sep 17 00:00:00 2001
From: Simon Marchi <simon.marchi@polymtl.ca>
Date: Sat, 7 Jul 2018 10:55:14 -0400
Subject: [PATCH] Fix compilation error in ia64-tdep.c with libunwind-ia64

Commit

  9018be22e022 ("Make target_read_alloc & al return vectors")

failed to update the code in ia64-tdep.c, for HAVE_LIBUNWIND_IA64_H.
This patch fixes that.

gdb/ChangeLog:

	* ia64-tdep.c (ktab_buf): New global.
	(getunwind_table): Return a gdb::optional<gdb::byte_vector>.
	(get_kernel_table): Adjust.
---
 gdb/ia64-tdep.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)
  

Comments

Andreas Schwab July 7, 2018, 5:23 p.m. UTC | #1
This is the next error:

../../gdb/ia64-linux-nat.c:73:8: error: conflicting return type specified for ‘virtual bool ia64_linux_nat_target::have_steppable_watchpoint()’
   bool have_steppable_watchpoint () { return 1; }
        ^
In file included from ../../gdb/inferior.h:41:0,
                 from ../../gdb/ia64-linux-nat.c:22:
../../gdb/target.h:554:17: error:   overriding ‘virtual int target_ops::have_steppable_watchpoint()’
     virtual int have_steppable_watchpoint ()
                 ^

Andreas.
  
Simon Marchi July 7, 2018, 5:57 p.m. UTC | #2
On 2018-07-07 13:23, Andreas Schwab wrote:
> This is the next error:
> 
> ../../gdb/ia64-linux-nat.c:73:8: error: conflicting return type
> specified for ‘virtual bool
> ia64_linux_nat_target::have_steppable_watchpoint()’
>    bool have_steppable_watchpoint () { return 1; }
>         ^
> In file included from ../../gdb/inferior.h:41:0,
>                  from ../../gdb/ia64-linux-nat.c:22:
> ../../gdb/target.h:554:17: error:   overriding ‘virtual int
> target_ops::have_steppable_watchpoint()’
>      virtual int have_steppable_watchpoint ()
>                  ^

The fix for this is probably obvious (change int for bool).  Can you 
take care of it?  I'm not on my gdb-development-capable computer, and 
probably don't have an ia64 cross-compiler handy.  Does the patch for 
target_read_alloc look good to you?

Simon
  
Andreas Schwab July 7, 2018, 6:24 p.m. UTC | #3
On Jul 07 2018, Simon Marchi <simark@simark.ca> wrote:

> On 2018-07-07 13:23, Andreas Schwab wrote:
>> This is the next error:
>>
>> ../../gdb/ia64-linux-nat.c:73:8: error: conflicting return type
>> specified for ‘virtual bool
>> ia64_linux_nat_target::have_steppable_watchpoint()’
>>    bool have_steppable_watchpoint () { return 1; }
>>         ^
>> In file included from ../../gdb/inferior.h:41:0,
>>                  from ../../gdb/ia64-linux-nat.c:22:
>> ../../gdb/target.h:554:17: error:   overriding ‘virtual int
>> target_ops::have_steppable_watchpoint()’
>>      virtual int have_steppable_watchpoint ()
>>                  ^
>
> The fix for this is probably obvious (change int for bool).  Can you take
> care of it?  I'm not on my gdb-development-capable computer, and probably
> don't have an ia64 cross-compiler handy.  Does the patch for
> target_read_alloc look good to you?

This is the next error:

  CXXLD  gdb
ia64-linux-nat.o:(.data.rel.ro._ZTV21ia64_linux_nat_target[_ZTV21ia64_linux_nat_target]+0x170): undefined reference to `ia64_linux_nat_target::can_use_hw_breakpoint(bptype, int, int)'
ia64-linux-nat.o:(.data.rel.ro._ZTV21ia64_linux_nat_target[_ZTV21ia64_linux_nat_target]+0x650): undefined reference to `ia64_linux_nat_target::read_description()'
ia64-linux-nat.o:(.data.rel.ro._ZTV21ia64_linux_nat_target[_ZTV21ia64_linux_nat_target]+0xba0): undefined reference to `ia64_linux_nat_target::low_new_thread(lwp_info*)'
collect2: error: ld returned 1 exit status

Andreas.
  
Simon Marchi July 16, 2018, 6 p.m. UTC | #4
On 2018-07-07 11:10 AM, Simon Marchi wrote:
> On 2018-07-07 04:54 AM, Andreas Schwab wrote:
>> ../../gdb/ia64-tdep.c: In function ‘LONGEST getunwind_table(gdb_byte**)’:
>> ../../gdb/ia64-tdep.c:2664:16: error: too many arguments to function ‘gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > > target_read_alloc(target_ops*, target_object, const char*)’
>>      NULL, buf_p);
>>                 ^
>> In file included from ../../gdb/inferior.h:41:0,
>>                  from ../../gdb/ia64-tdep.c:21:
>> ../../gdb/target.h:341:40: note: declared here
>>  extern gdb::optional<gdb::byte_vector> target_read_alloc
>>                                         ^
>> ../../gdb/ia64-tdep.c:2663:5: error: cannot convert ‘gdb::optional<std::vector<unsigned char, gdb::default_init_allocator<unsigned char, std::allocator<unsigned char> > > >’ to ‘LONGEST {aka long int}’ in assignment
>>    x = target_read_alloc (current_top_target (), TARGET_OBJECT_UNWIND_TABLE,
>>      ^
>>
>> Andreas.
>>
> 
> Hi Andreas,
> 
> I have been unable to build libunwind for ia64 before (using the 1.2
> branch), that's why I missed it.  Now I tried to build the 1.1 and it
> works fine.
> 
> I fixed up the call to target_read_alloc to the best of my knowledge,
> with as little changes to the code as possible.  However, I can't test
> the result more than build it.  Can you please review the patch below?
> 
> Just to confirm, do you also see errors later in the build, like:
> 
> In file included from /home/simark/src/binutils-gdb/gdb/ia64-libunwind-tdep.c:39:
> /home/simark/src/binutils-gdb/gdb/ia64-libunwind-tdep.c:114:1: error: ISO C++ forbids converting a string constant to ‘char*’ [-Werror=write-strings]
>  static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
>  ^~~~~~~~~~~~~~
> /home/simark/src/binutils-gdb/gdb/common/preprocessor.h:28:25: note: in definition of macro ‘STRINGIFY_1’
>  #define STRINGIFY_1(x) #x
>                          ^
> ?
> 
> ----
> 
> From efd663c4d54b64f394d51faabc74f249d0bf32a7 Mon Sep 17 00:00:00 2001
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Date: Sat, 7 Jul 2018 10:55:14 -0400
> Subject: [PATCH] Fix compilation error in ia64-tdep.c with libunwind-ia64
> 
> Commit
> 
>   9018be22e022 ("Make target_read_alloc & al return vectors")
> 
> failed to update the code in ia64-tdep.c, for HAVE_LIBUNWIND_IA64_H.
> This patch fixes that.

I pushed this patch.

Simon
  

Patch

diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 0df62e26ab39..2fab60c1d01e 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -69,6 +69,7 @@  struct ia64_table_entry
   };

 static struct ia64_table_entry *ktab = NULL;
+static gdb::optional<gdb::byte_vector> ktab_buf;

 #endif

@@ -2647,11 +2648,9 @@  ia64_access_mem (unw_addr_space_t as,
 }

 /* Call low-level function to access the kernel unwind table.  */
-static LONGEST
-getunwind_table (gdb_byte **buf_p)
+static gdb::optional<gdb::byte_vector>
+getunwind_table ()
 {
-  LONGEST x;
-
   /* FIXME drow/2005-09-10: This code used to call
      ia64_linux_xfer_unwind_table directly to fetch the unwind table
      for the currently running ia64-linux kernel.  That data should
@@ -2660,10 +2659,8 @@  getunwind_table (gdb_byte **buf_p)
      we should find a way to override the corefile layer's
      xfer_partial method.  */

-  x = target_read_alloc (current_top_target (), TARGET_OBJECT_UNWIND_TABLE,
-			 NULL, buf_p);
-
-  return x;
+  return target_read_alloc (current_top_target (), TARGET_OBJECT_UNWIND_TABLE,
+			    NULL);
 }

 /* Get the kernel unwind table.  */				
@@ -2674,15 +2671,12 @@  get_kernel_table (unw_word_t ip, unw_dyn_info_t *di)

   if (!ktab)
     {
-      gdb_byte *ktab_buf;
-      LONGEST size;
-
-      size = getunwind_table (&ktab_buf);
-      if (size <= 0)
+      ktab_buf = getunwind_table ();
+      if (!ktab_buf)
 	return -UNW_ENOINFO;

-      ktab = (struct ia64_table_entry *) ktab_buf;
-      ktab_size = size;
+      ktab = (struct ia64_table_entry *) ktab_buf->data ();
+      ktab_size = ktab_buf->size ();

       for (etab = ktab; etab->start_offset; ++etab)
         etab->info_offset += KERNEL_START;