[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