gcc/gcc/ada/fname.adb
Arnaud Charlet 457cee0b84 [multiple changes]
2017-04-25  Eric Botcazou  <ebotcazou@adacore.com>

	* fname.adb (Is_Internal_File_Name): Arrange for the slices to
	have a length which is a power of 2.
	(Is_Predefined_File_Name): Likewise. Adjust comment.

2017-04-25  Bob Duff  <duff@adacore.com>

	* exp_aggr.adb (Component_Count): Protect the
	arithmetic from attempting to convert a value >= 2**31 to Int,
	which would otherwise raise Constraint_Error.

2017-04-25  Bob Duff  <duff@adacore.com>

	* opt.ads (Locking_Policy): Fix incorrect documentation. The
	first character of the policy name is not unique.

2017-04-25  Bob Duff  <duff@adacore.com>

	* s-fileio.adb (Name): Raise Use_Error if the file is a temp file.
	* s-ficobl.ads (Is_Temporary_File): Remove incorrect comment
	about this flag not being used. It was already used, and it is
	now used more.

From-SVN: r247183
2017-04-25 12:52:13 +02:00

253 lines
8.8 KiB
Ada

------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- F N A M E --
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2016, 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- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
with Alloc;
with Table;
with Types; use Types;
package body Fname is
-----------------------------
-- Dummy Table Definitions --
-----------------------------
-- The following table was used in old versions of the compiler. We retain
-- the declarations here for compatibility with old tree files. The new
-- version of the compiler does not use this table, and will write out a
-- dummy empty table for Tree_Write.
type SFN_Entry is record
U : Unit_Name_Type;
F : File_Name_Type;
end record;
package SFN_Table is new Table.Table (
Table_Component_Type => SFN_Entry,
Table_Index_Type => Int,
Table_Low_Bound => 0,
Table_Initial => Alloc.SFN_Table_Initial,
Table_Increment => Alloc.SFN_Table_Increment,
Table_Name => "Fname_Dummy_Table");
function Has_Internal_Extension (Fname : String) return Boolean;
pragma Inline (Has_Internal_Extension);
-- True if the extension is appropriate for an internal/predefined unit.
-- That means ".ads" or ".adb" for source files, and ".ali" for ALI files.
function Has_Prefix (X, Prefix : String) return Boolean;
pragma Inline (Has_Prefix);
-- True if Prefix is at the beginning of X. For example,
-- Has_Prefix ("a-filename.ads", Prefix => "a-") is True.
----------------------------
-- Has_Internal_Extension --
----------------------------
function Has_Internal_Extension (Fname : String) return Boolean is
begin
if Fname'Length >= 4 then
declare
S : String renames Fname (Fname'Last - 3 .. Fname'Last);
begin
return S = ".ads" or else S = ".adb" or else S = ".ali";
end;
end if;
return False;
end Has_Internal_Extension;
----------------
-- Has_Prefix --
----------------
function Has_Prefix (X, Prefix : String) return Boolean is
begin
if X'Length >= Prefix'Length then
declare
S : String renames X (X'First .. X'First + Prefix'Length - 1);
begin
return S = Prefix;
end;
end if;
return False;
end Has_Prefix;
---------------------------
-- Is_Internal_File_Name --
---------------------------
function Is_Internal_File_Name
(Fname : String;
Renamings_Included : Boolean := True) return Boolean
is
begin
if Is_Predefined_File_Name (Fname, Renamings_Included) then
return True;
end if;
-- Check for internal extensions first, so we don't think (e.g.)
-- "gnat.adc" is internal.
if not Has_Internal_Extension (Fname) then
return False;
end if;
-- Definitely internal if prefix is g-
if Has_Prefix (Fname, "g-") then
return True;
end if;
-- See the note in Is_Predefined_File_Name for the rationale
return Fname'Length = 8 and then Has_Prefix (Fname, "gnat");
end Is_Internal_File_Name;
function Is_Internal_File_Name
(Fname : File_Name_Type;
Renamings_Included : Boolean := True) return Boolean
is
Result : constant Boolean :=
Is_Internal_File_Name
(Get_Name_String (Fname), Renamings_Included);
begin
return Result;
end Is_Internal_File_Name;
-----------------------------
-- Is_Predefined_File_Name --
-----------------------------
function Is_Predefined_File_Name
(Fname : String;
Renamings_Included : Boolean := True) return Boolean
is
subtype Str8 is String (1 .. 8);
Renaming_Names : constant array (1 .. 8) of Str8 :=
("calendar", -- Calendar
"machcode", -- Machine_Code
"unchconv", -- Unchecked_Conversion
"unchdeal", -- Unchecked_Deallocation
"directio", -- Direct_IO
"ioexcept", -- IO_Exceptions
"sequenio", -- Sequential_IO
"text_io."); -- Text_IO
-- Note: the implementation is optimized to perform uniform comparisons
-- on string slices whose length is known at compile time and is a small
-- power of 2 (at most 8 characters); the remaining calls to Has_Prefix
-- must be inlined to expose the compile-time known length. There must
-- be no calls to the fallback string comparison routine (e.g. memcmp)
-- left in the object code for the function; this can save up to 10% of
-- the entire compilation time spent in the front end.
begin
if not Has_Internal_Extension (Fname) then
return False;
end if;
-- Definitely predefined if prefix is a- i- or s-
if Fname'Length >= 2 then
declare
S : String renames Fname (Fname'First .. Fname'First + 1);
begin
if S = "a-" or else S = "i-" or else S = "s-" then
return True;
end if;
end;
end if;
-- Definitely false if longer than 12 characters (8.3)
if Fname'Length > 12 then
return False;
end if;
-- We include the "." in the prefixes below, so we don't match (e.g.)
-- adamant.ads. So the first line matches "ada.ads", "ada.adb", and
-- "ada.ali". But that's not necessary if they have 8 characters.
if Has_Prefix (Fname, "ada.") -- Ada
or else Has_Prefix (Fname, "interfac") -- Interfaces
or else Has_Prefix (Fname, "system.a") -- System
then
return True;
end if;
-- If instructed and the name has 8+ characters, check for renamings
if Renamings_Included and then Fname'Length >= 8 then
declare
S : String renames Fname (Fname'First .. Fname'First + 7);
begin
for J in Renaming_Names'Range loop
if S = Renaming_Names (J) then
return True;
end if;
end loop;
end;
end if;
return False;
end Is_Predefined_File_Name;
function Is_Predefined_File_Name
(Fname : File_Name_Type;
Renamings_Included : Boolean := True) return Boolean
is
Result : constant Boolean :=
Is_Predefined_File_Name
(Get_Name_String (Fname), Renamings_Included);
begin
return Result;
end Is_Predefined_File_Name;
---------------
-- Tree_Read --
---------------
procedure Tree_Read is
begin
SFN_Table.Tree_Read;
end Tree_Read;
----------------
-- Tree_Write --
----------------
procedure Tree_Write is
begin
SFN_Table.Tree_Write;
end Tree_Write;
end Fname;