Not yet. Jim
> On Feb 18, 2015, at 9:38 AM, Zachary Turner <ztur...@google.com> wrote: > > Wanted to ping this thread so it doesn't get lost. Jim, is Sean back yet? > No worries if not as I've been sidetracked with other things, but at some > point I'd like to discuss this with him. > > On Wed Jan 14 2015 at 3:05:09 AM Abid, Hafiz <hafiz_a...@mentor.com> wrote: > Please also note that changing look from Full to Base changes the behaviour > somewhat. > > > > namespace testabc > > { > > int foo(int y) > > { > > return y+1; > > } > > } > > > > int foo (int x) > > { > > return x + 1; > > } > > int main (void) > > { > > int y = 0; > > > > while (1) > > { > > y = foo(y); > > y += testabc::foo (y); > > } > > > > return 0; > > } > > > > While stopped at the start of main, > > > > Currently: > > (lldb) p foo > > (int (*)(int)) $2 = 0x00000000004004fc (expr`foo(int) at expr_test.cpp:11) > > (lldb) p testabc::foo > > (int (*)(int)) $3 = 0x00000000004004ed (expr`testabc::foo(int) at > expr_test.cpp:4) > > (lldb) b foo > > Breakpoint 4: 2 locations. > > > > > > After proposed change: > > (lldb) p foo > > (int (*)(int)) $0 = 0x00000000004004ed (expr`testabc::foo(int) at > expr_test.cpp:4) > > (lldb) p ::foo > > (int (*)(int)) $1 = 0x00000000004004ed (expr`testabc::foo(int) at > expr_test.cpp:4) > > (lldb) b foo > > Breakpoint 2: 2 locations. > > > > > > So after the change, lldb will find ‘foo’ from the namespace instead of the > global one. It also shows the currently lldb is not handling the :: operator > correctly too so there is no way to access the global one. > > > > Regards, > > Abid > > > > > > From: Zachary Turner [mailto:ztur...@google.com] > Sent: 13 January 2015 19:41 > To: jing...@apple.com > Cc: Abid, Hafiz; lldb-dev@cs.uiuc.edu; Chandler Carruth; David Majnemer > > > Subject: Re: [lldb-dev] Problem with ClangExpressionDeclMap > > > > > Hmm. Well I will defer to the clang people that I CC'ed on this thread. > Admittedly this isn't an area I know much about. I was told by them that in > theory that they thought it would work, but then again they don't know much > about LLDB either. We need someone who knows a lot about both :) > > > > Anyway, going back to the original topic unless Chandler or David wants to > chime in about name lookup. > > > > Is Sean the only person that can reasonably answer my question about changing > the full name lookup to a base name lookup? It fixes this bug on Windows. I > might be able to fix it by, as Abid pointed out earlier, adding Windows to > the list of platforms that use this "workaround" similar to how Linux and > FreeBSD are doing. But since it manually inspects the mangled name, I'd kind > of like to avoid this and do a proper fix, and I actually think changing the > full name lookup to a base name lookup would allow me to remove that > workaround on Linux and FreeBSD. > > > > It broke 2 tests on Linux, but I fixed them in the actual tests. The > breakage occurred in cases where someone has casted something to a class type > in the debugger and (I think) a synthetic type had been created in the > debugger with the same name. So the fix I employed in the test was instead > of casting to, for example, (Foo *)variable, cast it like (class Foo > *)variable. > > > > On Tue Jan 13 2015 at 11:31:08 AM <jing...@apple.com> wrote: > > Yes, I thought along the lines you suggest at first, but what we were told is > that at least for C languages, at the point clang needs to know "what could > the token 'Foo'" mean, it doesn't yet know what kind of entity the name > represents. Since you can have a type, a local variable, and an ivar that > all share the same name, it needs to know what the name could possibly be > before it can tell which one of these it actually is (or if the statement > can't possibly make sense.) So it asks us about the name, and we have to > provide all the entities it could possibly be. Then clang will sort out > which one makes sense. As I understand it the model where lldb only needs to > answer "find me a class named Foo", etc. is not viable. > > I started chasing down a bug similar to the one that you refer to and it > looks like there are places where clang assumes that it knows from the > context already provided so it doesn't ask us if there might be another > entity of the same name. There may be more than one problem of this sort, > but the proper solution is to figure out the other places in clang that need > to call out to the debugger's ClangASTSource. > > As for forcing the user to specify globals, etc, by fully writing them out if > they weren't in the current shared library, etc, you can try to propose that, > but you will find yourself a very unpopular person... > > Jim > > > > On Jan 13, 2015, at 11:12 AM, Zachary Turner <ztur...@google.com> wrote: > > > > Before I write out this email, I just want to state that my concern comes > > mostly from the fact that the name lookup code seems to have many codepaths > > that depend on not only the OS flavor, but also the mangling scheme. It > > makes it very hard to maintain, improve, or even verify that things are > > working correctly. For example, see this bug. Most of this could be > > solved by just saying "clang, what is this thing?" BTW, I CC'ed David and > > Chandler, because they know quite a lot about how name lookup works in > > Clang and can probably provide quite a lot of edge cases that would break > > name lookup in LLDB currently, similar to the aforementioned bug. > > > > That being said, to respond to your point, since you have the forward > > declaration, when you do "p *foo", the compiler should be able to tell you > > "The type of this expression is <class Foo>". Then you look in the debug > > info ignoring scope of any kind for the definition of <class Foo>. The > > compiler only does the name lookup based on the current scope, but once it > > knows the type it shouldn't have to worry about visibility anymore when > > checking the symbol file. There may be cases where the debug info file > > contains multiple definitions of <class Foo> in different source files, or > > modules. In the case where it's not ambiguous, there's nothing to worry > > about. In the case where it is, I don't think LLDB should try to be smart > > about it anyway, because the user probably knows best. > > > > So ambiguous types could be handled the same way as something that isn't > > visible from the current function (another use case you said LLDB tries to > > support) -- in particular there could be a syntax for specifying the scope. > > Off the top of my head, something like this, > > [<lib>,<file>,<function>]expression. Any of the 3 fields in the braces > > could be unspecified. So, for example, suppose you have a file named > > foo.cpp. This file is compiled into two separate libraries, foo1.so and > > foo2.so, and looks like this: > > > > // foo.cpp > > int g_global = 0; > > > > void func() > > { > > static int g_static = 1; > > } > > > > void func2() > > { > > int local = 2; > > } > > > > > > If the debugger is stopped in func() from foo1, you could do this: > > > > (lldb) p g_global ; equivalent to "p [foo1, foo.cpp, ]g_global" > > (lldb) p g_static ; equivalent to "p [foo1, foo.cpp, func]g_static" > > (lldb) p local ; error, name not found > > > > But you could also do this: > > > > (lldb) p [foo2, , ]g_global ; No matter what module you're in, look for > > all names in foo2.so that are called g_global, in any file. If you find > > more than 1, it's ambiguous and needs to be refined by the user. > > (lldb) p [foo2, , func]g_static ; No matter what module you're in, find > > function local statics in module 'foo', in functions named 'func', declared > > in any file. If you find more than 1 it's ambiguous. > > > > But the default behavior, > > > > (lldb) p g_global > > > > Just searches based on the current stack frame and doesn't do anything > > fancy, which is usually what you want. > > > > (For the record, I know you guys have thought about this harder than I > > have, so I'm just trying to understand. I still think delegating all the > > name lookup to clang is more robust, but I still might be missing some > > important use cases) > > > > On Tue Jan 13 2015 at 10:39:21 AM <jing...@apple.com> wrote: > > > > > On Jan 13, 2015, at 9:58 AM, Zachary Turner <ztur...@google.com> wrote: > > > > > > But then why does it work on Mac? > > > > > > And why is this workaround needed at all, when you can just have it check > > > the basename in the first place (e.g. in FindExternalVisibleDecls)? > > > > > > I guess a higher level, more general question - Why is name lookup so > > > complicated? Clang already knows everything, why does LLDB need to > > > modify the default behavior of Clang's name lookup? I know LLDB can > > > insert its own decls into the AST, but it seems like we can just get > > > avoid returning those to the user, and still use clang for everything > > > else. > > > > > > > I don't get what you mean by this comment. Name lookup in the debugger is > > pretty different from name lookup as it would be if we were sitting in the > > compiler trying to compile the expression as if it had been inserted in the > > current function at the PC. The compiler can be quite strict about what is > > and isn't visible, whereas the debugger has to be as lax as possible. > > > > For instance, suppose I am in a frame of a function that has a pointer to > > Foo, but that function is in a compile unit (and maybe even a shared > > library) that only contains a forward reference to Foo. If you had another > > shared library that contains a definition of Foo, you would certainly want > > to be able to print *Foo. Of course, from a strict compiler standpoint, > > this would be illegal, but telling debugger users that would not be a > > popular move. > > > > Similarly, folks want to be able to use global variables (and eventually > > function statics when we work out a syntax for that) that aren't visible in > > the current function. > > > > So the debugger has to get into the business of broadening name lookup to > > meet these needs. > > > > Jim > > > > > > > On Tue Jan 13 2015 at 2:54:15 AM Abid, Hafiz <hafiz_a...@mentor.com> > > > wrote: > > > In SymbolFileDWARF::FindFunctions (), there is code that runs only for > > > Linux and BSD. That finds the function in global namespace. > > > > > > > > > > > > Regards, > > > > > > Abid > > > > > > > > > > > > From: lldb-dev-boun...@cs.uiuc.edu [mailto:lldb-dev-boun...@cs.uiuc.edu] > > > On Behalf Of Zachary Turner > > > Sent: 12 January 2015 19:51 > > > To: lldb-dev@cs.uiuc.edu; Jim Ingham > > > Subject: [lldb-dev] Problem with ClangExpressionDeclMap > > > > > > > > > > > > Was looking into this bug on Windows, and I traced it down to an issue in > > > ClangExpressionDeclMap. ClangExpressionDeclMap::FindExternalVisibleDecls > > > has a piece of code that looks like this: > > > > > > > > > > > > if (namespace_decl && module_sp) > > > > > > { > > > > > > const bool include_symbols = false; > > > > > > > > > > > > module_sp->FindFunctions(name, > > > > > > &namespace_decl, > > > > > > eFunctionNameTypeBase, > > > > > > include_symbols, > > > > > > include_inlines, > > > > > > append, > > > > > > sc_list); > > > > > > } > > > > > > else if (target && !namespace_decl) > > > > > > { > > > > > > const bool include_symbols = true; > > > > > > > > > > > > // TODO Fix FindFunctions so that it doesn't return > > > > > > // instance methods for eFunctionNameTypeBase. > > > > > > > > > > > > target->GetImages().FindFunctions(name, > > > > > > eFunctionNameTypeFull, > > > > > > include_symbols, > > > > > > include_inlines, > > > > > > append, > > > > > > sc_list); > > > > > > } > > > > > > > > > > > > So it's only searching for the base name if the function is in a > > > namespace, and if it's at global scope it's searching for the full name. > > > > > > > > > > > > I'm not sure why this works on other platforms, but on Windows it doesn't > > > work because if I have this code: > > > > > > > > > > > > int foo(int x) > > > > > > { > > > > > > } > > > > > > > > > > > > then the full name of this function is ?foo@@YAHH@Z > > > > > > > > > > > > If I change eFunctionNameTypeFull to eFunctionNameTypeBase then > > > everything works, and "p foo" finds the function. So I've got a couple > > > of questions: > > > > > > > > > > > > 1) Why all this complicated logic? I would expect that if I type "p foo" > > > then it would just print everything whose base name is foo and is visible > > > from within the current scope? Am I underthinking this? There's special > > > cases for namespaces, global scope, instance methods, variables, > > > functions, and it looks for things in certain orders, etc. Is there any > > > reason why it can't just find everything with a basename of foo visible > > > within the current stack frame? > > > > > > > > > > > > 2) I'm not sure what this comment means: > > > > > > // TODO Fix FindFunctions so that it doesn't return > > > > > > // instance methods for eFunctionNameTypeBase. > > > > > > I changed it to eFunctionNameTypeBase and it fixes the original bug on > > > Windows. I inserted a class with an instance method named foo() and also > > > a global method named foo(), and running "p foo" doesn't find the > > > instance method, only the global method. Is it possible this was somehow > > > fixed, and it was forgotten to change this back to eFunctionNameTypeBase? > > > > > > > > > > > > 3) Why does this work on other platforms? full names are mangled on > > > other platforms too, so I don't know how "p foo" doesn't run into this > > > same issue on other platforms. Any ideas? > > > > > > > > > > > > > > > > > > Currently the best fix I have for this bug on Windows is to change > > > eFunctionNameTypeFull to eFunctionNameTypeBase. but I want to get some > > > thoughts on that worrisome comment before I go forward with that patch. > > > > > > _______________________________________________ lldb-dev mailing list lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev