From 3a0397df51186c36495bd8585b6277b4cb511f2b Mon Sep 17 00:00:00 2001 From: charlet Date: Fri, 30 Oct 2009 13:36:19 +0000 Subject: [PATCH] 2009-10-30 Emmanuel Briot * make.adb, osint.adb, osint.ads (Library_File_Stamp): Removed, since unused. (Read_Library_Info_From_Full): New subprogram. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153746 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 6 ++++ gcc/ada/make.adb | 85 +++++++++++++++++++++++++++++++++++++++++-------------- gcc/ada/osint.adb | 28 ++++++++++-------- gcc/ada/osint.ads | 10 +++++-- 4 files changed, 93 insertions(+), 36 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index e3943b6..ad2d9e2 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2009-10-30 Emmanuel Briot + + * make.adb, osint.adb, osint.ads (Library_File_Stamp): Removed, since + unused. + (Read_Library_Info_From_Full): New subprogram. + 2009-10-30 Robert Dewar * a-tideio.adb: Minor reformatting diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb index c7eab81..eec486a 100644 --- a/gcc/ada/make.adb +++ b/gcc/ada/make.adb @@ -740,6 +740,7 @@ package body Make is Is_Main_Source : Boolean; The_Args : Argument_List; Lib_File : File_Name_Type; + Full_Lib_File : File_Name_Type; Read_Only : Boolean; ALI : out ALI_Id; O_File : out File_Name_Type; @@ -750,6 +751,8 @@ package body Make is -- ALI is the ALI_Id corresponding to Lib_File. If Lib_File in not -- up-to-date, then the corresponding source file needs to be recompiled. -- In this case ALI = No_ALI_Id. + -- Full_Lib_File must be the result of calling Osint.Full_Lib_File_Name on + -- Lib_File. Precomputing it saves system calls. procedure Check_Linker_Options (E_Stamp : Time_Stamp_Type; @@ -1414,6 +1417,7 @@ package body Make is Is_Main_Source : Boolean; The_Args : Argument_List; Lib_File : File_Name_Type; + Full_Lib_File : File_Name_Type; Read_Only : Boolean; ALI : out ALI_Id; O_File : out File_Name_Type; @@ -1523,9 +1527,6 @@ package body Make is -- Data declarations for Check -- --------------------------------- - Full_Lib_File : File_Name_Type; - -- Full name of current library file - Full_Obj_File : File_Name_Type; -- Full name of the object file corresponding to Lib_File @@ -1576,15 +1577,14 @@ package body Make is Check_Object_Consistency; begin Check_Object_Consistency := False; - Text := Read_Library_Info (Lib_File); + Text := Read_Library_Info_From_Full (Full_Lib_File); Check_Object_Consistency := Saved_Check_Object_Consistency; end; else - Text := Read_Library_Info (Lib_File); + Text := Read_Library_Info_From_Full (Full_Lib_File); end if; - Full_Lib_File := Full_Library_Info_Name; Full_Obj_File := Full_Object_File_Name; Lib_Stamp := Current_Library_File_Stamp; Obj_Stamp := Current_Object_File_Stamp; @@ -3144,6 +3144,8 @@ package body Make is if not Empty_Q and then Outstanding_Compiles < Max_Process then declare + In_Lib_Dir : Boolean; + Source_Index : Int; -- Index of the current unit in the current source file @@ -3152,6 +3154,12 @@ package body Make is Full_Source_File := Osint.Full_Source_Name (Source_File); Lib_File := Osint.Lib_File_Name (Source_File, Source_Index); + + -- Compute the location of Lib_File (involves system calls) + -- ??? Can we compute at the same time if the file is + -- writable, which would save a system call on some systems + -- (when calling Is_Readonly_Library below) + Full_Lib_File := Osint.Full_Lib_File_Name (Lib_File); -- If this source has already been compiled, the executable is @@ -3161,11 +3169,22 @@ package body Make is Executable_Obsolete := True; end if; + In_Lib_Dir := Full_Lib_File /= No_File + and then In_Ada_Lib_Dir (Full_Lib_File); + + -- Since the following requires a system call, we precompute it + -- when needed + + if not In_Lib_Dir then + Read_Only := + Full_Lib_File /= No_File + and then not Check_Readonly_Files + and then Is_Readonly_Library (Full_Lib_File); + end if; + -- If the library file is an Ada library skip it - if Full_Lib_File /= No_File - and then In_Ada_Lib_Dir (Full_Lib_File) - then + if In_Lib_Dir then Verbose_Msg (Lib_File, "is in an Ada library", @@ -3178,9 +3197,7 @@ package body Make is -- in the object directory of a project being extended -- should not be skipped). - elsif Full_Lib_File /= No_File - and then not Check_Readonly_Files - and then Is_Readonly_Library (Full_Lib_File) + elsif Read_Only and then Is_In_Object_Directory (Source_File, Full_Lib_File) then Verbose_Msg @@ -3232,13 +3249,16 @@ package body Make is Need_To_Compile := Force_Compilations; if not Force_Compilations then - Read_Only := - Full_Lib_File /= No_File - and then not Check_Readonly_Files - and then Is_Readonly_Library (Full_Lib_File); - Check (Source_File, Source_Index, - Source_File = Main_Source, Args, Lib_File, - Read_Only, ALI, Obj_File, Obj_Stamp); + Check (Source_File => Source_File, + Source_Index => Source_Index, + Is_Main_Source => Source_File = Main_Source, + The_Args => Args, + Lib_File => Lib_File, + Full_Lib_File => Full_Lib_File, + Read_Only => Read_Only, + ALI => ALI, + O_File => Obj_File, + O_Stamp => Obj_Stamp); Need_To_Compile := (ALI = No_ALI_Id); end if; @@ -3285,13 +3305,13 @@ package body Make is end if; if In_Place_Mode then - -- If the library file was not found, then save -- the library file near the source file. if Full_Lib_File = No_File then Lib_File := Osint.Lib_File_Name (Full_Source_File, Source_Index); + Full_Lib_File := Lib_File; -- If the library file was found, then save the -- library file in the same place. @@ -3299,7 +3319,6 @@ package body Make is else Lib_File := Full_Lib_File; end if; - end if; -- Start the compilation and record it. We can do @@ -3362,7 +3381,29 @@ package body Make is Check_Object_Consistency and Compilation_OK and (Output_Is_Object or Do_Bind_Step); - Text := Read_Library_Info (Lib_File); + + if Full_Lib_File = No_File then + -- Compute the expected location of the ALI file. This + -- can be from several places: + -- -i => in place mode. In such a case, Full_Lib_File + -- has already been set above + -- -D => if specified + -- or defaults in current dir + -- We could simply use a call similar to + -- Osint.Full_Lib_File_Name (Lib_File) + -- but that involves system calls and is thus slower + + if Object_Directory_Path /= null then + Name_Len := 0; + Add_Str_To_Name_Buffer (Object_Directory_Path.all); + Add_Str_To_Name_Buffer (Get_Name_String (Lib_File)); + Full_Lib_File := Name_Find; + else + Full_Lib_File := Lib_File; + end if; + end if; + + Text := Read_Library_Info_From_Full (Full_Lib_File); -- Restore Check_Object_Consistency to its initial value diff --git a/gcc/ada/osint.adb b/gcc/ada/osint.adb index a8db0a5..11197f4 100644 --- a/gcc/ada/osint.adb +++ b/gcc/ada/osint.adb @@ -1529,15 +1529,6 @@ package body Osint is return Name_Find; end Lib_File_Name; - ------------------------ - -- Library_File_Stamp -- - ------------------------ - - function Library_File_Stamp (N : File_Name_Type) return Time_Stamp_Type is - begin - return File_Stamp (Find_File (N, Library)); - end Library_File_Stamp; - ----------------- -- Locate_File -- ----------------- @@ -2119,7 +2110,20 @@ package body Osint is function Read_Library_Info (Lib_File : File_Name_Type; - Fatal_Err : Boolean := False) return Text_Buffer_Ptr + Fatal_Err : Boolean := False) return Text_Buffer_Ptr is + begin + return Read_Library_Info_From_Full + (Full_Lib_File => Find_File (Lib_File, Library), + Fatal_Err => Fatal_Err); + end Read_Library_Info; + + --------------------------------- + -- Read_Library_Info_From_Full -- + --------------------------------- + + function Read_Library_Info_From_Full + (Full_Lib_File : File_Name_Type; + Fatal_Err : Boolean := False) return Text_Buffer_Ptr is Lib_FD : File_Descriptor; -- The file descriptor for the current library file. A negative value @@ -2133,7 +2137,7 @@ package body Osint is -- For the calls to Close begin - Current_Full_Lib_Name := Find_File (Lib_File, Library); + Current_Full_Lib_Name := Full_Lib_File; Current_Full_Obj_Name := Object_File_Name (Current_Full_Lib_Name); if Current_Full_Lib_Name = No_File then @@ -2239,7 +2243,7 @@ package body Osint is return Text; - end Read_Library_Info; + end Read_Library_Info_From_Full; ---------------------- -- Read_Source_File -- diff --git a/gcc/ada/osint.ads b/gcc/ada/osint.ads index a44d4e2..b129add 100644 --- a/gcc/ada/osint.ads +++ b/gcc/ada/osint.ads @@ -486,6 +486,13 @@ package Osint is -- behaves as if it did not find Lib_File (namely if Fatal_Err is -- False, null is returned). + function Read_Library_Info_From_Full + (Full_Lib_File : File_Name_Type; + Fatal_Err : Boolean := False) return Text_Buffer_Ptr; + -- Same as Read_Library_Info, except Full_Lib_File must contains the full + -- path to the library file (instead of having Read_Library_Info recompute + -- it) + function Full_Library_Info_Name return File_Name_Type; function Full_Object_File_Name return File_Name_Type; -- Returns the full name of the library/object file most recently read @@ -502,8 +509,7 @@ package Osint is -- Opt.Check_Object_Consistency is set to False. function Full_Lib_File_Name (N : File_Name_Type) return File_Name_Type; - function Library_File_Stamp (N : File_Name_Type) return Time_Stamp_Type; - -- Returns the full name/time stamp of library file N. N should not include + -- Returns the full name of library file N. N should not include -- path information. Note that if the file cannot be located No_File is -- returned for the first routine and an all blank time stamp is returned -- for the second (this is not an error situation). The full name includes -- 2.7.4