From 64989f18c04c7444ecb67da9a6ccecbe40bb1c12 Mon Sep 17 00:00:00 2001 From: Dmitriy Anisimkov Date: Tue, 17 Sep 2019 08:02:20 +0000 Subject: [PATCH] [Ada] Force even timestamp in Windows ALI files Old versions forced even file timestamp in Windows in GNAT.OS_Lib.GM_Split implementation. We removed this time distortion in GNAT.OS_Lib.GM_Split a few commits. But gprbuild became unnecessary recompiling the sources in 50% cases, when the source has odd file timestamp. This commit is restoring the compatibility between new gprbuild and old GNAT compilers. 2019-09-17 Dmitriy Anisimkov gcc/ada/ * make_util.ads (On_Windows): Move... * osint.ads (On_Windows): There. * osint.adb (OS_Time_To_GNAT_Time): If odd incremented on Windows before conversion to Time_Stamp_Type. From-SVN: r275789 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/make_util.ads | 2 +- gcc/ada/osint.adb | 17 ++++++++++++++++- gcc/ada/osint.ads | 3 +++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index af3a2e7692d..13a3a766060 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2019-09-17 Dmitriy Anisimkov + + * make_util.ads (On_Windows): Move... + * osint.ads (On_Windows): There. + * osint.adb (OS_Time_To_GNAT_Time): If odd incremented on + Windows before conversion to Time_Stamp_Type. + 2019-09-17 Yannick Moy * sem_spark.adb (Check_Declaration): Do not check the assignment diff --git a/gcc/ada/make_util.ads b/gcc/ada/make_util.ads index c9be89409c7..9bd576a9344 100644 --- a/gcc/ada/make_util.ads +++ b/gcc/ada/make_util.ads @@ -50,7 +50,7 @@ package Make_Util is -- Name of the configuration file used by gprbuild and generated by -- gprconfig by default. - On_Windows : constant Boolean := Directory_Separator = '\'; + On_Windows : Boolean renames Osint.On_Windows; -- True when on Windows Source_Info_Option : constant String := "--source-info="; diff --git a/gcc/ada/osint.adb b/gcc/ada/osint.adb index d9d72d08bb0..973f463eca6 100644 --- a/gcc/ada/osint.adb +++ b/gcc/ada/osint.adb @@ -88,6 +88,10 @@ package body Osint is function OS_Time_To_GNAT_Time (T : OS_Time) return Time_Stamp_Type; -- Convert OS format time to GNAT format time stamp. If T is Invalid_Time, -- then returns Empty_Time_Stamp. + -- Round to even seconds on Windows before conversion. + -- Windows ALI files had timestamps rounded to even seconds historically. + -- The rounding was originally done in GM_Split. Now that GM_Split no + -- longer does it, we are rounding it here only for ALI files. function Executable_Prefix return String_Ptr; -- Returns the name of the root directory where the executable is stored. @@ -2179,6 +2183,7 @@ package body Osint is function OS_Time_To_GNAT_Time (T : OS_Time) return Time_Stamp_Type is GNAT_Time : Time_Stamp_Type; + TI : Long_Integer := To_C (T); Y : Year_Type; Mo : Month_Type; D : Day_Type; @@ -2191,7 +2196,17 @@ package body Osint is return Empty_Time_Stamp; end if; - GM_Split (T, Y, Mo, D, H, Mn, S); + if On_Windows and then TI mod 2 > 0 then + -- Windows ALI files had timestamps rounded to even seconds + -- historically. The rounding was originally done in GM_Split. + -- Now that GM_Split no longer does it, we are rounding it here + -- only for ALI files. + + TI := TI + 1; + end if; + + GM_Split (To_Ada (TI), Y, Mo, D, H, Mn, S); + Make_Time_Stamp (Year => Nat (Y), Month => Nat (Mo), diff --git a/gcc/ada/osint.ads b/gcc/ada/osint.ads index dda44e715aa..a0b046c52bc 100644 --- a/gcc/ada/osint.ads +++ b/gcc/ada/osint.ads @@ -56,6 +56,9 @@ package Osint is -- File descriptor for current library info, list, tree, C, H, or binder -- output. Only one of these is open at a time, so we need only one FD. + On_Windows : constant Boolean := Directory_Separator = '\'; + -- True when on Windows + procedure Initialize; -- Initialize internal tables -- 2.30.2