aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2022-10-03 22:03:20 +0200
committerMarc Poulhiès <poulhies@adacore.com>2022-11-04 14:47:23 +0100
commitffcd1921e0aa37cf6b0fc6926bcadb0e988e4a2a (patch)
treeb14d3031700a1aa1f944279f24354d970141b7e7 /gcc
parent0929de4fd65d9ab63445893d85ebdf21ddc70513 (diff)
downloadgcc-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.adb9
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