From patchwork Fri Sep 8 09:25:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Charlet X-Patchwork-Id: 811418 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-461709-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="n4cE9DQk"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xpX3w6Fy5z9rxm for ; Fri, 8 Sep 2017 19:25:32 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=TDT7NuDdJEu+7Qf86YV9oF0L9V/PCzR2SMzZSJ85s4xT14mt2X j9P0/nPpo4isCJFHG6ZUdIcDJkyi+QQU+oC/taadkJsQPhqAmeD75DQAajnv6707 +Vy+PeFLhphLuJYL/VvK2BE1rOtV8ADks7cwROFkPxBUcnk4ceV+ZdWIs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=8uKenwkfje8Mj/MygplX8FPpjws=; b=n4cE9DQkLAJjM16QsDPo tg2N9H8EAQ3O5yTW0w5sVKMxF8Wn2uqWSR4wmJkdtZtn/o32WI3N+wwXFEbnZWr1 IdlC/FfPsBgtNugHWrTu5rSJ6LoOki/fGyUyRsx61TjwPkMgt7nOglQhzKDdHG4z Iguyu7QvlRmmzcnN4q+Aw0s= Received: (qmail 95354 invoked by alias); 8 Sep 2017 09:25:23 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 95069 invoked by uid 89); 8 Sep 2017 09:25:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 08 Sep 2017 09:25:16 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 054315619D; Fri, 8 Sep 2017 05:25:15 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id Q45LlDuTO8mV; Fri, 8 Sep 2017 05:25:14 -0400 (EDT) Received: from tron.gnat.com (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) by rock.gnat.com (Postfix) with ESMTP id E5F6756126; Fri, 8 Sep 2017 05:25:14 -0400 (EDT) Received: by tron.gnat.com (Postfix, from userid 4192) id E24B7505; Fri, 8 Sep 2017 05:25:14 -0400 (EDT) Date: Fri, 8 Sep 2017 05:25:14 -0400 From: Arnaud Charlet To: gcc-patches@gcc.gnu.org Cc: Eric Botcazou Subject: [Ada] Implement extended version of -gnatR for record sub-components Message-ID: <20170908092514.GA16335@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) This adds a -gnatRe variant to the -gnatR switch, which displays extended representation information for components of records that are themselves records by recursing on the layout of sub-components. This also makes the compiler accept -gnatR0, as documented in the User Guide. For the following package: pragma No_Component_Reordering; package P is type Int7 is mod 2 ** 7; for Int7'Size use 7; type Rec1 is record I1 : Integer; I2 : Int7; B1 : Boolean; B2 : Boolean; end record; pragma Pack (Rec1); type Rec2 is record B : Boolean; C : Character; R1 : Rec1; I : Integer; end record; pragma Pack (Rec2); type Rec3 is record B1 : Boolean; B2 : Boolean; R2 : Rec2; C : Character; end record; pragma Pack (Rec3); end P; the compiler must give the following information with -gnatRe: Representation information for unit P (spec) for Rec1'Object_Size use 48; for Rec1'Value_Size use 41; for Rec1'Alignment use 1; for Rec1 use record I1 at 0 range 0 .. 31; I2 at 4 range 0 .. 6; B1 at 4 range 7 .. 7; B2 at 5 range 0 .. 0; end record; for Rec2'Object_Size use 88; for Rec2'Value_Size use 82; for Rec2'Alignment use 1; for Rec2 use record B at 0 range 0 .. 0; C at 0 range 1 .. 8; R1.I1 at 1 range 1 .. 32; R1.I2 at 5 range 1 .. 7; R1.B1 at 6 range 0 .. 0; R1.B2 at 6 range 1 .. 1; I at 6 range 2 .. 33; end record; for Rec3'Object_Size use 96; for Rec3'Value_Size use 92; for Rec3'Alignment use 1; for Rec3 use record B1 at 0 range 0 .. 0; B2 at 0 range 1 .. 1; R2.B at 0 range 2 .. 2; R2.C at 0 range 3 .. 10; R2.R1.I1 at 1 range 3 .. 34; R2.R1.I2 at 5 range 3 .. 9; R2.R1.B1 at 6 range 2 .. 2; R2.R1.B2 at 6 range 3 .. 3; R2.I at 6 range 4 .. 35; C at 10 range 4 .. 11; end record; Tested on x86_64-pc-linux-gnu, committed on trunk 2017-09-08 Eric Botcazou * debug.adb (dA): Adjust comment. * gnat1drv.adb (Gnat1drv): Likewise. * opt.ads (List_Representation_Info_Extended): New variable. * repinfo.adb (List_Record_Info): Split implementation into... (Compute_Max_Length): ...this. Recurse on records if requested. (List_Record_Layout): Likewise. * switch-c.adb (Scan_Front_End_Switches) <'R'>: Use case statement, accept '0' and set List_Representation_Info_Extended on 'e'. * usage.adb (Usage): Document new -gnatRe variant. Index: switch-c.adb =================================================================== --- switch-c.adb (revision 251863) +++ switch-c.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2001-2016, Free Software Foundation, Inc. -- +-- Copyright (C) 2001-2017, 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- -- @@ -1143,19 +1143,24 @@ while Ptr <= Max loop C := Switch_Chars (Ptr); - if C in '1' .. '3' then + case C is + + when '0' .. '3' => List_Representation_Info := Character'Pos (C) - Character'Pos ('0'); - elsif Switch_Chars (Ptr) = 's' then + when 's' => List_Representation_Info_To_File := True; - elsif Switch_Chars (Ptr) = 'm' then + when 'm' => List_Representation_Info_Mechanisms := True; - else + when 'e' => + List_Representation_Info_Extended := True; + + when others => Bad_Switch ("-gnatR" & Switch_Chars (Ptr .. Max)); - end if; + end case; Ptr := Ptr + 1; end loop; Index: usage.adb =================================================================== --- usage.adb (revision 251863) +++ usage.adb (working copy) @@ -392,7 +392,7 @@ Write_Switch_Char ("R?"); Write_Line - ("List rep info (?=0/1/2/3/m for none/types/all/variable/mechanisms)"); + ("List rep info (?=0/1/2/3/e/m for none/types/all/symbolic/ext/mech)"); Write_Switch_Char ("R?s"); Write_Line ("List rep info to file.rep instead of standard output"); Index: debug.adb =================================================================== --- debug.adb (revision 251872) +++ debug.adb (working copy) @@ -357,7 +357,7 @@ -- information for all internal type and object entities, as well -- as all user defined type and object entities including private -- and incomplete types. This debug switch also automatically sets - -- the equivalent of -gnatR3m. + -- the equivalent of -gnatRm. -- dB Output debug encodings for types and variants. See Exp_Dbug for -- exact form of the generated output. Index: gnat1drv.adb =================================================================== --- gnat1drv.adb (revision 251869) +++ gnat1drv.adb (working copy) @@ -540,7 +540,7 @@ Configurable_Run_Time_Mode := True; end if; - -- Set -gnatR3m mode if debug flag A set + -- Set -gnatRm mode if debug flag A set if Debug_Flag_AA then Back_Annotate_Rep_Info := True; Index: repinfo.adb =================================================================== --- repinfo.adb (revision 251869) +++ repinfo.adb (working copy) @@ -854,213 +854,327 @@ ---------------------- procedure List_Record_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean) is - Comp : Entity_Id; - Cfbit : Uint; - Sunit : Uint; - Max_Name_Length : Natural; - Max_Suni_Length : Natural; + procedure Compute_Max_Length + (Ent : Entity_Id; + Starting_Position : Uint := Uint_0; + Starting_First_Bit : Uint := Uint_0; + Prefix_Length : Natural := 0); + -- Internal recursive procedure to compute the max length - begin - Blank_Line; - List_Type_Info (Ent); + procedure List_Record_Layout + (Ent : Entity_Id; + Starting_Position : Uint := Uint_0; + Starting_First_Bit : Uint := Uint_0; + Prefix : String := ""); + -- Internal recursive procedure to display the layout - Write_Str ("for "); - List_Name (Ent); - Write_Line (" use record"); + Max_Name_Length : Natural := 0; + Max_Spos_Length : Natural := 0; - -- First loop finds out max line length and max starting position - -- length, for the purpose of lining things up nicely. + ------------------------ + -- Compute_Max_Length -- + ------------------------ - Max_Name_Length := 0; - Max_Suni_Length := 0; + procedure Compute_Max_Length + (Ent : Entity_Id; + Starting_Position : Uint := Uint_0; + Starting_First_Bit : Uint := Uint_0; + Prefix_Length : Natural := 0) + is + Comp : Entity_Id; - Comp := First_Component_Or_Discriminant (Ent); - while Present (Comp) loop + begin + Comp := First_Component_Or_Discriminant (Ent); + while Present (Comp) loop - -- Skip discriminant in unchecked union (since it is not there!) + -- Skip discriminant in unchecked union (since it is not there!) - if Ekind (Comp) = E_Discriminant - and then Is_Unchecked_Union (Ent) - then - null; + if Ekind (Comp) = E_Discriminant + and then Is_Unchecked_Union (Ent) + then + goto Continue; + end if; - -- All other cases + -- All other cases - else - Get_Decoded_Name_String (Chars (Comp)); - Max_Name_Length := Natural'Max (Max_Name_Length, Name_Len); + declare + Ctyp : constant Entity_Id := Underlying_Type (Etype (Comp)); + Bofs : constant Uint := Component_Bit_Offset (Comp); + Npos : Uint; + Fbit : Uint; + Spos : Uint; + Sbit : Uint; + Name_Length : Natural; + begin + Get_Decoded_Name_String (Chars (Comp)); + Name_Length := Prefix_Length + Name_Len; - Cfbit := Component_Bit_Offset (Comp); + if Rep_Not_Constant (Bofs) then - if Rep_Not_Constant (Cfbit) then + -- If the record is not packed, then we know that all fields + -- whose position is not specified have starting normalized + -- bit position of zero. - -- If the record is not packed, then we know that all fields - -- whose position is not specified have a starting normalized - -- bit position of zero. + if Unknown_Normalized_First_Bit (Comp) + and then not Is_Packed (Ent) + then + Set_Normalized_First_Bit (Comp, Uint_0); + end if; - if Unknown_Normalized_First_Bit (Comp) - and then not Is_Packed (Ent) - then - Set_Normalized_First_Bit (Comp, Uint_0); - end if; + UI_Image_Length := 2; -- For "??" marker + else + Npos := Bofs / SSU; + Fbit := Bofs mod SSU; - UI_Image_Length := 2; -- For "??" marker - else - -- Complete annotation in case not done + -- Complete annotation in case not done - if Unknown_Normalized_First_Bit (Comp) then - Set_Normalized_Position (Comp, Cfbit / SSU); - Set_Normalized_First_Bit (Comp, Cfbit mod SSU); + if Unknown_Normalized_First_Bit (Comp) then + Set_Normalized_Position (Comp, Npos); + Set_Normalized_First_Bit (Comp, Fbit); + end if; + + Spos := Starting_Position + Npos; + Sbit := Starting_First_Bit + Fbit; + if Sbit >= SSU then + Spos := Spos + 1; + Sbit := Sbit - SSU; + end if; + + -- If extended information is requested, recurse fully into + -- record components, i.e. skip the outer level. + + if List_Representation_Info_Extended + and then Is_Record_Type (Ctyp) + then + Compute_Max_Length (Ctyp, Spos, Sbit, Name_Length + 1); + goto Continue; + end if; + + UI_Image (Spos); end if; - Sunit := Cfbit / SSU; - UI_Image (Sunit); - end if; + Max_Name_Length := Natural'Max (Max_Name_Length, Name_Length); + Max_Spos_Length := + Natural'Max (Max_Spos_Length, UI_Image_Length); + end; - Max_Suni_Length := Natural'Max (Max_Suni_Length, UI_Image_Length); - end if; + <> + Next_Component_Or_Discriminant (Comp); + end loop; + end Compute_Max_Length; - Next_Component_Or_Discriminant (Comp); - end loop; + ------------------------ + -- List_Record_Layout -- + ------------------------ - -- Second loop does actual output based on those values + procedure List_Record_Layout + (Ent : Entity_Id; + Starting_Position : Uint := Uint_0; + Starting_First_Bit : Uint := Uint_0; + Prefix : String := "") + is + Comp : Entity_Id; - Comp := First_Component_Or_Discriminant (Ent); - while Present (Comp) loop + begin + Comp := First_Component_Or_Discriminant (Ent); + while Present (Comp) loop - -- Skip discriminant in unchecked union (since it is not there!) + -- Skip discriminant in unchecked union (since it is not there!) - if Ekind (Comp) = E_Discriminant - and then Is_Unchecked_Union (Ent) - then - goto Continue; - end if; + if Ekind (Comp) = E_Discriminant + and then Is_Unchecked_Union (Ent) + then + goto Continue; + end if; - -- All other cases + -- All other cases - declare - Esiz : constant Uint := Esize (Comp); - Bofs : constant Uint := Component_Bit_Offset (Comp); - Npos : constant Uint := Normalized_Position (Comp); - Fbit : constant Uint := Normalized_First_Bit (Comp); - Lbit : Uint; + declare + Ctyp : constant Entity_Id := Underlying_Type (Etype (Comp)); + Esiz : constant Uint := Esize (Comp); + Bofs : constant Uint := Component_Bit_Offset (Comp); + Npos : constant Uint := Normalized_Position (Comp); + Fbit : constant Uint := Normalized_First_Bit (Comp); + Spos : Uint; + Sbit : Uint; + Lbit : Uint; - begin - Write_Str (" "); - Get_Decoded_Name_String (Chars (Comp)); - Set_Casing (Unit_Casing); - Write_Str (Name_Buffer (1 .. Name_Len)); + begin + Get_Decoded_Name_String (Chars (Comp)); + Set_Casing (Unit_Casing); - for J in 1 .. Max_Name_Length - Name_Len loop - Write_Char (' '); - end loop; + -- If extended information is requested, recurse fully into + -- record components, i.e. skip the outer level. - Write_Str (" at "); + if List_Representation_Info_Extended + and then Is_Record_Type (Ctyp) + and then Known_Static_Normalized_Position (Comp) + and then Known_Static_Normalized_First_Bit (Comp) + then + Spos := Starting_Position + Npos; + Sbit := Starting_First_Bit + Fbit; + if Sbit >= SSU then + Spos := Spos + 1; + Sbit := Sbit - SSU; + end if; + List_Record_Layout (Ctyp, + Spos, Sbit, Prefix & Name_Buffer (1 .. Name_Len) & "."); + goto Continue; + end if; - if Known_Static_Normalized_Position (Comp) then - UI_Image (Npos); - Spaces (Max_Suni_Length - UI_Image_Length); - Write_Str (UI_Image_Buffer (1 .. UI_Image_Length)); + Write_Str (" "); + Write_Str (Prefix); + Write_Str (Name_Buffer (1 .. Name_Len)); - elsif Known_Component_Bit_Offset (Comp) - and then List_Representation_Info = 3 - then - Spaces (Max_Suni_Length - 2); - Write_Str ("bit offset"); - Write_Val (Bofs, Paren => True); - Write_Str (" size in bits = "); - Write_Val (Esiz, Paren => True); - Write_Eol; - goto Continue; + for J in 1 .. Max_Name_Length - Prefix'Length - Name_Len loop + Write_Char (' '); + end loop; - elsif Known_Normalized_Position (Comp) - and then List_Representation_Info = 3 - then - Spaces (Max_Suni_Length - 2); - Write_Val (Npos); + Write_Str (" at "); - else - -- For the packed case, we don't know the bit positions if we - -- don't know the starting position. + if Known_Static_Normalized_Position (Comp) then + Spos := Starting_Position + Npos; + Sbit := Starting_First_Bit + Fbit; + if Sbit >= SSU then + Spos := Spos + 1; + end if; + UI_Image (Spos); + Spaces (Max_Spos_Length - UI_Image_Length); + Write_Str (UI_Image_Buffer (1 .. UI_Image_Length)); - if Is_Packed (Ent) then - Write_Line ("?? range ? .. ??;"); + elsif Known_Component_Bit_Offset (Comp) + and then List_Representation_Info = 3 + then + Spaces (Max_Spos_Length - 2); + Write_Str ("bit offset"); + if Starting_Position /= Uint_0 + or else Starting_First_Bit /= Uint_0 + then + Write_Char (' '); + UI_Write (Starting_Position * SSU + Starting_First_Bit); + Write_Str (" +"); + end if; + Write_Val (Bofs, Paren => True); + Write_Str (" size in bits = "); + Write_Val (Esiz, Paren => True); + Write_Eol; goto Continue; - -- Otherwise we can continue + elsif Known_Normalized_Position (Comp) + and then List_Representation_Info = 3 + then + Spaces (Max_Spos_Length - 2); + if Starting_Position /= Uint_0 then + Write_Char (' '); + UI_Write (Starting_Position); + Write_Str (" +"); + end if; + Write_Val (Npos); else - Write_Str ("??"); - end if; - end if; + -- For the packed case, we don't know the bit positions if + -- we don't know the starting position. - Write_Str (" range "); - UI_Write (Fbit); - Write_Str (" .. "); + if Is_Packed (Ent) then + Write_Line ("?? range ? .. ??;"); + goto Continue; - -- Allowing Uint_0 here is an annoying special case. Really this - -- should be a fine Esize value but currently it means unknown, - -- except that we know after gigi has back annotated that a size - -- of zero is real, since otherwise gigi back annotates using - -- No_Uint as the value to indicate unknown). + -- Otherwise we can continue - if (Esize (Comp) = Uint_0 or else Known_Static_Esize (Comp)) - and then Known_Static_Normalized_First_Bit (Comp) - then - Lbit := Fbit + Esiz - 1; + else + Write_Str ("??"); + end if; + end if; - if Lbit < 10 then - Write_Char (' '); + Write_Str (" range "); + Sbit := Starting_First_Bit + Fbit; + if Sbit >= SSU then + Sbit := Sbit - SSU; end if; + UI_Write (Sbit); + Write_Str (" .. "); - UI_Write (Lbit); + -- Allowing Uint_0 here is an annoying special case. Really + -- this should be a fine Esize value but currently it means + -- unknown, except that we know after gigi has back annotated + -- that a size of zero is real, since otherwise gigi back + -- annotates using No_Uint as the value to indicate unknown). - -- The test for Esize (Comp) not Uint_0 here is an annoying - -- special case. Officially a value of zero for Esize means - -- unknown, but here we use the fact that we know that gigi - -- annotates Esize with No_Uint, not Uint_0. Really everyone - -- should use No_Uint??? + if (Esize (Comp) = Uint_0 or else Known_Static_Esize (Comp)) + and then Known_Static_Normalized_First_Bit (Comp) + then + Lbit := Sbit + Esiz - 1; - elsif List_Representation_Info < 3 - or else (Esize (Comp) /= Uint_0 and then Unknown_Esize (Comp)) - then - Write_Str ("??"); + if Lbit < 10 then + Write_Char (' '); + end if; - -- List_Representation >= 3 and Known_Esize (Comp) + UI_Write (Lbit); - else - Write_Val (Esiz, Paren => True); + -- The test for Esize (Comp) not Uint_0 here is an annoying + -- special case. Officially a value of zero for Esize means + -- unknown, but here we use the fact that we know that gigi + -- annotates Esize with No_Uint, not Uint_0. Really everyone + -- should use No_Uint??? - -- If in front end layout mode, then dynamic size is stored - -- in storage units, so renormalize for output + elsif List_Representation_Info < 3 + or else (Esize (Comp) /= Uint_0 and then Unknown_Esize (Comp)) + then + Write_Str ("??"); - if not Back_End_Layout then - Write_Str (" * "); - Write_Int (SSU); - end if; + -- List_Representation >= 3 and Known_Esize (Comp) - -- Add appropriate first bit offset + else + Write_Val (Esiz, Paren => True); - if Fbit = 0 then - Write_Str (" - 1"); + -- If in front end layout mode, then dynamic size is stored + -- in storage units, so renormalize for output - elsif Fbit = 1 then - null; + if not Back_End_Layout then + Write_Str (" * "); + Write_Int (SSU); + end if; - else - Write_Str (" + "); - Write_Int (UI_To_Int (Fbit) - 1); + -- Add appropriate first bit offset + + if Sbit = 0 then + Write_Str (" - 1"); + + elsif Sbit = 1 then + null; + + else + Write_Str (" + "); + Write_Int (UI_To_Int (Sbit) - 1); + end if; end if; - end if; - Write_Line (";"); - end; + Write_Line (";"); + end; - <> - Next_Component_Or_Discriminant (Comp); - end loop; + <> + Next_Component_Or_Discriminant (Comp); + end loop; + end List_Record_Layout; + begin + Blank_Line; + List_Type_Info (Ent); + + Write_Str ("for "); + List_Name (Ent); + Write_Line (" use record"); + + -- First find out max line length and max starting position + -- length, for the purpose of lining things up nicely. + + Compute_Max_Length (Ent); + + -- Then do actual output based on those values + + List_Record_Layout (Ent); + Write_Line ("end record;"); List_Scalar_Storage_Order (Ent, Bytes_Big_Endian); Index: opt.ads =================================================================== --- opt.ads (revision 251863) +++ opt.ads (working copy) @@ -982,6 +982,11 @@ -- Set true by -gnatRm switch. Causes information on mechanisms to be -- included in the representation output information. + List_Representation_Info_Extended : Boolean := False; + -- GNAT + -- Set true by -gnatRe switch. Causes extended information for record types + -- to be included in the representation output information. + List_Preprocessing_Symbols : Boolean := False; -- GNAT, GNATPREP -- Set to True if symbols for preprocessing a source are to be listed