[PATCH] D35259: Complex Long Double classification In RegCall calling convention

Reid Kleckner via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 19 11:49:50 PDT 2017

rnk added inline comments.

Comment at: lib/CodeGen/TargetInfo.cpp:3516
+  // calling convention is used.
   if (IsRegCall && FI.getReturnType()->getTypePtr()->isRecordType() &&
       !FI.getReturnType()->getTypePtr()->isUnionType()) {
This is incorrect. We should consult the CXXABI first, and then only do these regcall-specific things if it returns false. Consider adding this test case to find the bug:
struct NonTrivial {
  int x, y;
NonTrivial __regcall f() { return NonTrivial(); }

This should not return in registers, but it does today.

Comment at: lib/CodeGen/TargetInfo.cpp:3526
+  } else if (IsRegCall && FI.getReturnType()->getAs<ComplexType>()) {
+    const ComplexType *CT = FI.getReturnType()->getAs<ComplexType>();
This isn't necessarily a bug, but please always do C++ ABI classifications first so it's easy to spot the bug above.


More information about the cfe-commits mailing list