rsmith added inline comments.

================
Comment at: clang/include/clang/Basic/Thunk.h:157
+
+  /// Holds a pointer to the overridee(!) method this thunk is for,
+  /// if needed by the ABI to distinguish different thunks with equal
----------------
Isn't this the same as `BaseMethod.getDecl()`? (I'd expect "overridee" and 
"overridden" to be synonymous, contrasting with the "overrider" which would be 
the derived-class function.)


================
Comment at: clang/lib/AST/VTableBuilder.cpp:1636-1641
+    GlobalDecl BaseGD;
+    if (isa<CXXDestructorDecl>(MD))
+      BaseGD =
+          GlobalDecl(cast<CXXDestructorDecl>(MD), CXXDtorType::Dtor_Deleting);
+    else
+      BaseGD = MD;
----------------
This looks suspicious: we're going to add two vtable slots, one for the 
deleting destructor and one for the complete object destructor. It doesn't 
matter in practice because we never form a thunk for a destructor, but it would 
seem more correct to pass the `CXXMethodDecl*` into `AddMethod` and have it 
form the appropriate `GlobalDecl`(s) itself.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:451-452
-  StartThunk(Fn, GD, FnInfo, IsUnprototyped);
-  // Create a scope with an artificial location for the body of this function.
-  auto AL = ApplyDebugLocation::CreateArtificial(*this);
-
----------------
Is this done somewhere else now?


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:465-466
-  // Fix up the function type for an unprototyped musttail call.
-  if (IsUnprototyped)
-    Callee = llvm::ConstantExpr::getBitCast(Callee, Fn->getType());
 
----------------
This bitcast seems to have gone missing.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:485
   if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD))
-    MCtx.mangleCXXDtorThunk(DD, GD.getDtorType(), TI.This, Out);
+    MCtx.mangleCXXDtorThunk(DD, TI.BaseMethod.getDtorType(), TI.This, Out);
   else
----------------
When do we get here for a destructor? I can't see any evidence that this is 
reachable at all: in our testsuite there doesn't seem to be any mention of a 
destructor thunk mangling.

Generally, though, thunk mangling uses the mangled name of the target of the 
thunk, which should be `GD.getDtorType()` here. (This might matter if we 
somehow emitted a thunk from the complete destructor to the base subobject 
destructor via this function.)


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:495
   bool IsUnprototyped = !CGM.getTypes().isFuncTypeConvertible(
       MD->getType()->castAs<FunctionType>());
   if (!shouldEmitVTableThunk(CGM, MD, IsUnprototyped, ForVTable))
----------------
I think this should probably be checking the base method type, but the 
difference probably doesn't matter in practice.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:507-510
+  const CGFunctionInfo &BaseFnInfo =
       IsUnprototyped ? CGM.getTypes().arrangeUnprototypedMustTailThunk(MD)
                      : CGM.getTypes().arrangeGlobalDeclaration(GD);
+  llvm::FunctionType *BaseFnTy = CGM.getTypes().GetFunctionType(BaseFnInfo);
----------------
It's confusing to call these `Base*` when (in the vtable thunk case) they're 
information about the derived-class function. Maybe `Target*`?


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:508
+  const CGFunctionInfo &BaseFnInfo =
       IsUnprototyped ? CGM.getTypes().arrangeUnprototypedMustTailThunk(MD)
                      : CGM.getTypes().arrangeGlobalDeclaration(GD);
----------------
This doesn't look right: the target of the thunk shouldn't itself be treated as 
a `musttail` thunk. Presumably we should unconditionally use 
`arrangeGlobalDeclaration(GD)` for the target.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:524
                                      Name.str(), &CGM.getModule());
-    CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn);
+    CGM.SetLLVMFunctionAttributes(TI.BaseMethod, ThunkFnInfo, ThunkFn);
 
----------------
Hm, I think we probably want to use `MD` rather than `BaseMethod` here. Eg, if 
the base method is `[[noreturn]]` but the overrider is not, we want a 
non-`[[noreturn]]` thunk, and conversely if the overrider is `[[noreturn]]` the 
thunk should be regardless of whether the base method was.

Perhaps there are some attributes for which we want to look at the `BaseMethod` 
instead. If so, I suppose we'll need to pass both the caller-side declaration 
and the callee-side declaration to `ConstructAttributeList` (or maybe extend 
`CGFunctionInfo` to store both) and let it pick which one it wants to inspect 
for each attribute.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:546
 
-    setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD);
+    setThunkProperties(CGM, TI, ThunkFn, ForVTable, TI.BaseMethod);
     return ThunkFn;
----------------
This should be passing `GD` rather than `BaseMethod`.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:557
 
-  CGM.SetLLVMFunctionAttributesForDefinition(GD.getDecl(), ThunkFn);
+  CGM.SetLLVMFunctionAttributesForDefinition(TI.BaseMethod.getDecl(), ThunkFn);
 
----------------
This should be passing `GD` rather than `BaseMethod`.


================
Comment at: clang/lib/CodeGen/CGVTables.cpp:592
 
-  setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD);
+  setThunkProperties(CGM, TI, ThunkFn, ForVTable, TI.BaseMethod);
   return ThunkFn;
----------------
This should be passing `GD` rather than `BaseMethod`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D100388

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

Reply via email to