vsapsai added a comment.

In D110280#3016911 <https://reviews.llvm.org/D110280#3016911>, @rjmccall wrote:

> Hmm.  It sounds like we misbehave if we're working with a non-canonical ivar. 
>  While it does seem preferable in general for lookups done after merging 
> modules to return the canonical ivar, I'm not sure we can rely on the AST 
> only having references to that ivar, since e.g. there might be references to 
> non-canonical ivars in static/inline functions in the modules that declare 
> them.

I've experimented with RecordDecl and always_inline functions. Just "inline" is 
inlined in LLVM but not in Clang, and in IR we have a function declaration and 
its call, so I don't know where to look for potential IRGen problems for 
MemberExpr. Anyway, with always_inline function we can have MemberExpr with 
MemberDecl from a "wrong" module. `FieldDecl` parent is from the "right" module 
because we've merged decl contexts, so `CodeGenTypes::getCGRecordLayout` 
receives correct RecordDecl. Later, when we want to get offset for `FieldDecl` 
from "wrong" module, we are saved by `getCanonicalDecl` (in getLLVMFieldNo 
<https://github.com/llvm/llvm-project/blob/1ecb1bc3e214c8da53a7fda14f428786441109d7/clang/lib/CodeGen/CGRecordLayout.h#L198>
 and getBitFieldInfo 
<https://github.com/llvm/llvm-project/blob/1ecb1bc3e214c8da53a7fda14f428786441109d7/clang/lib/CodeGen/CGRecordLayout.h#L217>,
 for instance) that returns FieldDecl from the "right" module.

I wasn't able to reproduce the exact scenario as in this PR because need to 
access an ivar from a method and I don't think you can inline that. As for 
test-functions.m, the test wasn't failing earlier because of a different name 
lookup code path and I've added it for completeness. I'll add always_inline 
function accessing ivars to the test, it doesn't hurt.

In D110280#3016911 <https://reviews.llvm.org/D110280#3016911>, @rjmccall wrote:

> So while this seems like a good change  in the abstract — although maybe we 
> should just be doing the lookup in the canonical definition in the first 
> place? — it also might not be enough, and the record-layout code might just 
> need to properly handle non-canonical ivars.

Unfortunately, we were doing lookup in the canonical definition but 
`ASTReader::FindExternalVisibleDeclsByName` found decls from both modules 
because we've merged decl contexts and lookup tables from both modules were 
available in `ASTReader.Lookups`. I was considering other options for calling 
`ObjCIvarDecl::getCanonicalDecl` and based on the stack trace

  ASTReader::FindExternalVisibleDeclsByName
  DeclContext::lookup
  ObjCContainerDecl::getIvarDecl
  ObjCInterfaceDecl::lookupInstanceVariable
  Sema::LookupIvarInObjCMethod

decided `ObjCContainerDecl::getIvarDecl` would be the best option as this is 
the earliest opportunity where we have to use a single ObjCIvarDecl instead of 
multiple options.

As for teaching record-layout code to properly handle non-canonical ivars, I 
don't know how involved it is going to be. In https://reviews.llvm.org/D106994 
Richard also suggested adding support for "compatible types". Cannot really 
tell the long-term impact of different approaches but based on my limited 
experience, I still [naively] believe that carefully™ using correct decls is a 
viable solution.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110280/new/

https://reviews.llvm.org/D110280

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

Reply via email to