summaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-26 13:08:59 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-26 13:08:59 +0000
commit672ca3bb6bfa77428fc02998d6424f82b0e4abf5 (patch)
tree4a4d16379b668c85c0e7cad179766e7dc7945011 /gcc/ada
parent386263854394566b96014cfe61518fba6a6917e4 (diff)
downloadgcc-672ca3bb6bfa77428fc02998d6424f82b0e4abf5.tar.gz
2010-10-26 Vincent Celier <celier@adacore.com>
* opt.ads (Old_Checksums, Old_Old_Checksums): New Boolean flags, defaulted to False. * prj-nmsc.adb (Process_Project_Level_Array_Attributes): When processing attribute Toolchain_Version ("Ada"), set Opt.Old_Checksums and Opt.Old_Old_Checksums depending on the GNAT version. * scng.adb (Accumulate_Token_Checksum_Old): New procedure. (Accumulate_Token_Checksum_Old_Old): New procedure. (Scan): For keywords, when Opt.Old_Checksums is True, call one of the alternative procedures Accumulate_Token_Checksum_Old or Accumulate_Token_Checksum_Old_Old, instead of Accumulate_Token_Checksum. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165959 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog13
-rw-r--r--gcc/ada/opt.ads7
-rw-r--r--gcc/ada/prj-nmsc.adb47
-rw-r--r--gcc/ada/scng.adb152
4 files changed, 217 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 8ff1ac6a8c5..47a6abc3709 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,16 @@
+2010-10-26 Vincent Celier <celier@adacore.com>
+
+ * opt.ads (Old_Checksums, Old_Old_Checksums): New Boolean flags,
+ defaulted to False.
+ * prj-nmsc.adb (Process_Project_Level_Array_Attributes): When
+ processing attribute Toolchain_Version ("Ada"), set Opt.Old_Checksums
+ and Opt.Old_Old_Checksums depending on the GNAT version.
+ * scng.adb (Accumulate_Token_Checksum_Old): New procedure.
+ (Accumulate_Token_Checksum_Old_Old): New procedure.
+ (Scan): For keywords, when Opt.Old_Checksums is True, call one of the
+ alternative procedures Accumulate_Token_Checksum_Old or
+ Accumulate_Token_Checksum_Old_Old, instead of Accumulate_Token_Checksum.
+
2010-10-26 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* gcc-interface/utils2.c (build_compound_expr): New function.
diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads
index b31a66e9e69..9c577c73032 100644
--- a/gcc/ada/opt.ads
+++ b/gcc/ada/opt.ads
@@ -933,6 +933,13 @@ package Opt is
-- GNATMAKE
-- Set to True when an object directory is specified with option -D
+ Old_Checksums : Boolean := False;
+ Old_Old_Checksums : Boolean := False;
+ -- GPRBUILD
+ -- Set to True when the old ways of computing checksums needs to be used.
+ -- For reserved words, the old ways were to use the token value, while the
+ -- new way is to use Tok_Identifier for reserved word too.
+
One_Compilation_Per_Obj_Dir : Boolean := False;
-- GNATMAKE, GPRBUILD
-- Set to True with switch --single-compile-per-obj-dir. When True, there
diff --git a/gcc/ada/prj-nmsc.adb b/gcc/ada/prj-nmsc.adb
index 246d28a5a7f..e0df1072f92 100644
--- a/gcc/ada/prj-nmsc.adb
+++ b/gcc/ada/prj-nmsc.adb
@@ -2399,6 +2399,53 @@ package body Prj.Nmsc is
Lang_Index.Config.Toolchain_Version :=
Element.Value.Value;
+ -- We need a complete comment section discussing the
+ -- need for three versions of the checksum algorithm
+ -- and what is going on here??? Also Old and Old_Old
+ -- are rather poor names I would say. How about
+
+ -- Opt.Checksum_503
+ -- Opt.Checksum_63
+
+ -- If the Ada compiler is version 6.3 or before, then
+ -- checksums need to be computed using the old way.
+
+ -- Also, how about an abstraction for checking
+ -- version numbers, something like ???
+
+ -- if Version_Is_Before (5, 3) ....
+
+ if Lang_Index.Name = Name_Ada then
+ declare
+ Vers : constant String :=
+ Get_Name_String (Element.Value.Value);
+ pragma Assert (Vers'First = 1);
+
+ begin
+ if Vers'Length >= 8
+ and then Vers (1 .. 5) = "GNAT "
+ and then Vers (7) = '.'
+ and then
+ (Vers (6) < '6'
+ or else
+ (Vers (6) = '6' and then Vers (8) < '4'))
+ then
+ Opt.Old_Checksums := True;
+
+ -- If the Ada compiler is version 5.03 or
+ -- before, then checksums need to be computed
+ -- using the other old way.
+
+ if Vers (6) < '5'
+ or else (Vers (6) = '5'
+ and then Vers (Vers'Last) < '4')
+ then
+ Opt.Old_Old_Checksums := True;
+ end if;
+ end if;
+ end;
+ end if;
+
when Name_Runtime_Library_Dir =>
-- Attribute Runtime_Library_Dir (<language>)
diff --git a/gcc/ada/scng.adb b/gcc/ada/scng.adb
index b74bb1c2cae..1e1be01dd15 100644
--- a/gcc/ada/scng.adb
+++ b/gcc/ada/scng.adb
@@ -64,6 +64,21 @@ package body Scng is
procedure Accumulate_Token_Checksum;
pragma Inline (Accumulate_Token_Checksum);
+ -- Called after each numeric literal and identifier/keyword. For keywords,
+ -- the token used is Tok_Identifier. This allows to detect additional
+ -- spaces added in sources when using the builder switch -m.
+
+ procedure Accumulate_Token_Checksum_Old;
+ -- Used in place of Accumulate_Token_Checksum for previous releases, when
+ -- Tok_Some was not included in Token_Type and the actual Token_Type was
+ -- used for keywords. This procedure is never used in the compiler or
+ -- gnatmake.
+
+ procedure Accumulate_Token_Checksum_Old_Old;
+ -- Used in place of Accumulate_Token_Checksum for previous releases, when
+ -- Tok_Interface, Tok_Some, Tok_Synchronized and Tok_Overriding were not
+ -- included in Token_Type and the actual Token_Type was used for keywords.
+ -- This procedure is never used in the compiler or gnatmake.
procedure Accumulate_Checksum (C : Character);
pragma Inline (Accumulate_Checksum);
@@ -120,6 +135,127 @@ package body Scng is
Character'Val (Token_Type'Pos (Token)));
end Accumulate_Token_Checksum;
+ -----------------------------------
+ -- Accumulate_Token_Checksum_Old --
+ -----------------------------------
+
+ procedure Accumulate_Token_Checksum_Old is
+ begin
+ -- Individual values of Token_Type are used, instead of subranges, so
+ -- that additions or suppressions of enumerated values in type
+ -- Token_Type are detected by the compiler.
+
+ case Token is
+ when Tok_Integer_Literal | Tok_Real_Literal | Tok_String_Literal |
+ Tok_Char_Literal | Tok_Operator_Symbol | Tok_Identifier |
+ Tok_Double_Asterisk | Tok_Ampersand | Tok_Minus | Tok_Plus |
+ Tok_Asterisk | Tok_Mod | Tok_Rem | Tok_Slash | Tok_New |
+ Tok_Abs | Tok_Others | Tok_Null | Tok_Dot | Tok_Apostrophe |
+ Tok_Left_Paren | Tok_Delta | Tok_Digits | Tok_Range |
+ Tok_Right_Paren | Tok_Comma | Tok_And | Tok_Or | Tok_Xor |
+ Tok_Less | Tok_Equal | Tok_Greater | Tok_Not_Equal |
+ Tok_Greater_Equal | Tok_Less_Equal | Tok_In | Tok_Not |
+ Tok_Box | Tok_Colon_Equal | Tok_Colon | Tok_Greater_Greater |
+ Tok_Abstract | Tok_Access | Tok_Aliased | Tok_All | Tok_Array |
+ Tok_At | Tok_Body | Tok_Constant | Tok_Do | Tok_Is |
+ Tok_Interface | Tok_Limited | Tok_Of | Tok_Out | Tok_Record |
+ Tok_Renames | Tok_Reverse =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token)));
+
+ when Tok_Some =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Tok_Identifier)));
+
+ when Tok_Tagged | Tok_Then | Tok_Less_Less | Tok_Abort | Tok_Accept |
+ Tok_Case | Tok_Delay | Tok_Else | Tok_Elsif | Tok_End |
+ Tok_Exception | Tok_Exit | Tok_Goto | Tok_If | Tok_Pragma |
+ Tok_Raise | Tok_Requeue | Tok_Return | Tok_Select |
+ Tok_Terminate | Tok_Until | Tok_When | Tok_Begin | Tok_Declare |
+ Tok_For | Tok_Loop | Tok_While | Tok_Entry | Tok_Protected |
+ Tok_Task | Tok_Type | Tok_Subtype | Tok_Overriding |
+ Tok_Synchronized | Tok_Use | Tok_Function | Tok_Generic |
+ Tok_Package | Tok_Procedure | Tok_Private | Tok_With |
+ Tok_Separate | Tok_EOF | Tok_Semicolon | Tok_Arrow |
+ Tok_Vertical_Bar | Tok_Dot_Dot | Tok_Project | Tok_Extends |
+ Tok_External | Tok_External_As_List | Tok_Comment |
+ Tok_End_Of_Line | Tok_Special | No_Token =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token_Type'Pred (Token))));
+ end case;
+ end Accumulate_Token_Checksum_Old;
+
+ ---------------------------------------
+ -- Accumulate_Token_Checksum_Old_Old --
+ ---------------------------------------
+
+ procedure Accumulate_Token_Checksum_Old_Old is
+ begin
+ -- Individual values of Token_Type are used, instead of subranges, so
+ -- that additions or suppressions of enumerated values in type
+ -- Token_Type are detected by the compiler.
+
+ case Token is
+ when Tok_Integer_Literal | Tok_Real_Literal | Tok_String_Literal |
+ Tok_Char_Literal | Tok_Operator_Symbol | Tok_Identifier |
+ Tok_Double_Asterisk | Tok_Ampersand | Tok_Minus | Tok_Plus |
+ Tok_Asterisk | Tok_Mod | Tok_Rem | Tok_Slash | Tok_New |
+ Tok_Abs | Tok_Others | Tok_Null | Tok_Dot | Tok_Apostrophe |
+ Tok_Left_Paren | Tok_Delta | Tok_Digits | Tok_Range |
+ Tok_Right_Paren | Tok_Comma | Tok_And | Tok_Or | Tok_Xor |
+ Tok_Less | Tok_Equal | Tok_Greater | Tok_Not_Equal |
+ Tok_Greater_Equal | Tok_Less_Equal | Tok_In | Tok_Not |
+ Tok_Box | Tok_Colon_Equal | Tok_Colon | Tok_Greater_Greater |
+ Tok_Abstract | Tok_Access | Tok_Aliased | Tok_All | Tok_Array |
+ Tok_At | Tok_Body | Tok_Constant | Tok_Do | Tok_Is =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token)));
+
+ when Tok_Interface | Tok_Some | Tok_Overriding | Tok_Synchronized =>
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Tok_Identifier)));
+
+ when Tok_Limited | Tok_Of | Tok_Out | Tok_Record |
+ Tok_Renames | Tok_Reverse =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token) - 1));
+
+ when Tok_Tagged | Tok_Then | Tok_Less_Less | Tok_Abort | Tok_Accept |
+ Tok_Case | Tok_Delay | Tok_Else | Tok_Elsif | Tok_End |
+ Tok_Exception | Tok_Exit | Tok_Goto | Tok_If | Tok_Pragma |
+ Tok_Raise | Tok_Requeue | Tok_Return | Tok_Select |
+ Tok_Terminate | Tok_Until | Tok_When | Tok_Begin | Tok_Declare |
+ Tok_For | Tok_Loop | Tok_While | Tok_Entry | Tok_Protected |
+ Tok_Task | Tok_Type | Tok_Subtype =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token) - 2));
+
+ when Tok_Use | Tok_Function | Tok_Generic |
+ Tok_Package | Tok_Procedure | Tok_Private | Tok_With |
+ Tok_Separate | Tok_EOF | Tok_Semicolon | Tok_Arrow |
+ Tok_Vertical_Bar | Tok_Dot_Dot | Tok_Project | Tok_Extends |
+ Tok_External | Tok_External_As_List | Tok_Comment |
+ Tok_End_Of_Line | Tok_Special | No_Token =>
+
+ System.CRC32.Update
+ (System.CRC32.CRC32 (Checksum),
+ Character'Val (Token_Type'Pos (Token) - 4));
+ end case;
+ end Accumulate_Token_Checksum_Old_Old;
+
----------------------------
-- Determine_Token_Casing --
----------------------------
@@ -2413,12 +2549,23 @@ package body Scng is
-- checksum is independent of the Ada version.
Token := Tok_Identifier;
- Accumulate_Token_Checksum;
-- Here is where we check if it was a keyword
if Is_Keyword_Name (Token_Name) then
- Token := Token_Type'Val (Get_Name_Table_Byte (Token_Name));
+ if Opt.Old_Checksums then
+ Token := Token_Type'Val (Get_Name_Table_Byte (Token_Name));
+
+ if Opt.Old_Old_Checksums then
+ Accumulate_Token_Checksum_Old_Old;
+ else
+ Accumulate_Token_Checksum_Old;
+ end if;
+
+ else
+ Accumulate_Token_Checksum;
+ Token := Token_Type'Val (Get_Name_Table_Byte (Token_Name));
+ end if;
-- Keyword style checks
@@ -2475,6 +2622,7 @@ package body Scng is
-- It is an identifier after all
else
+ Accumulate_Token_Checksum;
Post_Scan;
return;
end if;