Patchwork [Ada] Delete SCIL files in CodePeer mode

login
register
mail settings
Submitter Arnaud Charlet
Date Aug. 31, 2011, 9:24 a.m.
Message ID <20110831092452.GA16529@adacore.com>
Download mbox | patch
Permalink /patch/112481/
State New
Headers show

Comments

Arnaud Charlet - Aug. 31, 2011, 9:24 a.m.
When generating scil files (-gnatcC), we want to remove any old scil files
corresponding to the main unit being compiled in case of errors, to avoid
re-analyzing these old scil files. 

Tested on x86_64-pc-linux-gnu, committed on trunk

2011-08-31  Arnaud Charlet  <charlet@adacore.com>

	* comperr.adb, comperr.ads, gnat1drv.adb (Delete_SCIL_Files): New
	subprogram.
	(Compiler_Abort, Gnat1drv): Call Delete_SCIL_Files in codepeer mode in
	case of a compilation error.

Patch

Index: comperr.adb
===================================================================
--- comperr.adb	(revision 178358)
+++ comperr.adb	(working copy)
@@ -6,7 +6,7 @@ 
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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- --
@@ -27,20 +27,23 @@ 
 --  error is detected. Calls to these routines cause termination of the
 --  current compilation with appropriate error output.
 
-with Atree;    use Atree;
-with Debug;    use Debug;
-with Errout;   use Errout;
-with Gnatvsn;  use Gnatvsn;
-with Namet;    use Namet;
-with Opt;      use Opt;
-with Osint;    use Osint;
-with Output;   use Output;
-with Sinput;   use Sinput;
-with Sprint;   use Sprint;
-with Sdefault; use Sdefault;
-with Targparm; use Targparm;
-with Treepr;   use Treepr;
-with Types;    use Types;
+with Atree;         use Atree;
+with Debug;         use Debug;
+with Errout;        use Errout;
+with Gnatvsn;       use Gnatvsn;
+with Lib;           use Lib;
+with Namet;         use Namet;
+with Opt;           use Opt;
+with Osint;         use Osint;
+with Output;        use Output;
+with Sinfo;         use Sinfo;
+with Sinput;        use Sinput;
+with Sprint;        use Sprint;
+with Sdefault;      use Sdefault;
+with System.OS_Lib; use System.OS_Lib;
+with Targparm;      use Targparm;
+with Treepr;        use Treepr;
+with Types;         use Types;
 
 with Ada.Exceptions; use Ada.Exceptions;
 
@@ -144,6 +147,10 @@ 
          end if;
       end if;
 
+      if CodePeer_Mode then
+         Delete_SCIL_Files;
+      end if;
+
       --  If any errors have already occurred, then we guess that the abort
       --  may well be caused by previous errors, and we don't make too much
       --  fuss about it, since we want to let programmer fix the errors first.
@@ -422,9 +429,40 @@ 
          Source_Dump;
          raise Unrecoverable_Error;
       end if;
-
    end Compiler_Abort;
 
+   -----------------------
+   -- Delete_SCIL_Files --
+   -----------------------
+
+   procedure Delete_SCIL_Files is
+      Main    : Node_Id;
+      Success : Boolean;
+      pragma Unreferenced (Success);
+   begin
+      --  If parsing was not successful, no Main_Unit is available, so return
+      --  immediately.
+
+      if Main_Source_File = No_Source_File then
+         return;
+      end if;
+
+      --  Retrieve unit name, and remove old versions of SCIL/<unit>.scil and
+      --  SCIL/<unit>__body.scil
+
+      Main := Unit (Cunit (Main_Unit));
+
+      if Nkind (Main) = N_Subprogram_Body then
+         Get_Name_String (Chars (Defining_Unit_Name (Specification (Main))));
+      else
+         Get_Name_String (Chars (Defining_Unit_Name (Main)));
+      end if;
+
+      Delete_File ("SCIL/" & Name_Buffer (1 .. Name_Len) & ".scil", Success);
+      Delete_File
+        ("SCIL/" & Name_Buffer (1 .. Name_Len) & "__body.scil", Success);
+   end Delete_SCIL_Files;
+
    -----------------
    -- Repeat_Char --
    -----------------
Index: comperr.ads
===================================================================
--- comperr.ads	(revision 178358)
+++ comperr.ads	(working copy)
@@ -6,7 +6,7 @@ 
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2007, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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- --
@@ -50,6 +50,9 @@ 
    --  end exception (with possible message stored in TSD.Current_Excep,
    --  and negative (an unused value) for a GCC abort.
 
+   procedure Delete_SCIL_Files;
+   --  Delete SCIL files associated with the main unit
+
    ------------------------------
    -- Use of gnat_bug.box File --
    ------------------------------
Index: gnat1drv.adb
===================================================================
--- gnat1drv.adb	(revision 178358)
+++ gnat1drv.adb	(working copy)
@@ -842,6 +842,10 @@ 
             Tree_Gen;
          end if;
 
+         if CodePeer_Mode then
+            Comperr.Delete_SCIL_Files;
+         end if;
+
          Errout.Finalize (Last_Call => True);
          Exit_Program (E_Errors);
       end if;