aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2009-06-25 10:24:34 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2009-06-25 10:24:34 +0200
commit9763f8c821d7e6b851a114ea2ae810f07096ba64 (patch)
treeb9f2a7f928ca8d203d1eec57c09c86e1c5970dd0
parent3cb711674443e827e2ebc61a131590214d05c1bc (diff)
downloadgcc-9763f8c821d7e6b851a114ea2ae810f07096ba64.zip
gcc-9763f8c821d7e6b851a114ea2ae810f07096ba64.tar.gz
gcc-9763f8c821d7e6b851a114ea2ae810f07096ba64.tar.bz2
[multiple changes]
2009-06-25 Ed Falis <falis@adacore.com> * s-vxwext-rtp.ads: Add missing declaration 2009-06-25 Matthew Gingell <gingell@adacore.com> * a-stwise.adb, a-stzsea.adb (Count, Index): Avoid local copy on stack, speed up unmapped case. 2009-06-25 Vincent Celier <celier@adacore.com> * prj-nmsc.adb (Check): Change error message for illegal abstract projects. 2009-06-25 Robert Dewar <dewar@adacore.com> * gnat_ugn.texi: Add note on use of -gnatct for ASIS 2009-06-25 Emmanuel Briot <briot@adacore.com> * fmap.ads: Add documentation on mapping files From-SVN: r148930
-rw-r--r--gcc/ada/ChangeLog22
-rw-r--r--gcc/ada/a-stwise.adb272
-rw-r--r--gcc/ada/a-stzsea.adb271
-rw-r--r--gcc/ada/fmap.ads11
-rw-r--r--gcc/ada/gnat_ugn.texi2
-rw-r--r--gcc/ada/prj-nmsc.adb4
-rw-r--r--gcc/ada/s-vxwext-rtp.ads9
7 files changed, 465 insertions, 126 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 1154242..c90ab10 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,25 @@
+2009-06-25 Ed Falis <falis@adacore.com>
+
+ * s-vxwext-rtp.ads: Add missing declaration
+
+2009-06-25 Matthew Gingell <gingell@adacore.com>
+
+ * a-stwise.adb, a-stzsea.adb (Count, Index): Avoid local copy on stack,
+ speed up unmapped case.
+
+2009-06-25 Vincent Celier <celier@adacore.com>
+
+ * prj-nmsc.adb (Check): Change error message for illegal abstract
+ projects.
+
+2009-06-25 Robert Dewar <dewar@adacore.com>
+
+ * gnat_ugn.texi: Add note on use of -gnatct for ASIS
+
+2009-06-25 Emmanuel Briot <briot@adacore.com>
+
+ * fmap.ads: Add documentation on mapping files
+
2009-06-25 Robert Dewar <dewar@adacore.com>
* exp_ch6.adb, g-socket.ads, g-socket.adb, sem_ch3.adb: Minor
diff --git a/gcc/ada/a-stwise.adb b/gcc/ada/a-stwise.adb
index d522315..3220c8f 100644
--- a/gcc/ada/a-stwise.adb
+++ b/gcc/ada/a-stwise.adb
@@ -30,6 +30,7 @@
------------------------------------------------------------------------------
with Ada.Strings.Wide_Maps; use Ada.Strings.Wide_Maps;
+with System; use System;
package body Ada.Strings.Wide_Search is
@@ -72,44 +73,57 @@ package body Ada.Strings.Wide_Search is
Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
return Natural
is
- N : Natural;
- J : Natural;
-
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ Num := 0;
+ Ind := Source'First;
+
+ -- Unmapped case
+
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+ else
+ Ind := Ind + 1;
+ end if;
+ end loop;
- if Mapping /= Wide_Maps.Identity then
- declare
- Mapped_Source : Wide_String (Source'Range);
+ -- Mapped case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ else
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
end loop;
- return Count (Mapped_Source, Pattern);
- end;
- end if;
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
- N := 0;
- J := Source'First;
+ <<Cont>>
+ null;
+ end loop;
+ end if;
- while J <= Source'Last - (Pattern'Length - 1) loop
- if Source (J .. J + (Pattern'Length - 1)) = Pattern then
- N := N + 1;
- J := J + Pattern'Length;
- else
- J := J + 1;
- end if;
- end loop;
+ -- Return result
- return N;
+ return Num;
end Count;
function Count
@@ -117,14 +131,43 @@ package body Ada.Strings.Wide_Search is
Pattern : Wide_String;
Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
is
- Mapped_Source : Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ Num := 0;
+ Ind := Source'First;
+ while Ind <= Source'Last - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping (Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
end loop;
- return Count (Mapped_Source, Pattern);
+ return Num;
end Count;
function Count
@@ -166,8 +209,8 @@ package body Ada.Strings.Wide_Search is
end if;
end loop;
- -- Here if J indexes 1st char of token, and all chars
- -- after J are in the token
+ -- Here if J indexes first char of token, and all chars after J
+ -- are in the token.
Last := Source'Last;
return;
@@ -191,41 +234,88 @@ package body Ada.Strings.Wide_Search is
Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
return Natural
is
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
+
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
- if Mapping /= Identity then
- declare
- Mapped_Source : Wide_String (Source'Range);
+ -- Unmapped forward case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ for J in 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind + 1;
+ end if;
end loop;
- return Index (Mapped_Source, Pattern, Going);
- end;
- end if;
+ -- Mapped forward case
- if Going = Forward then
- for J in Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ else
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
- else -- Going = Backward
- for J in reverse Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+ end if;
+
+ -- Backwards case
+
+ else
+ -- Unmapped backward case
+
+ Ind := Source'Last - PL1;
+
+ if Mapping'Address = Wide_Maps.Identity'Address then
+ for J in reverse 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind - 1;
+ end if;
+ end loop;
+
+ -- Mapped backward case
+
+ else
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
end if;
-- Fall through if no match found. Note that the loops are skipped
@@ -240,14 +330,68 @@ package body Ada.Strings.Wide_Search is
Going : Direction := Forward;
Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
is
- Mapped_Source : Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
- end loop;
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+
+ -- Backwards case
+
+ else
+ Ind := Source'Last - PL1;
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
- return Index (Mapped_Source, Pattern, Going);
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
+
+ -- Fall through if no match found. Note that the loops are skipped
+ -- completely in the case of the pattern being longer than the source.
+
+ return 0;
end Index;
function Index
@@ -257,6 +401,8 @@ package body Ada.Strings.Wide_Search is
Going : Direction := Forward) return Natural
is
begin
+ -- Forwards case
+
if Going = Forward then
for J in Source'Range loop
if Belongs (Source (J), Set, Test) then
@@ -264,7 +410,9 @@ package body Ada.Strings.Wide_Search is
end if;
end loop;
- else -- Going = Backward
+ -- Backwards case
+
+ else
for J in reverse Source'Range loop
if Belongs (Source (J), Set, Test) then
return J;
diff --git a/gcc/ada/a-stzsea.adb b/gcc/ada/a-stzsea.adb
index 3dc5039..d0a7f9d 100644
--- a/gcc/ada/a-stzsea.adb
+++ b/gcc/ada/a-stzsea.adb
@@ -30,6 +30,7 @@
------------------------------------------------------------------------------
with Ada.Strings.Wide_Wide_Maps; use Ada.Strings.Wide_Wide_Maps;
+with System; use System;
package body Ada.Strings.Wide_Wide_Search is
@@ -73,44 +74,58 @@ package body Ada.Strings.Wide_Wide_Search is
Wide_Wide_Maps.Identity)
return Natural
is
- N : Natural;
- J : Natural;
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ Num := 0;
+ Ind := Source'First;
- if Mapping /= Wide_Wide_Maps.Identity then
- declare
- Mapped_Source : Wide_Wide_String (Source'Range);
+ -- Unmapped case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+ else
+ Ind := Ind + 1;
+ end if;
+ end loop;
+
+ -- Mapped case
+
+ else
+ Ind := Source'First;
+ while Ind <= Source'Length - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
end loop;
- return Count (Mapped_Source, Pattern);
- end;
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
+ end loop;
end if;
- N := 0;
- J := Source'First;
+ -- Return result
- while J <= Source'Last - (Pattern'Length - 1) loop
- if Source (J .. J + (Pattern'Length - 1)) = Pattern then
- N := N + 1;
- J := J + Pattern'Length;
- else
- J := J + 1;
- end if;
- end loop;
-
- return N;
+ return Num;
end Count;
function Count
@@ -119,14 +134,43 @@ package body Ada.Strings.Wide_Wide_Search is
Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
return Natural
is
- Mapped_Source : Wide_Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Num : Natural;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ Num := 0;
+ Ind := Source'First;
+ while Ind <= Source'Last - PL1 loop
+ Cur := Ind;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping (Source (Cur)) then
+ Ind := Ind + 1;
+ goto Cont;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ Num := Num + 1;
+ Ind := Ind + Pattern'Length;
+
+ <<Cont>>
+ null;
end loop;
- return Count (Mapped_Source, Pattern);
+ return Num;
end Count;
function Count
@@ -168,8 +212,8 @@ package body Ada.Strings.Wide_Wide_Search is
end if;
end loop;
- -- Here if J indexes 1st char of token, and all chars
- -- after J are in the token
+ -- Here if J indexes first char of token, and all chars after J
+ -- are in the token.
Last := Source'Last;
return;
@@ -194,41 +238,88 @@ package body Ada.Strings.Wide_Wide_Search is
Wide_Wide_Maps.Identity)
return Natural
is
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
+
begin
if Pattern = "" then
raise Pattern_Error;
end if;
- -- Handle the case of non-identity mappings by creating a mapped
- -- string and making a recursive call using the identity mapping
- -- on this mapped string.
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
- if Mapping /= Identity then
- declare
- Mapped_Source : Wide_Wide_String (Source'Range);
+ -- Unmapped forward case
- begin
- for J in Source'Range loop
- Mapped_Source (J) := Value (Mapping, Source (J));
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ for J in 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind + 1;
+ end if;
end loop;
- return Index (Mapped_Source, Pattern, Going);
- end;
- end if;
+ -- Mapped forward case
- if Going = Forward then
- for J in Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ else
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
- else -- Going = Backward
- for J in reverse Source'First .. Source'Last - Pattern'Length + 1 loop
- if Pattern = Source (J .. J + Pattern'Length - 1) then
- return J;
- end if;
- end loop;
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+ end if;
+
+ -- Backwards case
+
+ else
+ -- Unmapped backward case
+
+ Ind := Source'Last - PL1;
+
+ if Mapping'Address = Wide_Wide_Maps.Identity'Address then
+ for J in reverse 1 .. Source'Length - PL1 loop
+ if Pattern = Source (Ind .. Ind + PL1) then
+ return Ind;
+ else
+ Ind := Ind - 1;
+ end if;
+ end loop;
+
+ -- Mapped backward case
+
+ else
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Value (Mapping, Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
end if;
-- Fall through if no match found. Note that the loops are skipped
@@ -244,14 +335,68 @@ package body Ada.Strings.Wide_Wide_Search is
Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
return Natural
is
- Mapped_Source : Wide_Wide_String (Source'Range);
+ PL1 : constant Integer := Pattern'Length - 1;
+ Ind : Natural;
+ Cur : Natural;
begin
- for J in Source'Range loop
- Mapped_Source (J) := Mapping (Source (J));
- end loop;
+ if Pattern = "" then
+ raise Pattern_Error;
+ end if;
+
+ -- Check for null pointer in case checks are off
+
+ if Mapping = null then
+ raise Constraint_Error;
+ end if;
+
+ -- Forwards case
+
+ if Going = Forward then
+ Ind := Source'First;
+ for J in 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont1;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
+
+ <<Cont1>>
+ Ind := Ind + 1;
+ end loop;
+
+ -- Backwards case
+
+ else
+ Ind := Source'Last - PL1;
+ for J in reverse 1 .. Source'Length - PL1 loop
+ Cur := Ind;
+
+ for K in Pattern'Range loop
+ if Pattern (K) /= Mapping.all (Source (Cur)) then
+ goto Cont2;
+ else
+ Cur := Cur + 1;
+ end if;
+ end loop;
+
+ return Ind;
- return Index (Mapped_Source, Pattern, Going);
+ <<Cont2>>
+ Ind := Ind - 1;
+ end loop;
+ end if;
+
+ -- Fall through if no match found. Note that the loops are skipped
+ -- completely in the case of the pattern being longer than the source.
+
+ return 0;
end Index;
function Index
@@ -261,6 +406,8 @@ package body Ada.Strings.Wide_Wide_Search is
Going : Direction := Forward) return Natural
is
begin
+ -- Forwards case
+
if Going = Forward then
for J in Source'Range loop
if Belongs (Source (J), Set, Test) then
@@ -268,7 +415,9 @@ package body Ada.Strings.Wide_Wide_Search is
end if;
end loop;
- else -- Going = Backward
+ -- Backwards case
+
+ else
for J in reverse Source'Range loop
if Belongs (Source (J), Set, Test) then
return J;
diff --git a/gcc/ada/fmap.ads b/gcc/ada/fmap.ads
index dbf5800..77c1a0e 100644
--- a/gcc/ada/fmap.ads
+++ b/gcc/ada/fmap.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2007, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -25,6 +25,15 @@
-- This package keeps two mappings: from unit names to file names,
-- and from file names to path names.
+--
+-- This mapping is used to communicate between the builder (gnatmake or
+-- gprbuild) and the compiler. The format of this mapping file is the
+-- following:
+-- For each source file, there are three lines in the mapping file:
+-- Unit name with %b or %s added depending on whether it is a body or a spec
+-- File name
+-- Path name (set to '/' if the file should be ignored in fact, ie for
+-- a Locally_Removed_File in a project)
with Namet; use Namet;
diff --git a/gcc/ada/gnat_ugn.texi b/gcc/ada/gnat_ugn.texi
index 7898e5e..a2093c4 100644
--- a/gcc/ada/gnat_ugn.texi
+++ b/gcc/ada/gnat_ugn.texi
@@ -6996,6 +6996,8 @@ This not normally required, but is used by separate analysis tools.
Typically
these tools do the necessary compilations automatically, so you should
not have to specify this switch in normal operation.
+Note that the combination of switches @option{-gnatct} generates a tree
+in the form required by ASIS applications.
@item -gnatu
@cindex @option{-gnatu} (@command{gcc})
diff --git a/gcc/ada/prj-nmsc.adb b/gcc/ada/prj-nmsc.adb
index d3e6be3..b8a2864 100644
--- a/gcc/ada/prj-nmsc.adb
+++ b/gcc/ada/prj-nmsc.adb
@@ -881,8 +881,8 @@ package body Prj.Nmsc is
else
Error_Msg
(Project, In_Tree,
- "an abstract project needs to have no language, " &
- "no sources or no source directories",
+ "at least one of Source_Files, Source_Dirs or Languages " &
+ "must be declared empty for an abstract project",
Project.Location);
end if;
end;
diff --git a/gcc/ada/s-vxwext-rtp.ads b/gcc/ada/s-vxwext-rtp.ads
index 9dc0fd4..22452a1 100644
--- a/gcc/ada/s-vxwext-rtp.ads
+++ b/gcc/ada/s-vxwext-rtp.ads
@@ -81,4 +81,13 @@ package System.VxWorks.Ext is
function Set_Time_Slice (ticks : int) return int;
pragma Inline (Set_Time_Slice);
+ --------------------------------
+ -- Processor Affinity for SMP --
+ --------------------------------
+
+ function taskCpuAffinitySet (tid : t_id; CPU : int) return int;
+ pragma Convention (C, taskCpuAffinitySet);
+ -- For SMP run-times set the CPU affinity.
+ -- For uniprocessor systems return ERROR status.
+
end System.VxWorks.Ext;