diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2022-10-03 22:03:20 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2022-11-04 14:47:23 +0100 |
commit | ffcd1921e0aa37cf6b0fc6926bcadb0e988e4a2a (patch) | |
tree | b14d3031700a1aa1f944279f24354d970141b7e7 /gcc | |
parent | 0929de4fd65d9ab63445893d85ebdf21ddc70513 (diff) | |
download | gcc-ffcd1921e0aa37cf6b0fc6926bcadb0e988e4a2a.zip gcc-ffcd1921e0aa37cf6b0fc6926bcadb0e988e4a2a.tar.gz gcc-ffcd1921e0aa37cf6b0fc6926bcadb0e988e4a2a.tar.bz2 |
ada: Support lock-free protected objects with pragma Initialize_Scalars
In general, protected subprograms are only eligible for a lock-free
expansion if they do not reference global assignable objects.
However, it seems reasonable to ignore references to variables in
System.Scalar_Values, which are generated when pragma Initialize_Scalars
is active. Such references appear, for example, when protected
subprogram has formal parameters of mode out.
gcc/ada/
* sem_ch9.adb (Satisfies_Lock_Free_Requirements): Ignore
references to global variables inserted due to pragma
Initialize_Scalars.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/sem_ch9.adb | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch9.adb b/gcc/ada/sem_ch9.adb index 5dee216..e43e3ae 100644 --- a/gcc/ada/sem_ch9.adb +++ b/gcc/ada/sem_ch9.adb @@ -474,6 +474,12 @@ package body Sem_Ch9 is begin -- Prohibit references to non-constant entities -- outside the protected subprogram scope. + -- + -- References to variables in System.Scalar_Values + -- generated because of pragma Initialize_Scalars are + -- allowed, because once those variables are + -- initialized by the binder-generated code, they + -- behave like constants. if Is_Assignable (Id) and then not @@ -482,6 +488,9 @@ package body Sem_Ch9 is Scope_Within_Or_Same (Scope (Id), Protected_Body_Subprogram (Sub_Id)) + and then not + (Is_RTU (Scope (Id), System_Scalar_Values) + and then not Comes_From_Source (N)) then if Lock_Free_Given then Error_Msg_NE |