rnk added inline comments.

================
Comment at: clang/include/clang/CodeGen/CGFunctionInfo.h:571
+  /// Whether this function should avoid inalloca arguments.
+  unsigned DontInAlloca: 1;
+
----------------
This is an amusing name, but we should try to find something better. :)

Can we build on this flag to support re-writing a varargs prototype to receive 
a va_list? If so, we should plan for that, and name this to cover both use 
cases. Elsewhere in clang we use the terminology "delegate call" see 
[EmitDelegateCallArg](https://github.com/llvm/llvm-project/blob/2e999b7dd1934a44d38c3a753460f1e5a217e9a5/clang/lib/CodeGen/CGVTables.cpp#L341).
 Could this be something like `ForDelegation` or `ForDelegateCall` or 
`IsDelegateCall` or `IsDelegateTarget` or something like that? Or Thunk? I 
think I like `ForDelegateCall`, but I'm not sure.

---

Does anyone know what a "chain call" is? It wasn't clear to me immediately.




================
Comment at: clang/lib/CodeGen/CGCall.cpp:190
 
-  return CGT.arrangeLLVMFunctionInfo(resultType, instanceMethod,
-                                     /*chainCall=*/false, prefix,
-                                     FTP->getExtInfo(), paramInfos,
-                                     Required);
+  FnInfoOptions opts(instanceMethod, /*IsChainCall*/false, 
/*DontInAlloca*/false);
+  return CGT.arrangeLLVMFunctionInfo(resultType, opts, prefix, 
FTP->getExtInfo(),
----------------
This still requires boolean parameters in order. I think LLVM tends to use flag 
enums for this, something like:
```
enum class FnInfoOptions {
  None = 0,
  IsInstanceMethod = 1 << 0,
  IsChainCall = 1 << 1,
  IsDelegateCall = 1 << 2,
};
```
Call sites look like:
```
arrangeLLVMFunctionInfo(RetTy, FnInfoOptions::None, None, FTNP->getExtInfo()...)
arrangeLLVMFunctionInfo(RetTy, FnInfoOptions::IsInstanceMethod, None, 
FTNP->getExtInfo()...)
```


================
Comment at: clang/lib/CodeGen/CGClass.cpp:3015
+static bool hasInAllocaArg(const TargetInfo &TI, CGCXXABI &ABI, const 
CXXMethodDecl *MD) {
+  return TI.getCXXABI().isMicrosoft() &&
+    llvm::any_of(MD->parameters(), [&](ParmVarDecl *P) {
----------------
I believe this is only necessary for x86 platforms, so we should check the 
architecture too to avoid the extra work on x64.


================
Comment at: clang/lib/CodeGen/CGClass.cpp:3097
+
+  std::string ImplName = (CallOpFn->getName() + ".impl").str();
+  llvm::Function *Fn = CallOpFn->getParent()->getFunction(ImplName);
----------------
We should use a name which demangles correctly, as we do for `__invoke`. This 
is a good first draft, though.


================
Comment at: clang/test/CodeGenCXX/inalloca-lambda.cpp:4
 class A {
   A(const A &);
 };
----------------
Just to make the IR slightly nicer, give this an `int` member.


================
Comment at: clang/test/CodeGenCXX/inalloca-lambda.cpp:8
 fptr_t fn1() { return [](A) {}; }
 
+
----------------
Please expand the testing further to include a case where the same lambda is 
called directly and goes through function pointer decay, something like this:
https://gcc.godbolt.org/z/q7x3ov5e1

This is to ensure that we don't end up double-emitting the implementation of 
the lambda.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D137872

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

Reply via email to