[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 25 Jun 2009 08:24:34 +0000 (10:24 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 25 Jun 2009 08:24:34 +0000 (10:24 +0200)
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

gcc/ada/ChangeLog
gcc/ada/a-stwise.adb
gcc/ada/a-stzsea.adb
gcc/ada/fmap.ads
gcc/ada/gnat_ugn.texi
gcc/ada/prj-nmsc.adb
gcc/ada/s-vxwext-rtp.ads

index 11542429f1a4f3458086a31ccbcca3740ba1821c..c90ab103892162fe5d7feaffe538f6a6d1c82294 100644 (file)
@@ -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
index d522315831c9bbd698d13008fe85f9c3c046e186..3220c8f5530eb54110322349d716900e4603487b 100644 (file)
@@ -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;
index 3dc503943c11c770776d7e01f4be7ecdb31486ca..d0a7f9d8f2450bde17ba254a3800d9612f9ef9c3 100644 (file)
@@ -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;
index dbf5800d404a2c0f7eabaf97b462cae654d1bd74..77c1a0eac6b3d24a4923033fb075c56d1e848640 100644 (file)
@@ -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- --
 
 --  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;
 
index 7898e5e63cd839a692acfdd61cb3aa06ed243bbf..a2093c44f7cc940344033f785b9683555c3eb595 100644 (file)
@@ -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})
index d3e6be363a2fd9c6c967be3cd597c8ea343ff0a7..b8a2864fd2026cfe42548f974030b08ade511aef 100644 (file)
@@ -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;
index 9dc0fd40eea013c168f74492a44b052500c2ef17..22452a18e777005737be1808ac26f0688ed5d06c 100644 (file)
@@ -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;