[Ada] fix handling of -o switch
Arnaud Charlet
charlet@adacore.com
Thu Jun 14 09:32:00 GMT 2007
Tested on i686-linux, committed on trunk
When specifying an object file to the compiler using switch -o, it was
possible to specify a base name different from the base name of the
source being compiled. This patch ensures that the base name of the
specified object file is the same as the base name of the source being
compiled.
The test for this is to attempt to compile a source titi.ads with:
gcc -c -o ouistiti.o titi.ads
The compilation should fail with
gnat1: incorrect object file name
2007-06-06 Vincent Celier <celier@adacore.com>
* osinte-c.ads, osint-c.adb (Set_Library_Info_Name): Fail if base name
of specified object file is not equal to base name of source.
-------------- next part --------------
Index: osint-c.ads
===================================================================
--- osint-c.ads (revision 124068)
+++ osint-c.ads (working copy)
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2007, 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- --
@@ -91,9 +91,10 @@ package Osint.C is
-- procedures in appropriate variables in Repinfo, so that they can
-- be called indirectly without creating a dependence.
- procedure Create_Repinfo_File (Src : File_Name_Type);
+ procedure Create_Repinfo_File (Src : String);
-- Given the simple name of a source file, this routine creates the
- -- corresponding file to hold representation information
+ -- corresponding file to hold representation information. Note that the
+ -- call destroys the contents of Name_Buffer and Name_Len.
procedure Write_Repinfo_Line (Info : String);
-- Writes contents of given string as next line of the current debug
Index: osint-c.adb
===================================================================
--- osint-c.adb (revision 124068)
+++ osint-c.adb (working copy)
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2006, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2007, 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- --
@@ -25,7 +25,6 @@
------------------------------------------------------------------------------
with Hostparm;
-with Namet; use Namet;
with Opt; use Opt;
with Tree_IO; use Tree_IO;
@@ -49,10 +48,10 @@ package body Osint.C is
-- repinfo/list file where xxx is specified extension.
procedure Set_Library_Info_Name;
- -- Sets a default ali file name from the main compiler source name.
+ -- Sets a default ALI file name from the main compiler source name.
-- This is used by Create_Output_Library_Info, and by the version of
-- Read_Library_Info that takes a default file name. The name is in
- -- Name_Buffer (with length in Name_Len) on return from the call
+ -- Name_Buffer (with length in Name_Len) on return from the call.
----------------------
-- Close_Debug_File --
@@ -190,6 +189,7 @@ package body Osint.C is
begin
if S (S'First) = '.' then
F := Create_Auxiliary_File (Current_Main, S (S'First + 1 .. S'Last));
+
else
Name_Buffer (1 .. S'Length) := S;
Name_Len := S'Length + 1;
@@ -212,10 +212,13 @@ package body Osint.C is
-- Create_Repinfo_File --
-------------------------
- procedure Create_Repinfo_File (Src : File_Name_Type) is
- S : constant File_Name_Type := Create_Auxiliary_File (Src, "rep");
- pragma Warnings (Off, S);
- begin
+ procedure Create_Repinfo_File (Src : String) is
+ Discard : File_Name_Type;
+ pragma Warnings (Off, Discard);
+ begin
+ Name_Buffer (1 .. Src'Length) := Src;
+ Name_Len := Src'Length;
+ Discard := Create_Auxiliary_File (Name_Find, "rep");
return;
end Create_Repinfo_File;
@@ -313,8 +316,8 @@ package body Osint.C is
-- Remove extension preparing to replace it
declare
- Name : constant String := Name_Buffer (1 .. Dot_Index);
- Len : constant Natural := Dot_Index;
+ Name : constant String := Name_Buffer (1 .. Dot_Index);
+ First : Positive;
begin
Name_Buffer (1 .. Output_Object_File_Name'Length) :=
@@ -328,13 +331,24 @@ package body Osint.C is
end if;
end loop;
- -- Dot_Index should be zero now (we check for extension elsewhere)
+ -- Dot_Index should not be zero now (we check for extension
+ -- elsewhere).
pragma Assert (Dot_Index /= 0);
+ -- Look for first character of file name
+
+ First := Dot_Index;
+ while First > 1
+ and then Name_Buffer (First - 1) /= Directory_Separator
+ and then Name_Buffer (First - 1) /= '/'
+ loop
+ First := First - 1;
+ end loop;
+
-- Check name of object file is what we expect
- if Name /= Name_Buffer (Dot_Index - Len + 1 .. Dot_Index) then
+ if Name /= Name_Buffer (First .. Dot_Index) then
Fail ("incorrect object file name");
end if;
end;
@@ -471,5 +485,4 @@ begin
Opt.Close_List_File_Access := Close_List_File'Access;
Set_Program (Compiler);
-
end Osint.C;
More information about the Gcc-patches
mailing list