sgraenitz added a comment.

> (However if you are interested in something like this, then it might be 
> interesting to look at whether this MethodName stuff couldn't be properly 
> pluginified. Something like where a Language class registers a callback for a 
> specific mangling type, and then accessing that through this)

Yes this sounds more like a plan. An isolated refactoring patch without would 
be appropriate I think. In contrast, making a quick fix just to avoid the 
`llvm::Any` seems less appealing to me.



================
Comment at: include/lldb/Core/RichManglingInfo.h:83-84
+public:
+  RichManglingInfo *SetItaniumInfo();
+  RichManglingInfo *SetLegacyCxxParserInfo(const ConstString &mangled);
+
----------------
labath wrote:
> sgraenitz wrote:
> > labath wrote:
> > > I find it odd that one of these functions is stateless 
> > > (`SetLegacyCxxParserInfo` takes the string which initializes the object 
> > > as an argument), while the other receives the state magically via the IPD 
> > > accessor.
> > > 
> > > Would it be possible to change it so that the other option is stateless 
> > > too (`SetItaniumInfo(ConstString mangled)`)?
> > > 
> > > We could change `RichManglingInfo` to return the full demangled name too, 
> > > so that you have access to the demangled name via this API too (which /I 
> > > think/ is the reason why you created a separate 
> > > `GetItaniumRichDemangleInfo` function).
> > > Would it be possible to change it so that the other option is stateless 
> > > too (`SetItaniumInfo(ConstString mangled)`)?
> > I think that would be misleading for the reader. Symmetry is always nice to 
> > indicate congruent behavior, but this is not the case here. The fallback 
> > C++ parser version mimics the previous behavior: demangle the name in step 
> > 1 and if that succeeds, parse it with `CPlusPlusLanguage::MethodName` to 
> > decode its properties. The IPD does that in a single step and so there is 
> > nothing to do in `SetItaniumInfo()`. `SetLegacyCxxParserInfo()` on the 
> > other hand has to create a `CPlusPlusLanguage::MethodName` from the mangled 
> > string.
> > 
> > > We could change `RichManglingInfo` to return the full demangled name too, 
> > > so that you have access to the demangled name via this API too (which /I 
> > > think/ is the reason why you created a separate 
> > > GetItaniumRichDemangleInfo function).
> > The interface wants to provide access to the name's encoded properties. 
> > That doesn't really include the demangled "human readable" string 
> > representation (it's also not needed in 
> > `Symtab::RegisterMangledNameEntry()`).
> > 
> > Of course `Symtab::InitNameIndexes()` will ask for `GetDemangledName()` 
> > just after processing the mangled one. I think chances are good that for 
> > symbols that are not filtered out anyway, we reached 
> > `DemangleWithRichManglingInfo()` earlier and it will be in the string pool 
> > already (see Mangled.cpp:322). Otherwise, yes it will be demangled in with 
> > a new IPD instance.
> > 
> > I think it's not bad to keep these cases as they are. I would propose to 
> > investigate the performance of the current implementation in more detail 
> > and think about the benefits before mixing them. Not sure at all, if it 
> > would bring measurable gain.
> I don't see how this would be misleading. Both versions provide a way to 
> access the name's properties. The fact that they take slightly different 
> inputs (one takes a mangled name, one demangled) makes them slightly 
> different, but I don't find that too troublesome. We could encode that 
> difference in the method name to make it more obvious. What troubles me more 
> is that you have two-step initialization for the IPD case. It's always nice 
> to avoid that, and that's particularly important when it's asymmetric with 
> the other method.
> 
> Let me try to elaborate on how I'd do this. `RichManglingContext` (ps: maybe 
> it's not correct to call this a *mangling* context, because the second method 
> does not use mangled names. `RichMethodContext` ?) would have two methods:
> `fromItaniumName(ConstString ItaniumMangled)` and 
> `fromCxxMethodName(ConstString Name)`. Both would return `RichManglingInfo` 
> (`RichMethodInfo` ?) as they do now.
> 
> Then the usage would be something like:
> ```
>   case eManglingSchemeItanium:
>     auto *info = context.fromItaniumName(m_mangled);
>     m_demangled.SetCStringWithMangledCounterPart(info->GetFullName(), 
> m_mangled);
>     return info;
> 
>   case eManglingSchemeMSVC:
>     
> m_demangled.SetCStringWithMangledCounterpart(demangle_manually(m_mangled), 
> m_mangled);
>     return context.fromCxxMethodName(m_demangled);
> ```
> The only change necessary for this is to include the full demangled name in 
> the "name's encoded properties". While that may not be a *property* of the 
> name by the strictest definition, I don't think it's much of a stretch to 
> include it there, and it does not require making any compromises, as both 
> methods already have access to this information.
> 
> So overall, I believe this should have no impact on performance, while 
> improving the "symmetry" of the code (which is somewhat subjective, but I am 
> hoping that we can agree that a having single method is better than having 
> two methods which must be called in the right order). Is there anything I'm 
> missing here?
Ok, sounds reasonable. Let's try that. I will prepare a patch.


================
Comment at: source/Core/RichManglingInfo.cpp:36-40
+RichManglingContext::SetLegacyCxxParserInfo(const ConstString &mangled) {
+  m_info.ResetProvider();
+  m_info.m_provider = RichManglingInfo::PluginCxxLanguage;
+  m_info.m_legacy_parser = new CPlusPlusLanguage::MethodName(mangled);
+  return &m_info;
----------------
labath wrote:
> sgraenitz wrote:
> > labath wrote:
> > > Is this really the **mangled** name?
> > Yes, it is.
> How is that possible? I see nothing in CPlusPlusLanguage::MethodName which 
> would perform the demangling, and yet it clearly operates on demangled names. 
> Also, the LHS of this patch creates MethodName instances like this
> `CPlusPlusLanguage::MethodName 
> cxx_method(mangled.GetDemangledName(lldb::eLanguageTypeC_plus_plus));`
> 
> 
Oh right, I should revisit that.

While we are here: It's a pity that only MSVC-mangled names trigger the 
fallback case with the new implementation. Thus, my unit test has no coverage 
for it and I didn't recognize the mistake. I thought about integrating 
ObjCLanguage parsing here too. On the one hand this would improve test 
coverage. On the other hand it would cause a semantic change in name indexing 
(and my ObjC knowledge is quite limited).

What do you think?


https://reviews.llvm.org/D50071



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to