From: Pedro Alves <pedro@palves.net>
To: Carl Love <cel@us.ibm.com>, Bruno Larsen <blarsen@redhat.com>,
Ulrich Weigand <Ulrich.Weigand@de.ibm.com>,
"will_schmidt@vnet.ibm.com" <will_schmidt@vnet.ibm.com>,
gdb-patches@sourceware.org
Subject: Re: [PATCH 1/2 version 3] fix for gdb.reverse/finish-precsave.exp and gdb.reverse/finish-reverse.exp
Date: Tue, 24 Jan 2023 14:08:05 +0000 [thread overview]
Message-ID: <873eb58a-a6ab-08b2-0827-ca6e0c8088ae@palves.net> (raw)
In-Reply-To: <610d5f171d5f4baeb94887217e69d0e6d70e9d66.camel@us.ibm.com>
On 2023-01-23 9:13 p.m., Carl Love wrote:
> Pedro:
>
> On Mon, 2023-01-23 at 19:17 +0000, Pedro Alves wrote:
>>> Currently on X86, when executing the finish command in reverse, gdb
>>> does a
>>> single step from the first instruction in the callee to get back to
>>> the
>>> caller. GDB stops on the last instruction in the source code line
>>> where
>>> the call was made. When stopped at the last instruction of the
>>> source code
>>> line, a reverse next or step command will stop at the first
>>> instruction
>>> of the same source code line thus requiring two step/next commands
>>> to
>>> reach the previous source code line. It should only require one
>>> step/next
>>> command to reach the previous source code line.
>>>
>>> By contrast, a reverse next or step command from the first line in
>>> a
>>> function stops at the first instruction in the source code line
>>> where the
>>> call was made.
>>
>> I'd think this was on purpose. Note that next/step/reverse-
>> {next/step} are line-oriented
>> stepping commands, they step/next until the previous/next line.
>> While "finish" is described
>> as undoing the _function call_.
>>
>> The manual says:
>>
>> reverse-finish
>> Just as the finish command takes you to the point where the current
>> function returns,
>> reverse-finish takes you to the point where it was called. Instead
>> of ending up at the end of
>> the current function invocation, you end up at the beginning.
>>
>> Say you have a line with multiple statements involving multiple
>> function calls.
>> The simplest would be:
>>
>> func1 (); func2 ();
>>
>> Say you'd stopped inside 'func2'. If you do finish there, in current
>> master gdb
>> stops at the call to 'func2', and you can then decide to reverse step
>> into 'func1'.
>
> I don't think you followed the issue.
Totally possible!
>
> So, if you are in func2 and do a reverse-finish, without the patch gdb
> stops on the last instruction for the line that calls func2.
Right.
> Now if
> you issue a reverse-step, you stop at the first instruction for the
> call to func2, i.e. you are still on the same source code line.
Wait. That right there sounds bogus. The source line looks like:
func1 (); func2 ();
so stepping backwards over that line should always stop at the first
instruction of the line, not in the middle. Let's simplify this.
Here's the full source code of my example:
(gdb) list 1
1 void func1 ()
2 {
3 }
4
5 void func2 ()
6 {
7 }
8
9 int main ()
10 {
11 func1 (); func2 ();
12 }
Compiled with:
$ gcc reverse.c -o reverse -g3 -O0
$ gcc -v
...
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04)
Now let's debug it with target record, using current gdb git master (f3d8ae90b236),
without your patch:
$ gdb ~/reverse
GNU gdb (GDB) 14.0.50.20230124-git
...
Reading symbols from /home/pedro/reverse...
(gdb) start
Temporary breakpoint 1 at 0x1147: file reverse.c, line 11.
Starting program: /home/pedro/reverse
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Temporary breakpoint 1, main () at reverse.c:11
11 func1 (); func2 ();
(gdb) record
(gdb) disassemble /s
Dump of assembler code for function main:
reverse.c:
10 {
0x000055555555513f <+0>: endbr64
0x0000555555555143 <+4>: push %rbp
0x0000555555555144 <+5>: mov %rsp,%rbp
11 func1 (); func2 ();
=> 0x0000555555555147 <+8>: mov $0x0,%eax
0x000055555555514c <+13>: call 0x555555555129 <func1>
0x0000555555555151 <+18>: mov $0x0,%eax
0x0000555555555156 <+23>: call 0x555555555134 <func2>
0x000055555555515b <+28>: mov $0x0,%eax
12 }
0x0000555555555160 <+33>: pop %rbp
0x0000555555555161 <+34>: ret
End of assembler dump.
(gdb) n
12 }
So far so good, a "next" stepped over the whole of line 11 and stopped at line 12.
Let's confirm where we are now:
(gdb) disassemble /s
Dump of assembler code for function main:
reverse.c:
10 {
0x000055555555513f <+0>: endbr64
0x0000555555555143 <+4>: push %rbp
0x0000555555555144 <+5>: mov %rsp,%rbp
11 func1 (); func2 ();
0x0000555555555147 <+8>: mov $0x0,%eax
0x000055555555514c <+13>: call 0x555555555129 <func1>
0x0000555555555151 <+18>: mov $0x0,%eax
0x0000555555555156 <+23>: call 0x555555555134 <func2>
0x000055555555515b <+28>: mov $0x0,%eax
12 }
=> 0x0000555555555160 <+33>: pop %rbp
0x0000555555555161 <+34>: ret
End of assembler dump.
Good, we're at the first instruction of line 12.
Now let's undo the "next", with "reverse-next":
(gdb) reverse-next
11 func1 (); func2 ();
Seemingly stopped at line 11. Let's see exactly where:
(gdb) disassemble /s
Dump of assembler code for function main:
reverse.c:
10 {
0x000055555555513f <+0>: endbr64
0x0000555555555143 <+4>: push %rbp
0x0000555555555144 <+5>: mov %rsp,%rbp
11 func1 (); func2 ();
0x0000555555555147 <+8>: mov $0x0,%eax
0x000055555555514c <+13>: call 0x555555555129 <func1>
=> 0x0000555555555151 <+18>: mov $0x0,%eax
0x0000555555555156 <+23>: call 0x555555555134 <func2>
0x000055555555515b <+28>: mov $0x0,%eax
12 }
0x0000555555555160 <+33>: pop %rbp
0x0000555555555161 <+34>: ret
End of assembler dump.
(gdb)
And lo, we stopped in the middle of line 11! That is a bug, we should have stepped
back all the way to the beginning of the line. The "reverse-next" should have fully
undone the prior "next" command. Here's the same thing without the distracting
disassemble commands:
(gdb) b 11
Breakpoint 1 at 0x1147: file reverse.c, line 11.
(gdb) r
Starting program: /home/pedro/reverse
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at reverse.c:11
11 func1 (); func2 ();
(gdb) p $pc
$1 = (void (*)()) 0x555555555147 <main+8>
(gdb) record
(gdb) next
12 }
(gdb) reverse-next
11 func1 (); func2 ();
(gdb) p $pc
$2 = (void (*)()) 0x555555555151 <main+18>
(gdb)
This:
next -> reverse-next -> next -> reverse-next
... should leave you at the same instruction. But it doesn't in this example!
How does this happen? Let's look at the line table as seen by GDB:
(gdb) maint info line-table reverse.c
objfile: /home/pedro/reverse ((struct objfile *) 0x55dd5df77c50)
compunit_symtab: reverse.c ((struct compunit_symtab *) 0x55dd5de6b2e0)
symtab: /home/pedro/reverse.c ((struct symtab *) 0x55dd5de6b360)
linetable: ((struct linetable *) 0x55dd5dfd3290):
INDEX LINE ADDRESS IS-STMT PROLOGUE-END
0 2 0x0000555555555129 Y
1 3 0x0000555555555131 Y
2 6 0x0000555555555134 Y
3 7 0x000055555555513c Y
4 10 0x000055555555513f Y
5 11 0x0000555555555147 Y <<< here
6 11 0x0000555555555151 Y <<< here
7 12 0x0000555555555160 Y
8 END 0x0000555555555162 Y
Ah, there are two entries for line 11, both marked with IS-STMT. So when
stepping backward GDB only considered the region with index 6, that's why it
stopped at 0x0000555555555151.
Let's look at what we get with clang instead (Ubuntu clang version 14.0.0-1ubuntu1) :
(gdb) maintenance info line-table reverse.c
objfile: /home/pedro/reverse.clang ((struct objfile *) 0x5576be591ca0)
compunit_symtab: reverse.c ((struct compunit_symtab *) 0x5576be485300)
symtab: /home/pedro/reverse.c ((struct symtab *) 0x5576be485380)
linetable: ((struct linetable *) 0x5576be5ec8e0):
INDEX LINE ADDRESS IS-STMT PROLOGUE-END
0 2 0x0000555555555130 Y
1 3 0x0000555555555134 Y Y
2 6 0x0000555555555140 Y
3 7 0x0000555555555144 Y Y
4 10 0x0000555555555150 Y
5 11 0x0000555555555154 Y Y
6 11 0x0000555555555159
7 12 0x000055555555515e Y
8 END 0x0000555555555162 Y
Note no IS-STMT for the second range. And let's look at how GDB behaves with it:
(gdb) b 11
Breakpoint 1 at 0x1154: file reverse.c, line 11.
(gdb) r
Starting program: /home/pedro/reverse.clang
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at reverse.c:11
11 func1 (); func2 ();
(gdb) record
(gdb) p $pc
$1 = (void (*)()) 0x555555555154 <main+4>
(gdb) n
12 }
(gdb) reverse-next
No more reverse-execution history.
main () at reverse.c:11
11 func1 (); func2 ();
(gdb) p $pc
$2 = (void (*)()) 0x555555555154 <main+4>
(gdb)
Bingo. reverse-next fully stepped the whole line backwards.
> You
> have not stepped back into func1 like you wanted to. Now you have to
> issue a second reverse-step to get into func1. With the patch, you
> issue the reverse-finish from func2 and stop at the first instruction
> in the line that calls func2. Now when you issue the reverse-step you
> step back into func1 as expected.
>
So this fix is assuming that the reverse step stops in the middle of a
line, which I think is the real bug to fix. Once that is fixed, then
you will no longer need two reverse-steps after reverse-finish.
Here's what you get with current master without your patch, but using
the test program compiled with clang. Actually, let's use a slightly
modified program to force clang to emit some instructions between
the two calls. Like this:
$ cat reverse.c
void func1 (int i)
{
}
void func2 (int i)
{
}
int main (int argc, char **argv)
{
func1 (argc); func2 (argc);
}
Alright, here's the gdb session, with clang, no gdb patch:
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffdc48) at reverse.c:11
11 func1 (argc); func2 (argc);
(gdb) disassemble /s
Dump of assembler code for function main:
reverse.c:
10 {
0x0000555555555150 <+0>: push %rbp
0x0000555555555151 <+1>: mov %rsp,%rbp
0x0000555555555154 <+4>: sub $0x10,%rsp
0x0000555555555158 <+8>: mov %edi,-0x4(%rbp)
0x000055555555515b <+11>: mov %rsi,-0x10(%rbp)
11 func1 (argc); func2 (argc);
=> 0x000055555555515f <+15>: mov -0x4(%rbp),%edi
0x0000555555555162 <+18>: call 0x555555555130 <func1>
0x0000555555555167 <+23>: mov -0x4(%rbp),%edi
0x000055555555516a <+26>: call 0x555555555140 <func2>
12 }
0x000055555555516f <+31>: xor %eax,%eax
0x0000555555555171 <+33>: add $0x10,%rsp
0x0000555555555175 <+37>: pop %rbp
0x0000555555555176 <+38>: ret
End of assembler dump.
(gdb) record
(gdb) b func2
Breakpoint 2 at 0x555555555147: file reverse.c, line 7.
(gdb) c
Continuing.
Breakpoint 2, func2 (i=1) at reverse.c:7
7 }
(gdb) reverse-finish
Run back to call of #0 func2 (i=1) at reverse.c:7
0x000055555555516a in main (argc=1, argv=0x7fffffffdc48) at reverse.c:11
11 func1 (argc); func2 (argc);
(gdb) disassemble /s
Dump of assembler code for function main:
reverse.c:
10 {
0x0000555555555150 <+0>: push %rbp
0x0000555555555151 <+1>: mov %rsp,%rbp
0x0000555555555154 <+4>: sub $0x10,%rsp
0x0000555555555158 <+8>: mov %edi,-0x4(%rbp)
0x000055555555515b <+11>: mov %rsi,-0x10(%rbp)
11 func1 (argc); func2 (argc);
0x000055555555515f <+15>: mov -0x4(%rbp),%edi
0x0000555555555162 <+18>: call 0x555555555130 <func1>
0x0000555555555167 <+23>: mov -0x4(%rbp),%edi
=> 0x000055555555516a <+26>: call 0x555555555140 <func2>
12 }
0x000055555555516f <+31>: xor %eax,%eax
0x0000555555555171 <+33>: add $0x10,%rsp
0x0000555555555175 <+37>: pop %rbp
0x0000555555555176 <+38>: ret
End of assembler dump.
(gdb) reverse-step
func1 (i=1) at reverse.c:3
3 }
(gdb)
Note how a single reverse-step after the reverse-finish immediately
stepped backwards into func1. Exactly how I describing it originally.
With your patch, you'd break reverse-finish with clang:
(gdb) record
(gdb) b func2
Breakpoint 2 at 0x555555555147: file reverse.c, line 7.
(gdb) c
Continuing.
Breakpoint 2, func2 (i=1) at reverse.c:7
7 }
(gdb) reverse-finish
Run back to call of #0 func2 (i=1) at reverse.c:7
func1 (i=1) at reverse.c:3
3 }
(gdb)
GDB stopped at line 3, info func1 which means it stepped too far without
stopping at func2's call site.
GDB is misbehaving with GCC's debug info. I suspect the reason we get
the two line entries for line 11 and both with IS-STMT is because GCC emits
column debug info nowadays by default. Here's what e.g.,
"llvm-dwarfdump --debug-line reverse" shows:
~~~
Address Line Column File ISA Discriminator Flags
------------------ ------ ------ ------ --- ------------- -------------
0x0000000000001129 2 1 1 0 0 is_stmt
0x0000000000001131 3 1 1 0 0 is_stmt
0x0000000000001134 6 1 1 0 0 is_stmt
0x000000000000113c 7 1 1 0 0 is_stmt
0x000000000000113f 10 1 1 0 0 is_stmt
0x0000000000001147 11 3 1 0 0 is_stmt
0x0000000000001151 11 13 1 0 0 is_stmt
0x0000000000001160 12 1 1 0 0 is_stmt
0x0000000000001162 12 1 1 0 0 is_stmt end_sequence
~~~
We can try disabling that with -gno-column-info, let's see what we get:
(gdb) maint info line-table reverse.c
objfile: /home/pedro/reverse.nocol ((struct objfile *) 0x5611464f6c10)
compunit_symtab: reverse.c ((struct compunit_symtab *) 0x5611463ea2e0)
symtab: /home/pedro/reverse.c ((struct symtab *) 0x5611463ea360)
linetable: ((struct linetable *) 0x561146474c80):
INDEX LINE ADDRESS IS-STMT PROLOGUE-END
0 2 0x0000555555555129 Y
1 3 0x0000555555555134 Y
2 6 0x0000555555555137 Y
3 7 0x0000555555555142 Y
4 10 0x0000555555555145 Y
5 11 0x0000555555555158 Y
6 12 0x0000555555555171 Y
7 END 0x0000555555555173 Y
(gdb)
... and in llvm-dwarfdump:
Address Line Column File ISA Discriminator Flags
------------------ ------ ------ ------ --- ------------- -------------
0x0000000000001129 2 0 1 0 0 is_stmt
0x0000000000001134 3 0 1 0 0 is_stmt
0x0000000000001137 6 0 1 0 0 is_stmt
0x0000000000001142 7 0 1 0 0 is_stmt
0x0000000000001145 10 0 1 0 0 is_stmt
0x0000000000001158 11 0 1 0 0 is_stmt
0x0000000000001171 12 0 1 0 0 is_stmt
0x0000000000001173 12 0 1 0 0 is_stmt end_sequence
Bingo. With no column info, only one entry for line 11.
Pedro Alves
>> While with your change, reverse-finish in func2 will make gdb stop at
>> the beginning
>> of the line, before the call to func1.
>>
>> Thus I'm really not convinced (yet) this change is a good one. It
>> removes
>> a user choice. You can always do reverse-next/step do get what you
>> want
>> reverse-finish do to, already.
>
> Carl
>
next prev parent reply other threads:[~2023-01-24 14:08 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <f594ec0070a6c585e83a6d6c8b29481a86778c0f.camel@us.ibm.com>
[not found] ` <bc6bb459f153c0c5850d4a3e5d80bbf957ec36cc.camel@de.ibm.com>
[not found] ` <8bce850fa1e03e798506dc170d9b57f52034a18a.camel@us.ibm.com>
[not found] ` <cb5875db4e1ac60475877c685e5f172770314523.camel@de.ibm.com>
[not found] ` <adeeeae47c4ca79b32d79aea632ff8b2a24dd93d.camel@us.ibm.com>
[not found] ` <86c5e9c47945894f21b1d8bf6089c730a9f0e1a5.camel@de.ibm.com>
[not found] ` <b1d7ea600d6bb7af487968d938566fae9d5e1745.camel@us.ibm.com>
[not found] ` <5f9047b9582403561d7cce998cab9184167366a1.camel@de.ibm.com>
[not found] ` <e7c8093c350ad475277154014a4f0bb9b472b7af.camel@us.ibm.com>
[not found] ` <f8d6379aff7af076d9edcee7d2981d052b2161ee.camel@de.ibm.com>
[not found] ` <5b50668cbe882c57b8c0e9dcf5be0a253713c4c6.camel@us.ibm.com>
[not found] ` <51c4bfc82ac72e475e10577dc60e4d75fa48767e.camel@de.ibm.com>
[not found] ` <3ea97a8aa9cccb39299adde682f92055d1986ab3.camel@us.ibm.com>
[not found] ` <f5ea8da12631f2496ba0e2263e65a0adc7ac56ca.camel@de.ibm.com>
[not found] ` <53878e37c6e57de1d04d9c9960c5d0a74324ee6e.camel@us.ibm.com>
[not found] ` <a5300b64533fdc753c1d50fa0e6efc21b5457547.camel@de.ibm.com>
[not found] ` <50474aa92ba82eff05cdc8f49001eae56be29670.camel@us.ibm.com>
[not found] ` <f3ef4486c4ba051024602928acdfe5ddf6942b82.camel@de.ibm.com>
[not found] ` <dae6c9790b23a90d5f1494f5b6798346444f257e.camel@us.ibm.com>
[not found] ` <89331c26795e3f7743e1e068dce43b3c2dd53008.camel@us.ibm.com>
[not found] ` <c10a008e441666e4edb0916842d8eefe83f5b2f9.camel@de.ibm.com>
[not found] ` <071f24ecf9b3a2bbbe8fee7db77492eb55c5f3ff.camel@us.ibm.com>
[not found] ` <1d9b21914354bef6a290ac30673741e722e11757.camel@de.ibm.com>
2023-01-11 18:27 ` [PATCH 0/2] " Carl Love
2023-01-11 18:27 ` [PATCH 1/2] " Carl Love
2023-01-12 16:56 ` Tom de Vries
2023-01-12 18:54 ` Carl Love
2023-01-13 13:33 ` Bruno Larsen
2023-01-13 16:43 ` Carl Love
2023-01-13 17:04 ` Bruno Larsen
2023-01-13 19:10 ` Carl Love
2023-01-14 18:08 ` Carl Love
2023-01-16 12:31 ` Bruno Larsen
2023-01-16 16:37 ` [PATCH 0/2 version 2] " Carl Love
2023-01-16 16:37 ` [PATCH 1/2 " Carl Love
2023-01-17 12:35 ` Bruno Larsen
2023-01-20 0:03 ` [PATCH 1/2 version 3] " Carl Love
2023-01-23 19:17 ` Pedro Alves
2023-01-23 21:13 ` Carl Love
2023-01-24 14:08 ` Pedro Alves [this message]
2023-01-24 14:23 ` Bruno Larsen
2023-01-24 15:06 ` Pedro Alves
2023-01-24 16:04 ` Bruno Larsen
2023-01-24 19:12 ` Pedro Alves
2023-01-25 9:49 ` Bruno Larsen
2023-01-25 14:11 ` Ulrich Weigand
2023-01-25 16:42 ` Pedro Alves
2023-01-25 17:13 ` Ulrich Weigand
2023-01-25 17:24 ` Pedro Alves
2023-01-25 19:38 ` Carl Love
2023-01-24 15:51 ` Carl Love
2023-01-24 18:37 ` Pedro Alves
2023-01-24 18:25 ` Carl Love
2023-01-24 19:21 ` Pedro Alves
2023-01-24 19:26 ` Pedro Alves
2023-01-31 0:17 ` Reverse-next bug test case Carl Love
2023-02-01 14:37 ` Pedro Alves
2023-02-01 18:40 ` Carl Love
2023-01-24 15:53 ` [PATCH 1/2 version 3] fix for gdb.reverse/finish-precsave.exp and gdb.reverse/finish-reverse.exp Tom de Vries
2023-01-24 18:48 ` Pedro Alves
2023-01-16 16:37 ` [PATCH 2/2 version 2] " Carl Love
2023-01-17 14:29 ` Bruno Larsen
2023-01-17 16:36 ` Carl Love
2023-01-17 16:55 ` Tom de Vries
2023-01-17 17:03 ` Carl Love
2023-01-17 17:14 ` Tom de Vries
2023-01-17 19:31 ` Carl Love
2023-01-18 10:55 ` Tom de Vries
2023-01-18 16:16 ` Carl Love
2023-01-18 22:26 ` Carl Love
2023-01-19 8:04 ` Bruno Larsen
2023-01-19 16:56 ` Carl Love
2023-01-19 23:57 ` Carl Love
2023-01-20 20:04 ` Carl Love
2023-01-23 16:42 ` [PATCH 1/2 version 3] " Carl Love
2023-01-23 16:42 ` [PATCH 2/2 " Carl Love
2023-02-10 20:55 ` [PATCH ] PowerPC: " Carl Love
2023-02-17 12:24 ` Ulrich Weigand
2023-02-20 16:34 ` Carl Love
2023-02-20 16:48 ` Bruno Larsen
2023-02-20 20:24 ` Carl Love
2023-02-27 16:09 ` [PING] " Carl Love
2023-02-28 13:39 ` Bruno Larsen
2023-02-28 16:19 ` Carl Love
2023-03-01 13:43 ` Tom de Vries
2023-03-01 16:26 ` Carl Love
2023-03-01 14:03 ` Tom de Vries
2023-03-01 16:43 ` Carl Love
2023-03-01 14:34 ` Tom de Vries
2023-03-01 20:39 ` Carl Love
2023-03-01 20:59 ` [PATCH 0/2 " Carl Love
2023-03-01 20:59 ` [PATCH 1/2] " Carl Love
2023-03-03 11:56 ` Bruno Larsen
2023-03-08 16:19 ` [PING] " Carl Love
2023-03-09 16:09 ` Carl Love
2023-03-09 19:03 ` Tom Tromey
2023-03-09 21:42 ` Carl Love
2023-03-09 21:54 ` [PATCH 1/2 ver 2] " Carl Love
2023-03-10 3:53 ` Tom Tromey
2023-03-01 20:59 ` [PATCH 2/2 ] " Carl Love
2023-03-08 16:19 ` [PING] " Carl Love
2023-03-09 16:09 ` Carl Love
2023-03-13 14:16 ` Ulrich Weigand
2023-03-13 17:31 ` Carl Love
2023-03-13 17:38 ` [PATCH 2/2 ver2] " Carl Love
2023-03-17 17:19 ` Ulrich Weigand
2023-03-17 23:05 ` Tom de Vries
2023-03-20 15:04 ` Carl Love
2023-03-20 23:21 ` Carl Love
2023-03-21 3:17 ` Carl Love
2023-03-21 6:52 ` Ulrich Weigand
2023-03-24 17:23 ` [PATCH 2/2 ] " Simon Marchi
2023-03-24 22:16 ` Carl Love
2023-03-25 12:39 ` Simon Marchi
2023-03-27 23:59 ` Carl Love
2023-03-28 1:19 ` Simon Marchi
2023-03-28 15:17 ` Carl Love
2023-03-28 15:38 ` Simon Marchi
2023-07-20 12:01 ` Bruno Larsen
2023-07-20 14:45 ` Carl Love
2023-07-21 7:24 ` Bruno Larsen
2023-07-31 22:59 ` Carl Love
2023-08-02 9:29 ` Bruno Larsen
2023-08-02 15:11 ` Carl Love
2023-01-13 15:42 ` [PATCH 1/2] " Bruno Larsen
2023-01-11 18:27 ` [PATCH 2/2] " Carl Love
2023-01-13 15:55 ` Bruno Larsen
2023-01-14 18:08 ` Carl Love
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=873eb58a-a6ab-08b2-0827-ca6e0c8088ae@palves.net \
--to=pedro@palves.net \
--cc=Ulrich.Weigand@de.ibm.com \
--cc=blarsen@redhat.com \
--cc=cel@us.ibm.com \
--cc=gdb-patches@sourceware.org \
--cc=will_schmidt@vnet.ibm.com \
/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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).