We could use clang::Decl* etc. in these classes but that would defeat the whole 
concept that they are supposed to implement. CompilerType, CompilerDecl, etc.. 
are all classes that represent their respective equivalent in a language 
plugin. For Clang that is indeed clang::Type* and clang::Decl*, but Swift is 
storing swift::Type* and swift::Decl* in these void* pointers (and passes a 
SwiftASTContext* instead of a ClangASTContext* as a m_type_system). So if we 
change that to clang::Decl* then the all other language plugins like Swift are 
effectively broken. It would also mean that generic LLDB code using these 
classes would have a hard dependency on Clang.

And there shouldn’t be any place where we unconditionally cast this to 
clang::Decl* as this would directly crash swift-lldb. The m_type_system (which 
is either ClangASTContext or SwiftASTContext) can freely cast the void* to 
clang::Decl/swift::Decl as the checking happens through the virtual function 
call to the m_type_system interface (Swift types always have a SwiftASTContext 
as m_type_system, Clang types have a ClangASTContext as m_type_system).

Having said that, I’m not saying that the void* pointers in these classes are 
the best solution we could have here (there is a reason why I keep removing all 
these void* pointer conversions). If you see a way to get rid of them, then be 
my guest.

> On 3. Jan 2020, at 01:52, Shafik Yaghmour <syaghm...@apple.com> wrote:
> 
> To further clarify all the member functions of CompilerDecl e.g.:
> 
> GetMangledName(…)
> GetDeclContext(…)
> 
> End up passing m_opaque_decl as an argument to a member function of 
> m_type_system and in these member functions they unconditionally cast the 
> argument to Decl* so why not make m_opaque_decl a Decl*
> 
>> On Jan 2, 2020, at 4:20 PM, Shafik Yaghmour via lldb-commits 
>> <lldb-commits@lists.llvm.org> wrote:
>> 
>> Apologies, m_opaque_decl member of CompilerDecl and operator < in 
>> CompilerDecl.h 
>> 
>>> On Jan 2, 2020, at 3:54 PM, Raphael “Teemperor” Isemann 
>>> <teempe...@gmail.com> wrote:
>>> 
>>> Not sure if I can follow. What variable should just be a Decl* and what 
>>> operator<?
>>> 
>>> (Also yeah that reinterpret_cast could also be a static_cast)
>>> 
>>>> On Jan 3, 2020, at 12:38 AM, Shafik Yaghmour <syaghm...@apple.com> wrote:
>>>> 
>>>> I am not crazy about the reinterpret_cast although if we look inside 
>>>> CompilerDecl impl we can see that basically it is always assuming it is a 
>>>> Decl* and just C-style casts it as such. So why not just make it a Decl*
>>>> 
>>>> Also operator<(…) is super sketchy doing a < on void* 
>>>> 
>>>>> On Dec 28, 2019, at 6:52 AM, Raphael Isemann via lldb-commits 
>>>>> <lldb-commits@lists.llvm.org> wrote:
>>>>> 
>>>>> 
>>>>> Author: Raphael Isemann
>>>>> Date: 2019-12-28T15:20:19+01:00
>>>>> New Revision: 8612e92ed590e615f9f56e4fb86a1fdaf3a39e15
>>>>> 
>>>>> URL: 
>>>>> https://github.com/llvm/llvm-project/commit/8612e92ed590e615f9f56e4fb86a1fdaf3a39e15
>>>>> DIFF: 
>>>>> https://github.com/llvm/llvm-project/commit/8612e92ed590e615f9f56e4fb86a1fdaf3a39e15.diff
>>>>> 
>>>>> LOG: [lldb][NFC] Remove GetASTContext call in ClangDeclVendor
>>>>> 
>>>>> Instead of returning NamedDecls and then calling GetASTContext
>>>>> to find back the ClangASTContext we used can just implement the
>>>>> FindDecl variant that returns CompilerDecls (and implement the
>>>>> other function by throwing away the ClangASTContext part of the
>>>>> compiler decl).
>>>>> 
>>>>> Added: 
>>>>> 
>>>>> 
>>>>> Modified: 
>>>>> lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp
>>>>> lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h
>>>>> lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
>>>>> lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp
>>>>> lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.h
>>>>> 
>>>>> Removed: 
>>>>> 
>>>>> 
>>>>> 
>>>>> ################################################################################
>>>>> diff  --git 
>>>>> a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp 
>>>>> b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp
>>>>> index c59722b7b4f8..0c5796650d45 100644
>>>>> --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp
>>>>> +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.cpp
>>>>> @@ -15,16 +15,17 @@ using namespace lldb_private;
>>>>> 
>>>>> uint32_t ClangDeclVendor::FindDecls(ConstString name, bool append,
>>>>>                                 uint32_t max_matches,
>>>>> -                                    std::vector<CompilerDecl> &decls) {
>>>>> +                                    std::vector<clang::NamedDecl *> 
>>>>> &decls) {
>>>>> if (!append)
>>>>> decls.clear();
>>>>> 
>>>>> -  std::vector<clang::NamedDecl *> named_decls;
>>>>> -  uint32_t ret = FindDecls(name, /*append*/ false, max_matches, 
>>>>> named_decls);
>>>>> -  for (auto *named_decl : named_decls) {
>>>>> -    decls.push_back(CompilerDecl(
>>>>> -        ClangASTContext::GetASTContext(&named_decl->getASTContext()),
>>>>> -        named_decl));
>>>>> +  std::vector<CompilerDecl> compiler_decls;
>>>>> +  uint32_t ret = FindDecls(name, /*append*/ false, max_matches, 
>>>>> compiler_decls);
>>>>> +  for (CompilerDecl compiler_decl : compiler_decls) {
>>>>> +    clang::Decl *d =
>>>>> +        reinterpret_cast<clang::Decl *>(compiler_decl.GetOpaqueDecl());
>>>>> +    clang::NamedDecl *nd = llvm::cast<clang::NamedDecl>(d);
>>>>> +    decls.push_back(nd);
>>>>> }
>>>>> return ret;
>>>>> }
>>>>> 
>>>>> diff  --git 
>>>>> a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h 
>>>>> b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h
>>>>> index 85a10400a201..0c888de08841 100644
>>>>> --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h
>>>>> +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangDeclVendor.h
>>>>> @@ -21,12 +21,10 @@ class ClangDeclVendor : public DeclVendor {
>>>>> 
>>>>> virtual ~ClangDeclVendor() {}
>>>>> 
>>>>> -  uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches,
>>>>> -                     std::vector<CompilerDecl> &decls) override;
>>>>> +  using DeclVendor::FindDecls;
>>>>> 
>>>>> -  virtual uint32_t FindDecls(ConstString name, bool append,
>>>>> -                             uint32_t max_matches,
>>>>> -                             std::vector<clang::NamedDecl *> &decls) = 0;
>>>>> +  uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches,
>>>>> +                     std::vector<clang::NamedDecl *> &decls);
>>>>> 
>>>>> static bool classof(const DeclVendor *vendor) {
>>>>> return vendor->GetKind() >= eClangDeclVendor &&
>>>>> 
>>>>> diff  --git 
>>>>> a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp 
>>>>> b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
>>>>> index ff0905dda4ef..0696c669f2e2 100644
>>>>> --- 
>>>>> a/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
>>>>> +++ 
>>>>> b/lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp
>>>>> @@ -80,7 +80,7 @@ class ClangModulesDeclVendorImpl : public 
>>>>> ClangModulesDeclVendor {
>>>>>                             Stream &error_stream) override;
>>>>> 
>>>>> uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches,
>>>>> -                     std::vector<clang::NamedDecl *> &decls) override;
>>>>> +                     std::vector<CompilerDecl> &decls) override;
>>>>> 
>>>>> void ForEachMacro(const ModuleVector &modules,
>>>>>                 std::function<bool(const std::string &)> handler) 
>>>>> override;
>>>>> @@ -356,7 +356,7 @@ bool 
>>>>> ClangModulesDeclVendorImpl::AddModulesForCompileUnit(
>>>>> uint32_t
>>>>> ClangModulesDeclVendorImpl::FindDecls(ConstString name, bool append,
>>>>>                                   uint32_t max_matches,
>>>>> -                                      std::vector<clang::NamedDecl *> 
>>>>> &decls) {
>>>>> +                                      std::vector<CompilerDecl> &decls) {
>>>>> if (!m_enabled) {
>>>>> return 0;
>>>>> }
>>>>> @@ -382,7 +382,7 @@ ClangModulesDeclVendorImpl::FindDecls(ConstString 
>>>>> name, bool append,
>>>>> if (num_matches >= max_matches)
>>>>>   return num_matches;
>>>>> 
>>>>> -    decls.push_back(named_decl);
>>>>> +    decls.push_back(CompilerDecl(m_ast_context.get(), named_decl));
>>>>> ++num_matches;
>>>>> }
>>>>> 
>>>>> 
>>>>> diff  --git 
>>>>> a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp
>>>>>  
>>>>> b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp
>>>>> index 54f8397e1dad..29930c303b07 100644
>>>>> --- 
>>>>> a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp
>>>>> +++ 
>>>>> b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp
>>>>> @@ -537,10 +537,9 @@ bool 
>>>>> AppleObjCDeclVendor::FinishDecl(clang::ObjCInterfaceDecl *interface_decl) 
>>>>> {
>>>>> return true;
>>>>> }
>>>>> 
>>>>> -uint32_t
>>>>> -AppleObjCDeclVendor::FindDecls(ConstString name, bool append,
>>>>> -                               uint32_t max_matches,
>>>>> -                               std::vector<clang::NamedDecl *> &decls) {
>>>>> +uint32_t AppleObjCDeclVendor::FindDecls(ConstString name, bool append,
>>>>> +                                        uint32_t max_matches,
>>>>> +                                        std::vector<CompilerDecl> 
>>>>> &decls) {
>>>>> static unsigned int invocation_id = 0;
>>>>> unsigned int current_id = invocation_id++;
>>>>> 
>>>>> @@ -587,7 +586,7 @@ AppleObjCDeclVendor::FindDecls(ConstString name, bool 
>>>>> append,
>>>>>                current_id, result_iface_type.getAsString(), isa_value);
>>>>>     }
>>>>> 
>>>>> -        decls.push_back(result_iface_decl);
>>>>> +        decls.push_back(CompilerDecl(&m_ast_ctx, result_iface_decl));
>>>>>     ret++;
>>>>>     break;
>>>>>   } else {
>>>>> @@ -630,7 +629,7 @@ AppleObjCDeclVendor::FindDecls(ConstString name, bool 
>>>>> append,
>>>>>            new_iface_type.getAsString(), (uint64_t)isa);
>>>>> }
>>>>> 
>>>>> -    decls.push_back(iface_decl);
>>>>> +    decls.push_back(CompilerDecl(&m_ast_ctx, iface_decl));
>>>>> ret++;
>>>>> break;
>>>>> } while (false);
>>>>> 
>>>>> diff  --git 
>>>>> a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.h
>>>>>  
>>>>> b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.h
>>>>> index 311113a27735..f49ca3540c2c 100644
>>>>> --- 
>>>>> a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.h
>>>>> +++ 
>>>>> b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.h
>>>>> @@ -28,7 +28,7 @@ class AppleObjCDeclVendor : public ClangDeclVendor {
>>>>> }
>>>>> 
>>>>> uint32_t FindDecls(ConstString name, bool append, uint32_t max_matches,
>>>>> -                     std::vector<clang::NamedDecl *> &decls) override;
>>>>> +                     std::vector<CompilerDecl> &decls) override;
>>>>> 
>>>>> friend class AppleObjCExternalASTSource;
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> lldb-commits mailing list
>>>>> lldb-commits@lists.llvm.org
>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>>>> 
>>> 
>> 
>> _______________________________________________
>> lldb-commits mailing list
>> lldb-commits@lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> 

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

Reply via email to