From 9763f8c821d7e6b851a114ea2ae810f07096ba64 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Thu, 25 Jun 2009 10:24:34 +0200 Subject: [PATCH] [multiple changes] 2009-06-25 Ed Falis * s-vxwext-rtp.ads: Add missing declaration 2009-06-25 Matthew Gingell * a-stwise.adb, a-stzsea.adb (Count, Index): Avoid local copy on stack, speed up unmapped case. 2009-06-25 Vincent Celier * prj-nmsc.adb (Check): Change error message for illegal abstract projects. 2009-06-25 Robert Dewar * gnat_ugn.texi: Add note on use of -gnatct for ASIS 2009-06-25 Emmanuel Briot * fmap.ads: Add documentation on mapping files From-SVN: r148930 --- gcc/ada/ChangeLog | 22 ++++ gcc/ada/a-stwise.adb | 272 ++++++++++++++++++++++++++++++--------- gcc/ada/a-stzsea.adb | 271 +++++++++++++++++++++++++++++--------- gcc/ada/fmap.ads | 11 +- gcc/ada/gnat_ugn.texi | 2 + gcc/ada/prj-nmsc.adb | 4 +- gcc/ada/s-vxwext-rtp.ads | 9 ++ 7 files changed, 465 insertions(+), 126 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 11542429f1a..c90ab103892 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,25 @@ +2009-06-25 Ed Falis + + * s-vxwext-rtp.ads: Add missing declaration + +2009-06-25 Matthew Gingell + + * a-stwise.adb, a-stzsea.adb (Count, Index): Avoid local copy on stack, + speed up unmapped case. + +2009-06-25 Vincent Celier + + * prj-nmsc.adb (Check): Change error message for illegal abstract + projects. + +2009-06-25 Robert Dewar + + * gnat_ugn.texi: Add note on use of -gnatct for ASIS + +2009-06-25 Emmanuel Briot + + * fmap.ads: Add documentation on mapping files + 2009-06-25 Robert Dewar * 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 d522315831c..3220c8f5530 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; + <> + 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; + + <> + 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; + + <> + 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; + + <> + 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; + + <> + 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); + <> + 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 3dc503943c1..d0a7f9d8f24 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; + + <> + 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; + + <> + 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; + + <> + 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; + + <> + 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; + + <> + 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); + <> + 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 dbf5800d404..77c1a0eac6b 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 7898e5e63cd..a2093c44f7c 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 d3e6be363a2..b8a2864fd20 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 9dc0fd40eea..22452a18e77 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; -- 2.30.2