I understand. Thank you very much for the thorough explanation, Jim! 🙂

― Vangelis


> On 30 Apr 2020, at 23:38, Jim Ingham <jing...@apple.com> wrote:
> 
> 
> 
>> On Apr 30, 2020, at 12:43 PM, Vangelis Tsiatsianas via lldb-dev 
>> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
>> 
>> Thank you for the answer, Greg.
>> 
>> I personally managed to work around the problem, although it confused me a 
>> bit at first and took a while to figure out the cause. May I suggest the 
>> addition of a note in the documentation of "{Breakpoint, 
>> Watchpoint}::{Invoke, Set}Callback()" and possibly other relevant functions 
>> as a warning to future developers that may stumble upon the same issue?
>> 
>> Regarding the public C++ API, would defining "break_id_t" as "int64_t" be a 
>> viable solution or that change would also break the API? It seems that 
>> making both types 64-bit alleviates the issue, despite the sign difference.
> 
> Mangled names don’t encode typedef names, but the bare type.  For instance:
> 
>  > cat signatures.cpp 
> #include <stdint.h>
> #include <stdio.h>
> 
> typedef int64_t break_id_t;
> 
> struct Foo {
>   void GiveMeABreak(break_id_t id) { printf("Got: %d\n", id); }
> };
> 
> int
> main()
> {
>   Foo myFoo;
>   myFoo.GiveMeABreak(100);
>   return 0;
> }
>  > clang++ -g -O0 signatures.cpp
>  > nm a.out | grep GiveMeABreak
> 0000000100000f50 T __ZN3Foo12GiveMeABreakEx
>  > c++filt __ZN3Foo12GiveMeABreakEx
> Foo::GiveMeABreak(long long)
> 
> So this change would change the mangled names of any methods taking a 
> break_id_t, and mean old clients would get missing symbol errors when running 
> with the new API’s.  So this isn’t something we can do.
> 
> Jim
> 
> 
>> 
>> 
>> ― Vangelis
>> 
>> 
>>> On 30 Apr 2020, at 22:22, Greg Clayton <clayb...@gmail.com 
>>> <mailto:clayb...@gmail.com>> wrote:
>>> 
>>> 
>>> 
>>>> On Apr 30, 2020, at 8:50 AM, Vangelis Tsiatsianas via lldb-dev 
>>>> <lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> I would like to ask a question regarding "BreakpointHitCallback", which is 
>>>> declared as such:
>>>> 
>>>> bool (*BreakpointHitCallback)(void *baton,
>>>>                               StoppointCallbackContext *context,
>>>>                               lldb::user_id_t break_id,
>>>>                               lldb::user_id_t break_loc_id);
>>>> 
>>>> Is there any particular reason that "break_id" and "break_loc_id" are of 
>>>> type "user_id_t" (64-bit unsigned) instead of "break_id_t" (32-bit 
>>>> signed), which is used both for "Stoppoint::m_bid" and 
>>>> "StoppointLocation::m_loc_id"?
>>> 
>>> I believe this callback predated the time when we added break_id and 
>>> break_loc_id, and since arguments are part of the signature of C++ 
>>> functions, we didn't change it in order to keep the public API from 
>>> changing. Or this could have just been a mistake. Either way, we have a 
>>> stable API and can't really change it.
>>>> 
>>>> This causes an issue mainly with internal breakpoints, since the callback 
>>>> of an internal breakpoint with (ID == 0xfffffffe) is called with (break_id 
>>>> == 0xfffffffffffffffe), forcing the callback to cast the argument back to 
>>>> a 32-bit signed in order to use it correctly, e.g. when the IDs are stored 
>>>> and need to be looked up.
>>>> 
>>>> A small example attempting to illustrate the problem: 
>>>> https://godbolt.org/z/y8LbK2 <https://godbolt.org/z/y8LbK2>
>>> Sorry for the issue, but I think we are stuck with it now.
>>> 
>>> 
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev@lists.llvm.org <mailto:lldb-dev@lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev 
>> <https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev>
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to