r350920 - [Sema] Make canPassInRegisters return true if the CXXRecordDecl passed

Akira Hatanaka via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 15 22:57:07 PST 2019


Yes, the behavior of the compiler doesn’t match what’s explained in the documentation anymore.

Please take a look at the attached patch, which updates the documentation.



CC’ing a couple more people who commented on the original patch.

> On Jan 10, 2019, at 11:30 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> 
> This is an ABI break (theoretically), but due to its nature I'm not too concerned.
> 
> Please update the documentation for the attribute to describe these new semantics, though: the documentation currently says that we're just treating certain special members as if they were trivial when determining whether we can pass in registers, and that's not true any more, because the ABI says that classes with only deleted copy and move ctors is never passed in registers regardless of triviality.
> 
> On Thu, 10 Jan 2019, 23:10 Akira Hatanaka via cfe-commits <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org> wrote:
> Author: ahatanak
> Date: Thu Jan 10 23:06:38 2019
> New Revision: 350920
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=350920&view=rev <http://llvm.org/viewvc/llvm-project?rev=350920&view=rev>
> Log:
> [Sema] Make canPassInRegisters return true if the CXXRecordDecl passed
> to it is a trivial_abi class.
> 
> A class that has all of its copy and move constructors deleted can still
> be passed or returned in registers if the class is annotated with
> trivial_abi.
> 
> This fixes PR39683.
> 
> Modified:
>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>     cfe/trunk/test/CodeGenCXX/trivial_abi.cpp
> 
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=350920&r1=350919&r2=350920&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=350920&r1=350919&r2=350920&view=diff>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Jan 10 23:06:38 2019
> @@ -5886,6 +5886,9 @@ static bool canPassInRegisters(Sema &S,
>    if (D->isDependentType() || D->isInvalidDecl())
>      return false;
> 
> +  if (D->hasAttr<TrivialABIAttr>())
> +    return true;
> +
>    // Clang <= 4 used the pre-C++11 rule, which ignores move operations.
>    // The PS4 platform ABI follows the behavior of Clang 3.2.
>    if (CCK == TargetInfo::CCK_ClangABI4OrPS4)
> 
> Modified: cfe/trunk/test/CodeGenCXX/trivial_abi.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/trivial_abi.cpp?rev=350920&r1=350919&r2=350920&view=diff <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/trivial_abi.cpp?rev=350920&r1=350919&r2=350920&view=diff>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/trivial_abi.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/trivial_abi.cpp Thu Jan 10 23:06:38 2019
> @@ -1,5 +1,5 @@
> -// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++11 -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s
> -// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++11 -fcxx-exceptions -fexceptions -fclang-abi-compat=4.0 -emit-llvm -o - %s | FileCheck %s
> +// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++17 -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s
> +// RUN: %clang_cc1 -triple arm64-apple-ios11 -std=c++17 -fcxx-exceptions -fexceptions -fclang-abi-compat=4.0 -emit-llvm -o - %s | FileCheck %s
> 
>  // CHECK: %[[STRUCT_SMALL:.*]] = type { i32* }
>  // CHECK: %[[STRUCT_LARGE:.*]] = type { i32*, [128 x i32] }
> @@ -43,6 +43,13 @@ struct HasNonTrivial {
>    NonTrivial m;
>  };
> 
> +struct __attribute__((trivial_abi)) CopyMoveDeleted {
> +  CopyMoveDeleted(int);
> +  CopyMoveDeleted(const CopyMoveDeleted &) = delete;
> +  CopyMoveDeleted(CopyMoveDeleted &&) = delete;
> +  int a;
> +};
> +
>  // CHECK: define void @_Z14testParamSmall5Small(i64 %[[A_COERCE:.*]])
>  // CHECK: %[[A:.*]] = alloca %[[STRUCT_SMALL]], align 8
>  // CHECK: %[[COERCE_DIVE:.*]] = getelementptr inbounds %[[STRUCT_SMALL]], %[[STRUCT_SMALL]]* %[[A]], i32 0, i32 0
> @@ -237,3 +244,11 @@ void calleeExceptionLarge(Large, Large);
>  void testExceptionLarge() {
>    calleeExceptionLarge(Large(), Large());
>  }
> +
> +// A class with deleted copy and move constructors can still be passed or
> +// returned in registers if the class is annotated with trivial_abi.
> +
> +// CHECK: define i64 @_Z19testCopyMoveDeletedi(i32 %
> +CopyMoveDeleted testCopyMoveDeleted(int a) {
> +  return a;
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190115/2b6e197f/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: trivial-abi-docs.patch
Type: application/octet-stream
Size: 2462 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190115/2b6e197f/attachment-0001.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190115/2b6e197f/attachment-0003.html>


More information about the cfe-commits mailing list