tra added inline comments.

================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:1099-1108
+    auto *FD = const_cast<NamedDecl *>((ND));
+    if (auto *TD = cast<FunctionDecl>(FD)->getPrimaryTemplate())
+      FD = TD->getTemplatedDecl();
+    auto OldDeclName = FD->getDeclName();
+    auto NewNameStr = std::string("__device_stub__") + 
OldDeclName.getAsString();
+    auto *NewId = &Context.Idents.get(NewNameStr);
+    auto NewDeclName = DeclarationName(NewId);
----------------
yaxunl wrote:
> tra wrote:
> > yaxunl wrote:
> > > tra wrote:
> > > > On one hand I like this patch variant much better than the one that 
> > > > changed the mangling itself.
> > > > On the other hand this code appears to reply on implementation details. 
> > > > I.e. we're setting new name on `FD` which may or may not be the same as 
> > > > `ND`, but we're always passing `ND` to `getMangledNameImpl()`. 
> > > > 
> > > > Perhaps we could implement name-tweaking as another `MultiVersionKind` 
> > > > which we already plumb into getMangledNameImpl() and which allows 
> > > > changing the name for target attributes & features.
> > > > 
> > > > 
> > > The mangled name of an instantiated template function does not depends on 
> > > its own name, but on the template. If we do not want to depend on this 
> > > implementation detail, it seems I have to clone the template and 
> > > instantiate from the clone.
> > > 
> > > MultiVersion does not help us here since it only appends .postfix to 
> > > mangled name. The obstacle we are facing is how to change the unmangled 
> > > name.
> > > The mangled name of an instantiated template function does not depends on 
> > > its own name, but on the template. If we do not want to depend on this 
> > > implementation detail, it seems I have to clone the template and 
> > > instantiate from the clone.
> > 
> > That would be putting more effort into working around the fact that 
> > `getMangledNameImpl()` doesa not provide a good API to change the name the 
> > way you need to. *That's* what needs to be addressed, IMO.
> > 
> > >MultiVersion does not help us here since it only appends .postfix to 
> > >mangled name. The obstacle we are facing is how to change the unmangled 
> > >name.
> > 
> > *Some* existing implementations append to the mangled name, but we can do 
> > other manipulations there, too. The string with the mangled name originates 
> > in `getMangledNameImpl` and we could do more than just append to it. We do 
> > not have to use the `MultiVersion` for that, either. E.g. we prepend 
> > `__regcall3__` to the names of functions with `CC_X86RegCall` calling 
> > convention. We could do something similar for the kernel stub, I wonder if 
> > we could just generate a unique name and be done with that?
> > 
> > Hmm. Unique name probably would not do if, let's say, a kernel is defined 
> > in one TU, but we need to call it from another TU. So, whichever way we 
> > change the name of the stub, it will need to be the same everywhere. 
> > You may want to add a test verifying that launching of declaration-only 
> > kernels uses the right name.
> > 
> > Consistency of name mangling means that we do need to include regular 
> > C++-mangled information. Which means we need to do the name tweaking deeper 
> > down. How about using calling conventions? It's been suggested in the past 
> > that a lot of shenanigans around kernel launches could/should be done as a 
> > different calling convention. One of the things affected by the calling 
> > convention is mangling and we can add prefix there: 
> > https://github.com/llvm/llvm-project/blob/master/clang/lib/AST/Mangle.cpp#L164
> > 
> > We could tag host-side kernel with 'kernel call' calling convention on the 
> > host side and then plumb prefixing to be done similar to `__regcall3__`.
> > 
> > If that works that may be a useful improvement overall. For instance, we 
> > may no longer need to stash a `it's a kernel` flag among attributes and it 
> > would probably be useful for other things (e.g enforcing address space 
> > requirements for kernel pointer arguments).
> > 
> will add a test for decl only kernel. At least for the current implementation 
> I see it works. A decl of stub function with expected name is emitted and can 
> be called.
> 
> About calling conv. I've tried implementing `__global__` as a calling conv 
> before. The issue is that it is part of type system and clang enforces type 
> checking for that. e.g. you cannot assign it to an ordinary function pointer 
> unless that function pointer is also declared with the same calling 
> convention. This will cause lots of type mismatching issues. In CUDA 
> language, `__global__` is not part of type system since it is just an 
> attribute.
> 
> We could introduce a calling conv for stub, but probably we can only use use 
> it when we mangle the stub function.
> 
> 
OK. I'm fresh out of ideas.

We should add some sort of assert to make sure that the mangled name does have 
the prefix we intended to add. Also a TODO to figure out a better way to add a 
name prefix before mangling. 

If anyone else has other suggestions, please chime in.



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

https://reviews.llvm.org/D68578



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

Reply via email to