home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / expander.adb < prev    next >
Text File  |  1996-09-28  |  12KB  |  370 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                             E X P A N D E R                              --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.84 $                             --
  10. --                                                                          --
  11. --        Copyright (c) 1992,1993,1994,1995 NYU, All Rights Reserved        --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. with Atree;     use Atree;
  26. with Debug_A;   use Debug_A;
  27. with Errout;    use Errout;
  28. with Exp_Aggr;  use Exp_Aggr;
  29. with Exp_Attr;  use Exp_Attr;
  30. with Exp_Ch2;   use Exp_Ch2;
  31. with Exp_Ch3;   use Exp_Ch3;
  32. with Exp_Ch4;   use Exp_Ch4;
  33. with Exp_Ch5;   use Exp_Ch5;
  34. with Exp_Ch6;   use Exp_Ch6;
  35. with Exp_Ch7;   use Exp_Ch7;
  36. with Exp_Ch8;   use Exp_Ch8;
  37. with Exp_Ch9;   use Exp_Ch9;
  38. with Exp_Ch11;  use Exp_Ch11;
  39. with Exp_Ch13;  use Exp_Ch13;
  40. with Exp_Prag;  use Exp_Prag;
  41. with Sinfo;     use Sinfo;
  42. with Table;
  43.  
  44. package body Expander is
  45.  
  46.    ----------------
  47.    -- Local Data --
  48.    ----------------
  49.  
  50.    --  The following table is used to save values of the Expander_Active
  51.    --  flag when they are saved by Expander_Mode_Save_And_Set. We use an
  52.    --  extendible table (which is a bit of overkill) because it is easier
  53.    --  than figuring out a maximum value or bothering with range checks!
  54.  
  55.    package Expander_Flags is new Table (
  56.      Table_Component_Type => Boolean,
  57.      Table_Index_Type     => Int,
  58.      Table_Low_Bound      => 0,
  59.      Table_Initial        => 32,
  60.      Table_Increment      => 200,
  61.      Table_Name           => "Expander_Flags");
  62.  
  63.    ------------
  64.    -- Expand --
  65.    ------------
  66.  
  67.    procedure Expand (N : Node_Id) is
  68.    begin
  69.       --  If expander is not active, all we have to do is to set N as Analyzed
  70.  
  71.       if not Expander_Active then
  72.          Set_Analyzed (N, True);
  73.          return;
  74.  
  75.       else
  76.          --  If expander is active, first step is to check for the need to
  77.          --  wrap a transient scope around the node. This insertion happens
  78.          --  before the expansion of the node to ensure that it wraps not
  79.          --  only the node itself but also any nodes that are inserted as
  80.          --  a result of expansion.
  81.  
  82.          if Scope_Is_Transient
  83.            and then N = Node_To_Be_Wrapped
  84.          then
  85.             case Nkind (N) is
  86.                when N_Statement                |
  87.                     N_Procedure_Call_Statement |
  88.                     N_Accept_Statement => Wrap_Transient_Statement (N);
  89.  
  90.                when N_Object_Declaration          |
  91.                     N_Object_Renaming_Declaration |
  92.                     N_Subtype_Declaration => Wrap_Transient_Declaration (N);
  93.  
  94.                when others => Wrap_Transient_Expression (N);
  95.             end case;
  96.  
  97.             --  The node has been expanded as part of the wrap process because
  98.             --  it has to be done before leaving the transient scope. So now
  99.             --  we are finished (i.e. the Wrap routine made the Expand call
  100.             --  in this case)
  101.  
  102.             return;
  103.          end if;
  104.  
  105.          Debug_A_Entry ("expanding  ", N);
  106.  
  107.          --  Processing depends on node kind. For full details on the expansion
  108.          --  activity required in each case, see bodies of corresponding
  109.          --  expand routines
  110.  
  111.          case Nkind (N) is
  112.  
  113.             when N_Abort_Statement =>
  114.                Expand_N_Abort_Statement (N);
  115.  
  116.             when N_Accept_Statement =>
  117.                Expand_N_Accept_Statement (N);
  118.  
  119.             when N_Aggregate =>
  120.                Expand_N_Aggregate (N);
  121.  
  122.             when N_Allocator =>
  123.                Expand_N_Allocator (N);
  124.  
  125.             when N_And_Then =>
  126.                Expand_N_And_Then (N);
  127.  
  128.             when N_Assignment_Statement =>
  129.                Expand_N_Assignment_Statement (N);
  130.  
  131.             when N_Asynchronous_Select =>
  132.                Expand_N_Asynchronous_Select (N);
  133.  
  134.             when N_Attribute_Definition_Clause =>
  135.                Expand_N_Attribute_Definition_Clause (N);
  136.  
  137.             when N_Attribute_Reference =>
  138.                Expand_N_Attribute_Reference (N);
  139.  
  140.             when N_Case_Statement =>
  141.                Expand_N_Case_Statement (N);
  142.  
  143.             when N_Concat_Multiple =>
  144.                Expand_N_Concat_Multiple (N);
  145.  
  146.             when N_Conditional_Entry_Call =>
  147.                Expand_N_Conditional_Entry_Call (N);
  148.  
  149.             when N_Conditional_Expression =>
  150.                Expand_N_Conditional_Expression (N);
  151.  
  152.             when N_Delay_Relative_Statement =>
  153.                Expand_N_Delay_Relative_Statement (N);
  154.  
  155.             when N_Delay_Until_Statement =>
  156.                Expand_N_Delay_Until_Statement (N);
  157.  
  158.             when N_Entry_Body =>
  159.                Expand_N_Entry_Body (N);
  160.  
  161.             when N_Entry_Call_Statement =>
  162.                Expand_N_Entry_Call_Statement (N);
  163.  
  164.             when N_Entry_Declaration =>
  165.                Expand_N_Entry_Declaration (N);
  166.  
  167.             when N_Expanded_Name =>
  168.                Expand_N_Expanded_Name (N);
  169.  
  170.             when N_Extension_Aggregate =>
  171.                Expand_N_Extension_Aggregate (N);
  172.  
  173.             when N_Freeze_Entity =>
  174.                Expand_N_Freeze_Entity (N);
  175.  
  176.             when N_Full_Type_Declaration =>
  177.                Expand_N_Full_Type_Declaration (N);
  178.  
  179.             when N_Function_Call =>
  180.                Expand_N_Function_Call (N);
  181.  
  182.             when N_Handled_Sequence_Of_Statements =>
  183.                Expand_N_Handled_Sequence_Of_Statements (N);
  184.  
  185.             when N_Identifier =>
  186.                Expand_N_Identifier (N);
  187.  
  188.             when N_Indexed_Component =>
  189.                Expand_N_Indexed_Component (N);
  190.  
  191.             when N_If_Statement =>
  192.                Expand_N_If_Statement (N);
  193.  
  194.             when N_In =>
  195.                Expand_N_In (N);
  196.  
  197.             when N_Loop_Statement =>
  198.                Expand_N_Loop_Statement (N);
  199.  
  200.             when N_Not_In =>
  201.                Expand_N_Not_In (N);
  202.  
  203.             when N_Object_Declaration =>
  204.                Expand_N_Object_Declaration (N);
  205.  
  206.             when N_Op_Add =>
  207.                Expand_N_Op_Add (N);
  208.  
  209.             when N_Op_Abs =>
  210.                Expand_N_Op_Abs (N);
  211.  
  212.             when N_Op_And =>
  213.                Expand_N_Op_And (N);
  214.  
  215.             when N_Op_Concat =>
  216.                Expand_N_Op_Concat (N);
  217.  
  218.             when N_Op_Divide =>
  219.                Expand_N_Op_Divide (N);
  220.  
  221.             when N_Op_Eq =>
  222.                Expand_N_Op_Eq (N);
  223.  
  224.             when N_Op_Expon =>
  225.                Expand_N_Op_Expon (N);
  226.  
  227.             when N_Op_Ge =>
  228.                Expand_N_Op_Ge (N);
  229.  
  230.             when N_Op_Gt =>
  231.                Expand_N_Op_Gt (N);
  232.  
  233.             when N_Op_Le =>
  234.                Expand_N_Op_Le (N);
  235.  
  236.             when N_Op_Lt =>
  237.                Expand_N_Op_Lt (N);
  238.  
  239.             when N_Op_Minus =>
  240.                Expand_N_Op_Minus (N);
  241.  
  242.             when N_Op_Mod =>
  243.                Expand_N_Op_Mod (N);
  244.  
  245.             when N_Op_Multiply =>
  246.                Expand_N_Op_Multiply (N);
  247.  
  248.             when N_Op_Ne =>
  249.                Expand_N_Op_Ne (N);
  250.  
  251.             when N_Op_Not =>
  252.                Expand_N_Op_Not (N);
  253.  
  254.             when N_Op_Or =>
  255.                Expand_N_Op_Or (N);
  256.  
  257.             when N_Op_Rem =>
  258.                Expand_N_Op_Rem (N);
  259.  
  260.             when N_Op_Subtract =>
  261.                Expand_N_Op_Subtract (N);
  262.  
  263.             when N_Op_Xor =>
  264.                Expand_N_Op_Xor (N);
  265.  
  266.             when N_Or_Else =>
  267.                Expand_N_Or_Else (N);
  268.  
  269.             when N_Package_Body =>
  270.                Expand_N_Package_Body (N);
  271.  
  272.             when N_Package_Declaration =>
  273.                Expand_N_Package_Declaration (N);
  274.  
  275.             when N_Pragma =>
  276.                Expand_N_Pragma (N);
  277.  
  278.             when N_Procedure_Call_Statement =>
  279.                Expand_N_Procedure_Call_Statement (N);
  280.  
  281.             when N_Protected_Type_Declaration =>
  282.                Expand_N_Protected_Type_Declaration (N);
  283.  
  284.             when N_Protected_Body =>
  285.                Expand_N_Protected_Body (N);
  286.  
  287.             when N_Object_Renaming_Declaration =>
  288.                Expand_N_Object_Renaming_Declaration (N);
  289.  
  290.             when N_Record_Representation_Clause =>
  291.                Expand_N_Record_Representation_Clause (N);
  292.  
  293.             when N_Requeue_Statement =>
  294.                Expand_N_Requeue_Statement (N);
  295.  
  296.             when N_Return_Statement =>
  297.                Expand_N_Return_Statement (N);
  298.  
  299.             when N_Selected_Component =>
  300.                Expand_N_Selected_Component (N);
  301.  
  302.             when N_Selective_Accept =>
  303.                Expand_N_Selective_Accept (N);
  304.  
  305.             when N_Slice =>
  306.                Expand_N_Slice (N);
  307.  
  308.             when N_Subprogram_Body =>
  309.                Expand_N_Subprogram_Body (N);
  310.  
  311.             when N_Single_Task_Declaration =>
  312.                Expand_N_Single_Task_Declaration (N);
  313.  
  314.             when N_Task_Body =>
  315.                Expand_N_Task_Body (N);
  316.  
  317.             when N_Task_Type_Declaration =>
  318.                Expand_N_Task_Type_Declaration (N);
  319.  
  320.             when N_Timed_Entry_Call =>
  321.                Expand_N_Timed_Entry_Call (N);
  322.  
  323.             when N_Type_Conversion =>
  324.                Expand_N_Type_Conversion (N);
  325.  
  326.             when N_Variant_Part =>
  327.                Expand_N_Variant_Part (N);
  328.  
  329.             --  For all other node kinds, no expansion activity is required
  330.  
  331.             when others => null;
  332.  
  333.          end case;
  334.  
  335.          --  Set result as analyzed and then do a possible transient wrap. The
  336.          --  transient wrap must be done after the Analyzed flag is set on, so
  337.          --  that we do not get a recursive attempt to expand the node N.
  338.  
  339.          Set_Analyzed (N);
  340.          Debug_A_Exit ("expanding  ", N, "  (done)");
  341.       end if;
  342.    end Expand;
  343.  
  344.    ---------------------------
  345.    -- Expander_Mode_Restore --
  346.    ---------------------------
  347.  
  348.    procedure Expander_Mode_Restore is
  349.    begin
  350.       Expander_Active := Expander_Flags.Table (Expander_Flags.Last);
  351.       Expander_Flags.Decrement_Last;
  352.  
  353.       if Errors_Detected /= 0 then
  354.          Expander_Active := False;
  355.       end if;
  356.    end Expander_Mode_Restore;
  357.  
  358.    --------------------------------
  359.    -- Expander_Mode_Save_And_Set --
  360.    --------------------------------
  361.  
  362.    procedure Expander_Mode_Save_And_Set (Status : Boolean) is
  363.    begin
  364.       Expander_Flags.Increment_Last;
  365.       Expander_Flags.Table (Expander_Flags.Last) := Expander_Active;
  366.       Expander_Active := Status;
  367.    end Expander_Mode_Save_And_Set;
  368.  
  369. end Expander;
  370.