summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-20 09:14:04 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-20 09:14:04 +0000
commit2b4d755574eabfd23a5bd5a49f2d78d157e4824c (patch)
tree74c14ff78cae4b78f867d2b3c54dd6dade631222
parent57995f4414e60fb8f29ff5f1ed50a9cfd7c08457 (diff)
downloadgcc-2b4d755574eabfd23a5bd5a49f2d78d157e4824c.tar.gz
2009-04-20 Robert Dewar <dewar@adacore.com>
* s-conca5.adb, s-conca5.ads, s-conca7.adb, s-conca7.ads, s-conca9.adb, s-conca9.ads, rtsfind.ads, s-conca2.adb, s-conca2.ads, s-conca4.adb, s-conca4.ads, s-conca6.adb, s-conca6.ads, s-conca8.adb, s-conca8.ads, s-conca3.adb, s-conca3.ads (Str_Concat_Bounds_x): New functions. * exp_ch4.adb (Expand_Concatenate): Minor code reorganization 2009-04-20 Pascal Obry <obry@adacore.com> * initialize.c (__gnat_initialize): Add braces to kill warning. * adaint.c: Minor reformatting, untabify, remove trailing spaces. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@146379 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ada/ChangeLog16
-rw-r--r--gcc/ada/adaint.c131
-rw-r--r--gcc/ada/exp_ch4.adb33
-rw-r--r--gcc/ada/initialize.c12
-rw-r--r--gcc/ada/rtsfind.ads18
-rw-r--r--gcc/ada/s-conca2.adb18
-rw-r--r--gcc/ada/s-conca2.ads13
-rw-r--r--gcc/ada/s-conca3.adb19
-rw-r--r--gcc/ada/s-conca3.ads13
-rw-r--r--gcc/ada/s-conca4.adb19
-rw-r--r--gcc/ada/s-conca4.ads15
-rw-r--r--gcc/ada/s-conca5.adb19
-rw-r--r--gcc/ada/s-conca5.ads15
-rw-r--r--gcc/ada/s-conca6.adb19
-rw-r--r--gcc/ada/s-conca6.ads15
-rw-r--r--gcc/ada/s-conca7.adb19
-rw-r--r--gcc/ada/s-conca7.ads15
-rw-r--r--gcc/ada/s-conca8.adb20
-rw-r--r--gcc/ada/s-conca8.ads11
-rw-r--r--gcc/ada/s-conca9.adb20
-rw-r--r--gcc/ada/s-conca9.ads11
21 files changed, 362 insertions, 109 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 748048b66dd..c2967e0c398 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,19 @@
+2009-04-20 Robert Dewar <dewar@adacore.com>
+
+ * s-conca5.adb, s-conca5.ads, s-conca7.adb, s-conca7.ads, s-conca9.adb,
+ s-conca9.ads, rtsfind.ads, s-conca2.adb, s-conca2.ads, s-conca4.adb,
+ s-conca4.ads, s-conca6.adb, s-conca6.ads, s-conca8.adb, s-conca8.ads,
+ s-conca3.adb, s-conca3.ads (Str_Concat_Bounds_x): New functions.
+
+ * exp_ch4.adb (Expand_Concatenate): Minor code reorganization
+
+2009-04-20 Pascal Obry <obry@adacore.com>
+
+ * initialize.c (__gnat_initialize): Add braces to kill warning.
+
+ * adaint.c: Minor reformatting, untabify, remove trailing spaces.
+
+
2009-04-17 Arnaud Charlet <charlet@adacore.com>
* gcc-interface/Make-lang.in: Update dependencies.
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index 0047e447655..3ef9744571a 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -1611,6 +1611,7 @@ __gnat_get_libraries_from_registry (void)
/* If the key exists, read out all the values in it and concatenate them
into a path. */
+
for (index = 0; res == ERROR_SUCCESS; index++)
{
value_size = name_size = 256;
@@ -1631,8 +1632,8 @@ __gnat_get_libraries_from_registry (void)
/* Remove the trailing ";". */
if (result[0] != 0)
result[strlen (result) - 1] = 0;
-
#endif
+
return result;
}
@@ -1722,7 +1723,7 @@ __gnat_is_absolute_path (char *name, int length)
#if defined (__EMX__) || defined (MSDOS) || defined (WINNT)
|| (length > 1 && ISALPHA (name[0]) && name[1] == ':')
#endif
- );
+ );
#endif
}
@@ -1773,34 +1774,34 @@ GetDriveTypeFromPath (TCHAR *wfullpath)
/* Is this a relative path, if so get current drive type. */
if (wpath[0] != _T('\\') ||
- (_tcslen (wpath) > 2 && wpath[0] == _T('\\') && wpath[1] != _T('\\')))
- return GetDriveType (NULL);
+ (_tcslen (wpath) > 2 && wpath[0] == _T('\\') && wpath[1] != _T('\\')))
+ return GetDriveType (NULL);
UINT result = GetDriveType (wpath);
/* Cannot guess the drive type, is this \\.\ ? */
if (result == DRIVE_NO_ROOT_DIR &&
- _tcslen (wpath) >= 4 && wpath[0] == _T('\\') && wpath[1] == _T('\\')
- && wpath[2] == _T('.') && wpath[3] == _T('\\'))
- {
- if (_tcslen (wpath) == 4)
- _tcscat (wpath, wfilename);
-
- LPTSTR p = &wpath[4];
- LPTSTR b = _tcschr (p, _T('\\'));
-
- if (b != NULL)
- { /* logical drive \\.\c\dir\file */
- *b++ = _T(':');
- *b++ = _T('\\');
- *b = _T('\0');
- }
- else
- _tcscat (p, _T(":\\"));
-
- return GetDriveType (p);
- }
+ _tcslen (wpath) >= 4 && wpath[0] == _T('\\') && wpath[1] == _T('\\')
+ && wpath[2] == _T('.') && wpath[3] == _T('\\'))
+ {
+ if (_tcslen (wpath) == 4)
+ _tcscat (wpath, wfilename);
+
+ LPTSTR p = &wpath[4];
+ LPTSTR b = _tcschr (p, _T('\\'));
+
+ if (b != NULL)
+ { /* logical drive \\.\c\dir\file */
+ *b++ = _T(':');
+ *b++ = _T('\\');
+ *b = _T('\0');
+ }
+ else
+ _tcscat (p, _T(":\\"));
+
+ return GetDriveType (p);
+ }
return result;
}
@@ -1900,9 +1901,9 @@ __gnat_set_OWNER_ACL
if (AccessMode == SET_ACCESS)
{
/* SET_ACCESS, we want to set an explicte set of permissions, do not
- merge with current DACL. */
+ merge with current DACL. */
if (SetEntriesInAcl (1, &ea, NULL, &pNewDACL) != ERROR_SUCCESS)
- return;
+ return;
}
else
if (SetEntriesInAcl (1, &ea, pOldDACL, &pNewDACL) != ERROR_SUCCESS)
@@ -1973,8 +1974,8 @@ __gnat_is_writable_file (char *name)
GenericMapping.GenericWrite = GENERIC_WRITE;
return __gnat_check_OWNER_ACL
- (wname, FILE_WRITE_DATA | FILE_APPEND_DATA, GenericMapping)
- && !(GetFileAttributes (wname) & FILE_ATTRIBUTE_READONLY);
+ (wname, FILE_WRITE_DATA | FILE_APPEND_DATA, GenericMapping)
+ && !(GetFileAttributes (wname) & FILE_ATTRIBUTE_READONLY);
}
else
return !(GetFileAttributes (wname) & FILE_ATTRIBUTE_READONLY);
@@ -2008,7 +2009,7 @@ __gnat_is_executable_file (char *name)
}
else
return GetFileAttributes (wname) != INVALID_FILE_ATTRIBUTES
- && _tcsstr (wname, _T(".exe")) - wname == (_tcslen (wname) - 4);
+ && _tcsstr (wname, _T(".exe")) - wname == (int) (_tcslen (wname) - 4);
#else
int ret;
@@ -2207,9 +2208,9 @@ __gnat_portable_spawn (char *args[])
/* The child. */
if (execv (args[0], MAYBE_TO_PTR32 (args)) != 0)
#if defined (VMS)
- return -1; /* execv is in parent context on VMS. */
+ return -1; /* execv is in parent context on VMS. */
#else
- _exit (1);
+ _exit (1);
#endif
}
#endif
@@ -2327,9 +2328,9 @@ remove_handle (HANDLE h)
if (pl->h == h)
{
if (pl == PLIST)
- PLIST = pl->next;
+ PLIST = pl->next;
else
- prev->next = pl->next;
+ prev->next = pl->next;
free (pl);
break;
}
@@ -2504,9 +2505,9 @@ __gnat_portable_no_block_spawn (char *args[])
/* The child. */
if (execv (args[0], MAYBE_TO_PTR32 (args)) != 0)
#if defined (VMS)
- return -1; /* execv is in parent context on VMS. */
+ return -1; /* execv is in parent context on VMS. */
#else
- _exit (1);
+ _exit (1);
#endif
}
@@ -2616,17 +2617,17 @@ __gnat_locate_regular_file (char *file_name, char *path_val)
/* Skip the starting quote */
if (*path_val == '"')
- path_val++;
+ path_val++;
for (ptr = file_path; *path_val && *path_val != PATH_SEPARATOR; )
- *ptr++ = *path_val++;
+ *ptr++ = *path_val++;
ptr--;
/* Skip the ending quote */
if (*ptr == '"')
- ptr--;
+ ptr--;
if (*ptr != '/' && *ptr != DIR_SEPARATOR)
*++ptr = DIR_SEPARATOR;
@@ -2754,8 +2755,8 @@ wildcard_translate_unix (char *name)
{
new_canonical_filelist_allocated += NEW_CANONICAL_FILELIST_INCREMENT;
new_canonical_filelist = (char **) xrealloc
- (new_canonical_filelist,
- new_canonical_filelist_allocated * sizeof (char *));
+ (new_canonical_filelist,
+ new_canonical_filelist_allocated * sizeof (char *));
}
new_canonical_filelist[new_canonical_filelist_in_use++] = xstrdup (buff);
@@ -2791,11 +2792,11 @@ __gnat_to_canonical_file_list_init (char *filespec, int onlydirs)
char *ext;
for (i = 0; i < new_canonical_filelist_in_use; i++)
- {
- ext = strstr (new_canonical_filelist[i], ".dir");
- if (ext)
- *ext = 0;
- }
+ {
+ ext = strstr (new_canonical_filelist[i], ".dir");
+ if (ext)
+ *ext = 0;
+ }
}
return new_canonical_filelist_in_use;
@@ -2974,21 +2975,21 @@ __gnat_to_canonical_dir_spec (char *dirspec, int prefixflag)
char *dirspec1;
if (strchr (dirspec, ']') || strchr (dirspec, ':'))
- {
- strncpy (new_canonical_dirspec,
- __gnat_translate_vms (dirspec),
- MAXPATH);
- }
+ {
+ strncpy (new_canonical_dirspec,
+ __gnat_translate_vms (dirspec),
+ MAXPATH);
+ }
else if (!strchr (dirspec, '/') && (dirspec1 = getenv (dirspec)) != 0)
- {
- strncpy (new_canonical_dirspec,
- __gnat_translate_vms (dirspec1),
- MAXPATH);
- }
+ {
+ strncpy (new_canonical_dirspec,
+ __gnat_translate_vms (dirspec1),
+ MAXPATH);
+ }
else
- {
- strncpy (new_canonical_dirspec, dirspec, MAXPATH);
- }
+ {
+ strncpy (new_canonical_dirspec, dirspec, MAXPATH);
+ }
}
len = strlen (new_canonical_dirspec);
@@ -3019,16 +3020,16 @@ __gnat_to_canonical_file_spec (char *filespec)
char *tspec = (char *) __gnat_translate_vms (filespec);
if (tspec != (char *) -1)
- strncpy (new_canonical_filespec, tspec, MAXPATH);
+ strncpy (new_canonical_filespec, tspec, MAXPATH);
}
else if ((strlen (filespec) == strspn (filespec,
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"))
- && (filespec1 = getenv (filespec)))
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"))
+ && (filespec1 = getenv (filespec)))
{
char *tspec = (char *) __gnat_translate_vms (filespec1);
if (tspec != (char *) -1)
- strncpy (new_canonical_filespec, tspec, MAXPATH);
+ strncpy (new_canonical_filespec, tspec, MAXPATH);
}
else
{
@@ -3085,11 +3086,11 @@ __gnat_to_canonical_path_spec (char *pathspec)
strncat (new_canonical_pathspec, ":", MAXPATH);
}
- __gnat_to_canonical_file_list_free ();
+ __gnat_to_canonical_file_list_free ();
}
else
- strncat (new_canonical_pathspec,
- __gnat_to_canonical_dir_spec (buff, 0), MAXPATH);
+ strncat (new_canonical_pathspec,
+ __gnat_to_canonical_dir_spec (buff, 0), MAXPATH);
if (*next == 0)
break;
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index ef4dbc51989..19dbf7aa77f 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -2239,6 +2239,14 @@ package body Exp_Ch4 is
Result : Node_Id;
-- Result of the concatenation (of type Ityp)
+ Actions : constant List_Id := New_List;
+ -- Collect actions to be inserted if Save_Space is False
+
+ Save_Space : Boolean;
+ pragma Warnings (Off, Save_Space);
+ -- Set to True if we are saving generated code space by calling routines
+ -- in packages System.Concat_n.
+
Known_Non_Null_Operand_Seen : Boolean;
-- Set True during generation of the assignements of operands into
-- result once an operand known to be non-null has been seen.
@@ -2552,7 +2560,7 @@ package body Exp_Ch4 is
Make_Defining_Identifier (Loc,
Chars => New_Internal_Name ('L'));
- Insert_Action (Cnode,
+ Append_To (Actions,
Make_Object_Declaration (Loc,
Defining_Identifier => Var_Length (NN),
Constant_Present => True,
@@ -2564,9 +2572,7 @@ package body Exp_Ch4 is
Make_Attribute_Reference (Loc,
Prefix =>
Duplicate_Subexpr (Opnd, Name_Req => True),
- Attribute_Name => Name_Length)),
-
- Suppress => All_Checks);
+ Attribute_Name => Name_Length)));
end if;
end if;
@@ -2595,8 +2601,8 @@ package body Exp_Ch4 is
Make_Integer_Literal (Loc,
Intval => Fixed_Length (NN) + Intval (Aggr_Length (NN - 1)));
- -- All other cases, construct an addition node for the length and
- -- create an entity initialized to this length.
+ -- All other cases, construct an addition node for the length and
+ -- create an entity initialized to this length.
else
Ent :=
@@ -2609,7 +2615,7 @@ package body Exp_Ch4 is
Clen := New_Reference_To (Var_Length (NN), Loc);
end if;
- Insert_Action (Cnode,
+ Append_To (Actions,
Make_Object_Declaration (Loc,
Defining_Identifier => Ent,
Constant_Present => True,
@@ -2620,9 +2626,7 @@ package body Exp_Ch4 is
Expression =>
Make_Op_Add (Loc,
Left_Opnd => New_Copy (Aggr_Length (NN - 1)),
- Right_Opnd => Clen)),
-
- Suppress => All_Checks);
+ Right_Opnd => Clen)));
Aggr_Length (NN) := Make_Identifier (Loc, Chars => Chars (Ent));
end if;
@@ -2724,13 +2728,12 @@ package body Exp_Ch4 is
Ent :=
Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('L'));
- Insert_Action (Cnode,
+ Append_To (Actions,
Make_Object_Declaration (Loc,
Defining_Identifier => Ent,
Constant_Present => True,
Object_Definition => New_Occurrence_Of (Ityp, Loc),
- Expression => Get_Known_Bound (1)),
- Suppress => All_Checks);
+ Expression => Get_Known_Bound (1)));
Low_Bound := New_Reference_To (Ent, Loc);
end;
@@ -2773,6 +2776,10 @@ package body Exp_Ch4 is
High_Bound));
end if;
+ -- Here is where we insert the saved up actions
+
+ Insert_Actions (Cnode, Actions, Suppress => All_Checks);
+
-- Now we construct an array object with appropriate bounds
Ent :=
diff --git a/gcc/ada/initialize.c b/gcc/ada/initialize.c
index f5acbe6593a..8ad15bd8e91 100644
--- a/gcc/ada/initialize.c
+++ b/gcc/ada/initialize.c
@@ -97,7 +97,7 @@ append_arg (int *index, LPWSTR value, char ***argv, int *last)
#endif
void
-__gnat_initialize (void *eh)
+__gnat_initialize (void *eh ATTRIBUTE_UNUSED)
{
/* Initialize floating-point coprocessor. This call is needed because
the MS libraries default to 64-bit precision instead of 80-bit
@@ -114,10 +114,12 @@ __gnat_initialize (void *eh)
CurrentCodePage = CP_UTF8;
if (codepage != NULL)
- if (strcmp (codepage, "CP_ACP") == 0)
- CurrentCodePage = CP_ACP;
- else if (strcmp (codepage, "CP_UTF8") == 0)
- CurrentCodePage = CP_UTF8;
+ {
+ if (strcmp (codepage, "CP_ACP") == 0)
+ CurrentCodePage = CP_ACP;
+ else if (strcmp (codepage, "CP_UTF8") == 0)
+ CurrentCodePage = CP_UTF8;
+ }
}
/* Adjust gnat_argv to support Unicode characters. */
diff --git a/gcc/ada/rtsfind.ads b/gcc/ada/rtsfind.ads
index f3dd1765634..dd655ac3d8d 100644
--- a/gcc/ada/rtsfind.ads
+++ b/gcc/ada/rtsfind.ads
@@ -705,6 +705,15 @@ package Rtsfind is
RE_Str_Concat_8, -- System.Concat_8
RE_Str_Concat_9, -- System.Concat_9
+ RE_Str_Concat_Bounds_2, -- System.Concat_2
+ RE_Str_Concat_Bounds_3, -- System.Concat_3
+ RE_Str_Concat_Bounds_4, -- System.Concat_4
+ RE_Str_Concat_Bounds_5, -- System.Concat_5
+ RE_Str_Concat_Bounds_6, -- System.Concat_6
+ RE_Str_Concat_Bounds_7, -- System.Concat_7
+ RE_Str_Concat_Bounds_8, -- System.Concat_8
+ RE_Str_Concat_Bounds_9, -- System.Concat_9
+
RE_Get_Active_Partition_Id, -- System.DSA_Services
RE_Get_Local_Partition_Id, -- System.DSA_Services
RE_Get_Passive_Partition_Id, -- System.DSA_Services
@@ -1858,6 +1867,15 @@ package Rtsfind is
RE_Str_Concat_8 => System_Concat_8,
RE_Str_Concat_9 => System_Concat_9,
+ RE_Str_Concat_Bounds_2 => System_Concat_2,
+ RE_Str_Concat_Bounds_3 => System_Concat_3,
+ RE_Str_Concat_Bounds_4 => System_Concat_4,
+ RE_Str_Concat_Bounds_5 => System_Concat_5,
+ RE_Str_Concat_Bounds_6 => System_Concat_6,
+ RE_Str_Concat_Bounds_7 => System_Concat_7,
+ RE_Str_Concat_Bounds_8 => System_Concat_8,
+ RE_Str_Concat_Bounds_9 => System_Concat_9,
+
RE_Get_Active_Partition_Id => System_DSA_Services,
RE_Get_Local_Partition_Id => System_DSA_Services,
RE_Get_Passive_Partition_Id => System_DSA_Services,
diff --git a/gcc/ada/s-conca2.adb b/gcc/ada/s-conca2.adb
index 1764575737c..a1d424b8547 100644
--- a/gcc/ada/s-conca2.adb
+++ b/gcc/ada/s-conca2.adb
@@ -52,4 +52,22 @@ package body System.Concat_2 is
R (F .. L) := S2;
end Str_Concat_2;
+ -------------------------
+ -- Str_Concat_Bounds_2 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_2
+ (Lo, Hi : out Natural;
+ S1, S2 : String)
+ is
+ begin
+ if S1 = "" then
+ Lo := S2'First;
+ Hi := S2'Last;
+ else
+ Lo := S1'First;
+ Hi := S1'Last + S2'Length;
+ end if;
+ end Str_Concat_Bounds_2;
+
end System.Concat_2;
diff --git a/gcc/ada/s-conca2.ads b/gcc/ada/s-conca2.ads
index b0fa85956af..c5c7a2808be 100644
--- a/gcc/ada/s-conca2.ads
+++ b/gcc/ada/s-conca2.ads
@@ -38,8 +38,15 @@ package System.Concat_2 is
procedure Str_Concat_2 (R : out String; S1, S2 : String);
-- Performs the operation R := S1 & S2. The bounds of R are known to be
- -- correct, so no bounds checks are required, and it is known that none
- -- of the input operands overlaps R. No assumptions can be made about
- -- the lower bounds of any of the operands.
+ -- correct (usually set by a call to the Str_Concat_Bounds_2 procedure
+ -- below), so no bounds checks are required, and it is known that none of
+ -- the input operands overlaps R. No assumptions can be made about the
+ -- lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_2
+ (Lo, Hi : out Natural;
+ S1, S2 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the two
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_2;
diff --git a/gcc/ada/s-conca3.adb b/gcc/ada/s-conca3.adb
index daa4ec7c9f8..48e4d86512b 100644
--- a/gcc/ada/s-conca3.adb
+++ b/gcc/ada/s-conca3.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_2;
+
package body System.Concat_3 is
pragma Suppress (All_Checks);
@@ -56,4 +58,21 @@ package body System.Concat_3 is
R (F .. L) := S3;
end Str_Concat_3;
+ -------------------------
+ -- Str_Concat_Bounds_3 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_3
+ (Lo, Hi : out Natural;
+ S1, S2, S3 : String)
+ is
+ begin
+ System.Concat_2.Str_Concat_Bounds_2 (Lo, Hi, S2, S3);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_3;
+
end System.Concat_3;
diff --git a/gcc/ada/s-conca3.ads b/gcc/ada/s-conca3.ads
index 41c7d978ecb..c79e24a39c3 100644
--- a/gcc/ada/s-conca3.ads
+++ b/gcc/ada/s-conca3.ads
@@ -38,8 +38,15 @@ package System.Concat_3 is
procedure Str_Concat_3 (R : out String; S1, S2, S3 : String);
-- Performs the operation R := S1 & S2 & S3. The bounds of R are known to
- -- be correct, so no bounds checks are required, and it is known that none
- -- of the input operands overlaps R. No assumptions can be made about
- -- the lower bounds of any of the operands.
+ -- be correct (usually set by a call to the Str_Concat_Bounds_3 procedure
+ -- below), so no bounds checks are required, and it is known that none of
+ -- the input operands overlaps R. No assumptions can be made about the
+ -- lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_3
+ (Lo, Hi : out Natural;
+ S1, S2, S3 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the three
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_3;
diff --git a/gcc/ada/s-conca4.adb b/gcc/ada/s-conca4.adb
index 455c5be3e76..19fa324834b 100644
--- a/gcc/ada/s-conca4.adb
+++ b/gcc/ada/s-conca4.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_3;
+
package body System.Concat_4 is
pragma Suppress (All_Checks);
@@ -60,4 +62,21 @@ package body System.Concat_4 is
R (F .. L) := S4;
end Str_Concat_4;
+ -------------------------
+ -- Str_Concat_Bounds_4 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_4
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4 : String)
+ is
+ begin
+ System.Concat_3.Str_Concat_Bounds_3 (Lo, Hi, S2, S3, S4);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_4;
+
end System.Concat_4;
diff --git a/gcc/ada/s-conca4.ads b/gcc/ada/s-conca4.ads
index a6d530c81e6..43ce1bc3b2e 100644
--- a/gcc/ada/s-conca4.ads
+++ b/gcc/ada/s-conca4.ads
@@ -37,9 +37,16 @@ pragma Compiler_Unit;
package System.Concat_4 is
procedure Str_Concat_4 (R : out String; S1, S2, S3, S4 : String);
- -- Performs the operation R := S1 & S2 & S3 & S4. The bounds of R are known
- -- to be correct, so no bounds checks are required, and it is known that
- -- none of the input operands overlaps R. No assumptions can be made about
- -- the lower bounds of any of the operands.
+ -- Performs the operation R := S1 & S2 & S3 & S4. The bounds
+ -- of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_5 procedure below), so no bounds checks are required,
+ -- and it is known that none of the input operands overlaps R. No
+ -- assumptions can be made about the lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_4
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the four
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_4;
diff --git a/gcc/ada/s-conca5.adb b/gcc/ada/s-conca5.adb
index e463255a5bb..f0019961a99 100644
--- a/gcc/ada/s-conca5.adb
+++ b/gcc/ada/s-conca5.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_4;
+
package body System.Concat_5 is
pragma Suppress (All_Checks);
@@ -64,4 +66,21 @@ package body System.Concat_5 is
R (F .. L) := S5;
end Str_Concat_5;
+ -------------------------
+ -- Str_Concat_Bounds_5 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_5
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5 : String)
+ is
+ begin
+ System.Concat_4.Str_Concat_Bounds_4 (Lo, Hi, S2, S3, S4, S5);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_5;
+
end System.Concat_5;
diff --git a/gcc/ada/s-conca5.ads b/gcc/ada/s-conca5.ads
index 445b2137866..996dbf93678 100644
--- a/gcc/ada/s-conca5.ads
+++ b/gcc/ada/s-conca5.ads
@@ -37,9 +37,16 @@ pragma Compiler_Unit;
package System.Concat_5 is
procedure Str_Concat_5 (R : out String; S1, S2, S3, S4, S5 : String);
- -- Performs the operation R := S1 & S2 & S3 & S4 & S5. The bounds of R are
- -- known to be correct, so no bounds checks are required, and it is known
- -- that none of the input operands overlaps R. No assumptions can be made
- -- about the lower bounds of any of the operands.
+ -- Performs the operation R := S1 & S2 & S3 & S4 & S5. The bounds
+ -- of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_5 procedure below), so no bounds checks are required,
+ -- and it is known that none of the input operands overlaps R. No
+ -- assumptions can be made about the lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_5
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the five
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_5;
diff --git a/gcc/ada/s-conca6.adb b/gcc/ada/s-conca6.adb
index a0bd3838fe1..115b36ec0e4 100644
--- a/gcc/ada/s-conca6.adb
+++ b/gcc/ada/s-conca6.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_5;
+
package body System.Concat_6 is
pragma Suppress (All_Checks);
@@ -68,4 +70,21 @@ package body System.Concat_6 is
R (F .. L) := S6;
end Str_Concat_6;
+ -------------------------
+ -- Str_Concat_Bounds_6 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_6
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6 : String)
+ is
+ begin
+ System.Concat_5.Str_Concat_Bounds_5 (Lo, Hi, S2, S3, S4, S5, S6);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_6;
+
end System.Concat_6;
diff --git a/gcc/ada/s-conca6.ads b/gcc/ada/s-conca6.ads
index f78f932f1f0..91cc10e68d5 100644
--- a/gcc/ada/s-conca6.ads
+++ b/gcc/ada/s-conca6.ads
@@ -37,9 +37,16 @@ pragma Compiler_Unit;
package System.Concat_6 is
procedure Str_Concat_6 (R : out String; S1, S2, S3, S4, S5, S6 : String);
- -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6. The bounds of
- -- R are known to be correct, so no bounds checks are required, and it is
- -- known that none of the input operands overlaps R. No assumptions can be
- -- made about the lower bounds of any of the operands.
+ -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6. The
+ -- bounds of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_6 procedure below), so no bounds checks are required,
+ -- and it is known that none of the input operands overlaps R. No
+ -- assumptions can be made about the lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_6
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the six
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_6;
diff --git a/gcc/ada/s-conca7.adb b/gcc/ada/s-conca7.adb
index c014a47a9eb..5436fbd8c5e 100644
--- a/gcc/ada/s-conca7.adb
+++ b/gcc/ada/s-conca7.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_6;
+
package body System.Concat_7 is
pragma Suppress (All_Checks);
@@ -75,4 +77,21 @@ package body System.Concat_7 is
R (F .. L) := S7;
end Str_Concat_7;
+ -------------------------
+ -- Str_Concat_Bounds_7 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_7
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7 : String)
+ is
+ begin
+ System.Concat_6.Str_Concat_Bounds_6 (Lo, Hi, S2, S3, S4, S5, S6, S7);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_7;
+
end System.Concat_7;
diff --git a/gcc/ada/s-conca7.ads b/gcc/ada/s-conca7.ads
index 31d5da1888b..139a816d23c 100644
--- a/gcc/ada/s-conca7.ads
+++ b/gcc/ada/s-conca7.ads
@@ -39,9 +39,16 @@ package System.Concat_7 is
procedure Str_Concat_7
(R : out String;
S1, S2, S3, S4, S5, S6, S7 : String);
- -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6 & S7. The bounds
- -- of R are known to be correct, so no bounds checks are required, and it
- -- is known that none of the input operands overlaps R. No assumptions can
- -- be made about the lower bounds of any of the operands.
+ -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6 & S7. The
+ -- bounds of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_8 procedure below), so no bounds checks are required,
+ -- and it is known that none of the input operands overlaps R. No
+ -- assumptions can be made about the lower bounds of any of the operands.
+
+ procedure Str_Concat_Bounds_7
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the seven
+ -- given strings, following the rules in the RM regarding null operands.
end System.Concat_7;
diff --git a/gcc/ada/s-conca8.adb b/gcc/ada/s-conca8.adb
index 3814f5721ab..dfc5bf7dfde 100644
--- a/gcc/ada/s-conca8.adb
+++ b/gcc/ada/s-conca8.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_7;
+
package body System.Concat_8 is
pragma Suppress (All_Checks);
@@ -79,4 +81,22 @@ package body System.Concat_8 is
R (F .. L) := S8;
end Str_Concat_8;
+ -------------------------
+ -- Str_Concat_Bounds_8 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_8
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7, S8 : String)
+ is
+ begin
+ System.Concat_7.Str_Concat_Bounds_7
+ (Lo, Hi, S2, S3, S4, S5, S6, S7, S8);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_8;
+
end System.Concat_8;
diff --git a/gcc/ada/s-conca8.ads b/gcc/ada/s-conca8.ads
index 0d93b243010..5978a39dca3 100644
--- a/gcc/ada/s-conca8.ads
+++ b/gcc/ada/s-conca8.ads
@@ -39,9 +39,16 @@ package System.Concat_8 is
procedure Str_Concat_8
(R : out String;
S1, S2, S3, S4, S5, S6, S7, S8 : String);
- -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6 & S7 & S8. The
- -- bounds of R are known to be correct, so no bounds checks are required,
+ -- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6 & S7 & S8.
+ -- The bounds of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_8 procedure below), so no bounds checks are required,
-- and it is known that none of the input operands overlaps R. No
-- assumptions can be made about the lower bounds of any of the operands.
+ procedure Str_Concat_Bounds_8
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7, S8 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the eight
+ -- given strings, following the rules in the RM regarding null operands.
+
end System.Concat_8;
diff --git a/gcc/ada/s-conca9.adb b/gcc/ada/s-conca9.adb
index a575801271c..530eee19349 100644
--- a/gcc/ada/s-conca9.adb
+++ b/gcc/ada/s-conca9.adb
@@ -31,6 +31,8 @@
pragma Compiler_Unit;
+with System.Concat_8;
+
package body System.Concat_9 is
pragma Suppress (All_Checks);
@@ -83,4 +85,22 @@ package body System.Concat_9 is
R (F .. L) := S9;
end Str_Concat_9;
+ -------------------------
+ -- Str_Concat_Bounds_9 --
+ -------------------------
+
+ procedure Str_Concat_Bounds_9
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7, S8, S9 : String)
+ is
+ begin
+ System.Concat_8.Str_Concat_Bounds_8
+ (Lo, Hi, S2, S3, S4, S5, S6, S7, S8, S9);
+
+ if S1 /= "" then
+ Hi := S1'Last + Hi - Lo + 1;
+ Lo := S1'First;
+ end if;
+ end Str_Concat_Bounds_9;
+
end System.Concat_9;
diff --git a/gcc/ada/s-conca9.ads b/gcc/ada/s-conca9.ads
index 31b1263df81..1890c90e155 100644
--- a/gcc/ada/s-conca9.ads
+++ b/gcc/ada/s-conca9.ads
@@ -40,8 +40,15 @@ package System.Concat_9 is
(R : out String;
S1, S2, S3, S4, S5, S6, S7, S8, S9 : String);
-- Performs the operation R := S1 & S2 & S3 & S4 & S5 & S6 & S7 & S8 & S9.
- -- The bounds of R are known to be correct, so no bounds checks are
- -- required, and it is known that none of the input operands overlaps R. No
+ -- The bounds of R are known to be correct (usually set by a call to the
+ -- Str_Concat_Bounds_9 procedure below), so no bounds checks are required,
+ -- and it is known that none of the input operands overlaps R. No
-- assumptions can be made about the lower bounds of any of the operands.
+ procedure Str_Concat_Bounds_9
+ (Lo, Hi : out Natural;
+ S1, S2, S3, S4, S5, S6, S7, S8, S9 : String);
+ -- Assigns to Lo..Hi the bounds of the result of concatenating the nine
+ -- given strings, following the rules in the RM regarding null operands.
+
end System.Concat_9;