[Ada] Check for attempt to bind GNATprove files

Arnaud Charlet charlet@adacore.com
Fri Oct 10 12:22:00 GMT 2014


If one or more objects is compiled in GNATprove mode (either by using
GNATprove directly, or by using -gnatd.F), then the ALI file is marked
and gnatbind will exit with a message as shown here. Given:

     1. procedure linkdf is
     2. begin
     3.    null;
     4. end;

If we first compile this with

  gcc -c linkdf.adb -gnatd.F

then we try to do a gnatmake, we get

error: one or more files compiled in GNATprove mode
gnatmake: *** bind failed.

Previously this was not detected and the linker bombed
with peculiar error messages.

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

2014-10-10  Robert Dewar  <dewar@adacore.com>

	* ali.adb (Scan_ALI): Read and process new GP flag on ALI P line.
	* ali.ads (GNATprove_Mode): New component in ALI table.
	(GNATprove_Mode_Specified): New global.
	* gnatbind.adb (Gnatbind): Give fatal error if any file compiled
	in GNATProve mode.
	* lib-writ.ads, lib-writ.adb (GP): New flag on P line for
	GNATProve_Mode.

-------------- next part --------------
Index: lib-writ.adb
===================================================================
--- lib-writ.adb	(revision 216063)
+++ lib-writ.adb	(working copy)
@@ -1153,6 +1153,10 @@
          end if;
       end if;
 
+      if GNATprove_Mode then
+         Write_Info_Str (" GP");
+      end if;
+
       if Partition_Elaboration_Policy /= ' ' then
          Write_Info_Str  (" E");
          Write_Info_Char (Partition_Elaboration_Policy);
Index: lib-writ.ads
===================================================================
--- lib-writ.ads	(revision 216063)
+++ lib-writ.ads	(working copy)
@@ -192,6 +192,9 @@
    --              the units in this file, where x is the first character
    --              (upper case) of the policy name (e.g. 'C' for Concurrent).
 
+   --         GP   Set if this compilation was done in GNATprove mode, either
+   --              from direct use of GNATprove, or from use of -gnatdF.
+
    --         Lx   A valid Locking_Policy pragma applies to all the units in
    --              this file, where x is the first character (upper case) of
    --              the policy name (e.g. 'C' for Ceiling_Locking).
@@ -200,7 +203,9 @@
    --              were not compiled to produce an object. This can occur as a
    --              result of the use of -gnatc, or if no object can be produced
    --              (e.g. when a package spec is compiled instead of the body,
-   --              or a subunit on its own).
+   --              or a subunit on its own). Note that in GNATprove mode, we
+   --              do produce an object. The object is not suitable for binding
+   --              and linking, but we do not set NO, instead we set GP.
 
    --         NR   No_Run_Time. Indicates that a pragma No_Run_Time applies
    --              to all units in the file.
Index: ali.adb
===================================================================
--- ali.adb	(revision 216063)
+++ ali.adb	(working copy)
@@ -111,6 +111,7 @@
       Locking_Policy_Specified               := ' ';
       No_Normalize_Scalars_Specified         := False;
       No_Object_Specified                    := False;
+      GNATprove_Mode_Specified               := False;
       Normalize_Scalars_Specified            := False;
       Partition_Elaboration_Policy_Specified := ' ';
       Queuing_Policy_Specified               := ' ';
@@ -875,6 +876,7 @@
         First_Sdep                   => No_Sdep_Id,
         First_Specific_Dispatching   => Specific_Dispatching.Last + 1,
         First_Unit                   => No_Unit_Id,
+        GNATprove_Mode               => False,
         Last_Interrupt_State         => Interrupt_States.Last,
         Last_Sdep                    => No_Sdep_Id,
         Last_Specific_Dispatching    => Specific_Dispatching.Last,
@@ -1089,6 +1091,13 @@
                ALIs.Table (Id).Partition_Elaboration_Policy :=
                  Partition_Elaboration_Policy_Specified;
 
+            --  Processing for GP
+
+            elsif C = 'G' then
+               Checkc ('P');
+               GNATprove_Mode_Specified := True;
+               ALIs.Table (Id).GNATprove_Mode := True;
+
             --  Processing for Lx
 
             elsif C = 'L' then
Index: ali.ads
===================================================================
--- ali.ads	(revision 216063)
+++ ali.ads	(working copy)
@@ -176,6 +176,11 @@
       --  always be set as well in this case. Not set if 'P' appears in
       --  Ignore_Lines.
 
+      GNATprove_Mode : Boolean;
+      --  Set to True if ALI and object file produced in GNATprove_Mode as
+      --  signalled by GP appearing on the P line. Not set if 'P' appears in
+      --  Ignore_Lines.
+
       No_Object : Boolean;
       --  Set to True if no object file generated. Not set if 'P' appears in
       --  Ignore_Lines.
@@ -465,6 +470,9 @@
    --  Set to False by Initialize_ALI. Set to True if Scan_ALI reads
    --  a unit for which dynamic elaboration checking is enabled.
 
+   GNATprove_Mode_Specified : Boolean := False;
+   --  Set to True if an ali file was produced in GNATprove mode.
+
    Initialize_Scalars_Used : Boolean := False;
    --  Set True if an ali file contains the Initialize_Scalars flag
 
Index: gnatbind.adb
===================================================================
--- gnatbind.adb	(revision 216063)
+++ gnatbind.adb	(working copy)
@@ -776,6 +776,13 @@
          raise Unrecoverable_Error;
       end if;
 
+      --  Quit with message if we had a GNATprove file
+
+      if GNATprove_Mode_Specified then
+         Error_Msg ("one or more files compiled in GNATprove mode");
+         raise Unrecoverable_Error;
+      end if;
+
       --  Output list of ALI files in closure
 
       if Output_ALI_List then


More information about the Gcc-patches mailing list