[PATCH] D77077: [clang] CodeGen: Make getOrEmitProtocol public for Swift
John McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 30 21:18:19 PDT 2020
rjmccall added inline comments.
================
Comment at: clang/include/clang/CodeGen/CodeGenABITypes.h:148
+ llvm::function_ref<llvm::Constant *(const ObjCProtocolDecl *)>
+ createProtocolReference);
} // end namespace CodeGen
----------------
aschwaighofer wrote:
> rjmccall wrote:
> > I would call this `emitObjCProtocolObject` or something, and maybe say in the comment:
> >
> > > Get a pointer to a protocol object for the given declaration, emitting it if it hasn't already been emitted in this translation unit. Note that the ABI for emitting a protocol reference in code (e.g. for a `@protocol` expression) in most runtimes is not as simple as just materializing a pointer to this object.
> >
> > Can you explain the need for the callback? Are you expecting to use this for Swift-declared protocols by synthesizing an ObjC protocol declaration for them? I can see why you'd need a callback in that case.
> > Can you explain the need for the callback? Are you expecting to use this for Swift-declared protocols by synthesizing an ObjC protocol declaration for them? I can see why you'd need a callback in that case.
>
> The objective C protocol references other protocols in its inherited list. Swift has an internal list that keeps track of those protocols references and makes sure to initialized them for the debugger and also makes sure that the underlying protocol structure is emitted. The call back is to keep this list in sync.
The problem is that this is really, really intertwined with the ABI logic. This callback basically has to know exactly how the caller is calling it and and what it's expected to build in response.
Swift code can use arbitrary inline Objective-C functions and therefore emit arbitrary Objective-C code. Is there an approach that handles that while also being less invasive for Clang IRGen? Can we, e.g., inspect the built llvm::Module to figure out retroactively what protocol refs we need to update dynamically instead of trying to track them during the build?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77077/new/
https://reviews.llvm.org/D77077
More information about the cfe-commits
mailing list