]> git.pld-linux.org Git - packages/gcc3.git/commitdiff
- copied from compat-gcc-34 for gcc3 auto/ti/gcc3-3_4_6-1
authorhawk <hawk@pld-linux.org>
Tue, 11 Nov 2008 18:07:04 +0000 (18:07 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    gcc3-ada-bootstrap.patch -> 1.1
    gcc3-ada-link-new-libgnat.patch -> 1.1
    gcc3-ada-link.patch -> 1.1
    gcc3-cxxabi.patch -> 1.1
    gcc3-gcc_visibility.m4 -> 1.1
    gcc3-info.patch -> 1.1
    gcc3-nodebug.patch -> 1.1
    gcc3-nolocalefiles.patch -> 1.1
    gcc3-pr-rh.patch -> 1.1
    gcc3-pr15666.patch -> 1.1
    gcc3-ssp.patch -> 1.1
    gcc3-visibility.patch -> 1.1

12 files changed:
gcc3-ada-bootstrap.patch [new file with mode: 0644]
gcc3-ada-link-new-libgnat.patch [new file with mode: 0644]
gcc3-ada-link.patch [new file with mode: 0644]
gcc3-cxxabi.patch [new file with mode: 0644]
gcc3-gcc_visibility.m4 [new file with mode: 0644]
gcc3-info.patch [new file with mode: 0644]
gcc3-nodebug.patch [new file with mode: 0644]
gcc3-nolocalefiles.patch [new file with mode: 0644]
gcc3-pr-rh.patch [new file with mode: 0644]
gcc3-pr15666.patch [new file with mode: 0644]
gcc3-ssp.patch [new file with mode: 0644]
gcc3-visibility.patch [new file with mode: 0644]

diff --git a/gcc3-ada-bootstrap.patch b/gcc3-ada-bootstrap.patch
new file mode 100644 (file)
index 0000000..e70ef3b
--- /dev/null
@@ -0,0 +1,7695 @@
+--- gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/sinfo.h.orig 1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/sinfo.h      2004-06-02 00:54:16.000000000 +0200
+@@ -0,0 +1,847 @@
++/*--------------------------------------------------------------------------*/
++/*                                                                          */
++/*                         GNAT COMPILER COMPONENTS                         */
++/*                                                                          */
++/*                                S I N F O                                 */
++/*                                                                          */
++/*                              C Header File                               */
++/*                                                                          */
++/*          Copyright (C) 1992-2004, 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- */
++/* ware  Foundation;  either version 2,  or (at your option) any later ver- */
++/* sion.  GNAT is distributed in the hope that it will be useful, but WITH- */
++/* OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY */
++/* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License */
++/* for  more details.  You should have  received  a copy of the GNU General */
++/* Public License  distributed with GNAT;  see file COPYING.  If not, write */
++/* to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, */
++/* MA 02111-1307, USA.                                                      */
++/*                                                                          */
++/* As a special exception,  if other files  instantiate  generics from this */
++/* unit, or you link  this unit with other files  to produce an executable, */
++/* this  unit  does not  by itself cause  the resulting  executable  to  be */
++/* covered  by the  GNU  General  Public  License.  This exception does not */
++/* however invalidate  any other reasons why  the executable file  might be */
++/* covered by the  GNU Public License.                                      */
++/*                                                                          */
++/* GNAT was originally developed  by the GNAT team at  New York University. */
++/* Extensive contributions were provided by Ada Core Technologies Inc.      */
++/*                                                                          */
++/*--------------------------------------------------------------------------*/
++
++      #define N_Unused_At_Start 0
++      #define N_At_Clause 1
++      #define N_Component_Clause 2
++      #define N_Enumeration_Representation_Clause 3
++      #define N_Mod_Clause 4
++      #define N_Record_Representation_Clause 5
++      #define N_Attribute_Definition_Clause 6
++      #define N_Empty 7
++      #define N_Pragma 8
++      #define N_Pragma_Argument_Association 9
++      #define N_Error 10
++      #define N_Defining_Character_Literal 11
++      #define N_Defining_Identifier 12
++      #define N_Defining_Operator_Symbol 13
++      #define N_Expanded_Name 14
++      #define N_Identifier 15
++      #define N_Operator_Symbol 16
++      #define N_Character_Literal 17
++      #define N_Op_Add 18
++      #define N_Op_Concat 19
++      #define N_Op_Expon 20
++      #define N_Op_Subtract 21
++      #define N_Op_Divide 22
++      #define N_Op_Mod 23
++      #define N_Op_Multiply 24
++      #define N_Op_Rem 25
++      #define N_Op_And 26
++      #define N_Op_Eq 27
++      #define N_Op_Ge 28
++      #define N_Op_Gt 29
++      #define N_Op_Le 30
++      #define N_Op_Lt 31
++      #define N_Op_Ne 32
++      #define N_Op_Or 33
++      #define N_Op_Xor 34
++      #define N_Op_Rotate_Left 35
++      #define N_Op_Rotate_Right 36
++      #define N_Op_Shift_Left 37
++      #define N_Op_Shift_Right 38
++      #define N_Op_Shift_Right_Arithmetic 39
++      #define N_Op_Abs 40
++      #define N_Op_Minus 41
++      #define N_Op_Not 42
++      #define N_Op_Plus 43
++      #define N_Attribute_Reference 44
++      #define N_And_Then 45
++      #define N_Conditional_Expression 46
++      #define N_Explicit_Dereference 47
++      #define N_Function_Call 48
++      #define N_In 49
++      #define N_Indexed_Component 50
++      #define N_Integer_Literal 51
++      #define N_Not_In 52
++      #define N_Null 53
++      #define N_Or_Else 54
++      #define N_Procedure_Call_Statement 55
++      #define N_Qualified_Expression 56
++      #define N_Raise_Constraint_Error 57
++      #define N_Raise_Program_Error 58
++      #define N_Raise_Storage_Error 59
++      #define N_Aggregate 60
++      #define N_Allocator 61
++      #define N_Extension_Aggregate 62
++      #define N_Range 63
++      #define N_Real_Literal 64
++      #define N_Reference 65
++      #define N_Selected_Component 66
++      #define N_Slice 67
++      #define N_String_Literal 68
++      #define N_Subprogram_Info 69
++      #define N_Type_Conversion 70
++      #define N_Unchecked_Expression 71
++      #define N_Unchecked_Type_Conversion 72
++      #define N_Subtype_Indication 73
++      #define N_Component_Declaration 74
++      #define N_Entry_Declaration 75
++      #define N_Formal_Object_Declaration 76
++      #define N_Formal_Type_Declaration 77
++      #define N_Full_Type_Declaration 78
++      #define N_Incomplete_Type_Declaration 79
++      #define N_Loop_Parameter_Specification 80
++      #define N_Object_Declaration 81
++      #define N_Protected_Type_Declaration 82
++      #define N_Private_Extension_Declaration 83
++      #define N_Private_Type_Declaration 84
++      #define N_Subtype_Declaration 85
++      #define N_Function_Specification 86
++      #define N_Procedure_Specification 87
++      #define N_Entry_Index_Specification 88
++      #define N_Freeze_Entity 89
++      #define N_Access_Function_Definition 90
++      #define N_Access_Procedure_Definition 91
++      #define N_Task_Type_Declaration 92
++      #define N_Package_Body_Stub 93
++      #define N_Protected_Body_Stub 94
++      #define N_Subprogram_Body_Stub 95
++      #define N_Task_Body_Stub 96
++      #define N_Function_Instantiation 97
++      #define N_Package_Instantiation 98
++      #define N_Procedure_Instantiation 99
++      #define N_Package_Body 100
++      #define N_Subprogram_Body 101
++      #define N_Protected_Body 102
++      #define N_Task_Body 103
++      #define N_Implicit_Label_Declaration 104
++      #define N_Package_Declaration 105
++      #define N_Single_Task_Declaration 106
++      #define N_Subprogram_Declaration 107
++      #define N_Use_Package_Clause 108
++      #define N_Generic_Package_Declaration 109
++      #define N_Generic_Subprogram_Declaration 110
++      #define N_Constrained_Array_Definition 111
++      #define N_Unconstrained_Array_Definition 112
++      #define N_Exception_Renaming_Declaration 113
++      #define N_Object_Renaming_Declaration 114
++      #define N_Package_Renaming_Declaration 115
++      #define N_Subprogram_Renaming_Declaration 116
++      #define N_Generic_Function_Renaming_Declaration 117
++      #define N_Generic_Package_Renaming_Declaration 118
++      #define N_Generic_Procedure_Renaming_Declaration 119
++      #define N_Abort_Statement 120
++      #define N_Accept_Statement 121
++      #define N_Assignment_Statement 122
++      #define N_Asynchronous_Select 123
++      #define N_Block_Statement 124
++      #define N_Case_Statement 125
++      #define N_Code_Statement 126
++      #define N_Conditional_Entry_Call 127
++      #define N_Delay_Relative_Statement 128
++      #define N_Delay_Until_Statement 129
++      #define N_Entry_Call_Statement 130
++      #define N_Free_Statement 131
++      #define N_Goto_Statement 132
++      #define N_Loop_Statement 133
++      #define N_Null_Statement 134
++      #define N_Raise_Statement 135
++      #define N_Requeue_Statement 136
++      #define N_Return_Statement 137
++      #define N_Selective_Accept 138
++      #define N_Timed_Entry_Call 139
++      #define N_Exit_Statement 140
++      #define N_If_Statement 141
++      #define N_Accept_Alternative 142
++      #define N_Delay_Alternative 143
++      #define N_Elsif_Part 144
++      #define N_Entry_Body_Formal_Part 145
++      #define N_Iteration_Scheme 146
++      #define N_Terminate_Alternative 147
++      #define N_Abortable_Part 148
++      #define N_Abstract_Subprogram_Declaration 149
++      #define N_Access_Definition 150
++      #define N_Access_To_Object_Definition 151
++      #define N_Case_Statement_Alternative 152
++      #define N_Compilation_Unit 153
++      #define N_Compilation_Unit_Aux 154
++      #define N_Component_Association 155
++      #define N_Component_Definition 156
++      #define N_Component_List 157
++      #define N_Derived_Type_Definition 158
++      #define N_Decimal_Fixed_Point_Definition 159
++      #define N_Defining_Program_Unit_Name 160
++      #define N_Delta_Constraint 161
++      #define N_Designator 162
++      #define N_Digits_Constraint 163
++      #define N_Discriminant_Association 164
++      #define N_Discriminant_Specification 165
++      #define N_Enumeration_Type_Definition 166
++      #define N_Entry_Body 167
++      #define N_Entry_Call_Alternative 168
++      #define N_Exception_Declaration 169
++      #define N_Exception_Handler 170
++      #define N_Floating_Point_Definition 171
++      #define N_Formal_Decimal_Fixed_Point_Definition 172
++      #define N_Formal_Derived_Type_Definition 173
++      #define N_Formal_Discrete_Type_Definition 174
++      #define N_Formal_Floating_Point_Definition 175
++      #define N_Formal_Modular_Type_Definition 176
++      #define N_Formal_Ordinary_Fixed_Point_Definition 177
++      #define N_Formal_Package_Declaration 178
++      #define N_Formal_Private_Type_Definition 179
++      #define N_Formal_Signed_Integer_Type_Definition 180
++      #define N_Formal_Subprogram_Declaration 181
++      #define N_Generic_Association 182
++      #define N_Handled_Sequence_Of_Statements 183
++      #define N_Index_Or_Discriminant_Constraint 184
++      #define N_Itype_Reference 185
++      #define N_Label 186
++      #define N_Modular_Type_Definition 187
++      #define N_Number_Declaration 188
++      #define N_Ordinary_Fixed_Point_Definition 189
++      #define N_Others_Choice 190
++      #define N_Package_Specification 191
++      #define N_Parameter_Association 192
++      #define N_Parameter_Specification 193
++      #define N_Protected_Definition 194
++      #define N_Range_Constraint 195
++      #define N_Real_Range_Specification 196
++      #define N_Record_Definition 197
++      #define N_Signed_Integer_Type_Definition 198
++      #define N_Single_Protected_Declaration 199
++      #define N_Subunit 200
++      #define N_Task_Definition 201
++      #define N_Triggering_Alternative 202
++      #define N_Use_Type_Clause 203
++      #define N_Validate_Unchecked_Conversion 204
++      #define N_Variant 205
++      #define N_Variant_Part 206
++      #define N_With_Clause 207
++      #define N_With_Type_Clause 208
++      #define N_Unused_At_End 209
++
++      #define Number_Node_Kinds 210
++   SUBTYPE (N_Access_To_Subprogram_Definition, Node_Kind, 
++      N_Access_Function_Definition,
++      N_Access_Procedure_Definition)
++   SUBTYPE (N_Array_Type_Definition, Node_Kind, 
++      N_Constrained_Array_Definition,
++      N_Unconstrained_Array_Definition)
++   SUBTYPE (N_Binary_Op, Node_Kind, 
++      N_Op_Add,
++      N_Op_Shift_Right_Arithmetic)
++   SUBTYPE (N_Body_Stub, Node_Kind, 
++      N_Package_Body_Stub,
++      N_Task_Body_Stub)
++   SUBTYPE (N_Declaration, Node_Kind, 
++      N_Component_Declaration,
++      N_Procedure_Specification)
++   SUBTYPE (N_Direct_Name, Node_Kind, 
++      N_Identifier,
++      N_Character_Literal)
++   SUBTYPE (N_Entity, Node_Kind, 
++      N_Defining_Character_Literal,
++      N_Defining_Operator_Symbol)
++   SUBTYPE (N_Generic_Declaration, Node_Kind, 
++      N_Generic_Package_Declaration,
++      N_Generic_Subprogram_Declaration)
++   SUBTYPE (N_Generic_Instantiation, Node_Kind, 
++      N_Function_Instantiation,
++      N_Procedure_Instantiation)
++   SUBTYPE (N_Generic_Renaming_Declaration, Node_Kind, 
++      N_Generic_Function_Renaming_Declaration,
++      N_Generic_Procedure_Renaming_Declaration)
++   SUBTYPE (N_Has_Chars, Node_Kind, 
++      N_Attribute_Definition_Clause,
++      N_Op_Plus)
++   SUBTYPE (N_Has_Entity, Node_Kind, 
++      N_Expanded_Name,
++      N_Attribute_Reference)
++   SUBTYPE (N_Has_Etype, Node_Kind, 
++      N_Error,
++      N_Subtype_Indication)
++   SUBTYPE (N_Has_Treat_Fixed_As_Integer, Node_Kind, 
++      N_Op_Divide,
++      N_Op_Rem)
++   SUBTYPE (N_Later_Decl_Item, Node_Kind, 
++      N_Task_Type_Declaration,
++      N_Generic_Subprogram_Declaration)
++   SUBTYPE (N_Op, Node_Kind, 
++      N_Op_Add,
++      N_Op_Plus)
++   SUBTYPE (N_Op_Boolean, Node_Kind, 
++      N_Op_And,
++      N_Op_Xor)
++   SUBTYPE (N_Op_Compare, Node_Kind, 
++      N_Op_Eq,
++      N_Op_Ne)
++   SUBTYPE (N_Op_Shift, Node_Kind, 
++      N_Op_Rotate_Left,
++      N_Op_Shift_Right_Arithmetic)
++   SUBTYPE (N_Proper_Body, Node_Kind, 
++      N_Package_Body,
++      N_Task_Body)
++   SUBTYPE (N_Raise_xxx_Error, Node_Kind, 
++      N_Raise_Constraint_Error,
++      N_Raise_Storage_Error)
++   SUBTYPE (N_Renaming_Declaration, Node_Kind, 
++      N_Exception_Renaming_Declaration,
++      N_Generic_Procedure_Renaming_Declaration)
++   SUBTYPE (N_Representation_Clause, Node_Kind, 
++      N_At_Clause,
++      N_Attribute_Definition_Clause)
++   SUBTYPE (N_Statement_Other_Than_Procedure_Call, Node_Kind, 
++      N_Abort_Statement,
++      N_If_Statement)
++   SUBTYPE (N_Has_Condition, Node_Kind, 
++      N_Exit_Statement,
++      N_Terminate_Alternative)
++   SUBTYPE (N_Subexpr, Node_Kind, 
++      N_Expanded_Name,
++      N_Unchecked_Type_Conversion)
++   SUBTYPE (N_Subprogram_Specification, Node_Kind, 
++      N_Function_Specification,
++      N_Procedure_Specification)
++   SUBTYPE (N_Unary_Op, Node_Kind, 
++      N_Op_Abs,
++      N_Op_Plus)
++   SUBTYPE (N_Unit_Body, Node_Kind, 
++      N_Package_Body,
++      N_Subprogram_Body)
++   INLINE Boolean   ABE_Is_Certain                 (Node_Id N)
++      { return Flag18 (N); }
++   INLINE Boolean   Abort_Present                  (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Node_Id   Abortable_Part                 (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   Abstract_Present               (Node_Id N)
++      { return Flag4 (N); }
++   INLINE List_Id   Accept_Handler_Records         (Node_Id N)
++      { return List5 (N); }
++   INLINE Node_Id   Accept_Statement               (Node_Id N)
++      { return Node2 (N); }
++   INLINE Elist_Id  Access_Types_To_Process        (Node_Id N)
++      { return Elist2 (N); }
++   INLINE List_Id   Actions                        (Node_Id N)
++      { return List1 (N); }
++   INLINE Node_Id   Activation_Chain_Entity        (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Acts_As_Spec                   (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Node_Id   Aggregate_Bounds               (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Aliased_Present                (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Boolean   All_Others                     (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Boolean   All_Present                    (Node_Id N)
++      { return Flag15 (N); }
++   INLINE List_Id   Alternatives                   (Node_Id N)
++      { return List4 (N); }
++   INLINE Node_Id   Ancestor_Part                  (Node_Id N)
++      { return Node3 (N); }
++   INLINE Node_Id   Array_Aggregate                (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Assignment_OK                  (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Node_Id   Associated_Node                (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   At_End_Proc                    (Node_Id N)
++      { return Node1 (N); }
++   INLINE Name_Id   Attribute_Name                 (Node_Id N)
++      { return Name2 (N); }
++   INLINE Node_Id   Aux_Decls_Node                 (Node_Id N)
++      { return Node5 (N); }
++   INLINE Boolean   Backwards_OK                   (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Boolean   Bad_Is_Detected                (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Boolean   By_Ref                         (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Boolean   Body_Required                  (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Node_Id   Body_To_Inline                 (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Box_Present                    (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Char_Code Char_Literal_Value             (Node_Id N)
++      { return Char_Code2 (N); }
++   INLINE Name_Id   Chars                          (Node_Id N)
++      { return Name1 (N); }
++   INLINE Boolean   Check_Address_Alignment        (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Choice_Parameter               (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Choices                        (Node_Id N)
++      { return List1 (N); }
++   INLINE Boolean   Compile_Time_Known_Aggregate   (Node_Id N)
++      { return Flag18 (N); }
++   INLINE List_Id   Component_Associations         (Node_Id N)
++      { return List2 (N); }
++   INLINE List_Id   Component_Clauses              (Node_Id N)
++      { return List3 (N); }
++   INLINE Node_Id   Component_Definition           (Node_Id N)
++      { return Node4 (N); }
++   INLINE List_Id   Component_Items                (Node_Id N)
++      { return List3 (N); }
++   INLINE Node_Id   Component_List                 (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Component_Name                 (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Condition                      (Node_Id N)
++      { return Node1 (N); }
++   INLINE List_Id   Condition_Actions              (Node_Id N)
++      { return List3 (N); }
++   INLINE List_Id   Config_Pragmas                 (Node_Id N)
++      { return List4 (N); }
++   INLINE Boolean   Constant_Present               (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Node_Id   Constraint                     (Node_Id N)
++      { return Node3 (N); }
++   INLINE List_Id   Constraints                    (Node_Id N)
++      { return List1 (N); }
++   INLINE Boolean   Context_Installed              (Node_Id N)
++      { return Flag13 (N); }
++   INLINE List_Id   Context_Items                  (Node_Id N)
++      { return List1 (N); }
++   INLINE Node_Id   Controlling_Argument           (Node_Id N)
++      { return Node1 (N); }
++   INLINE Boolean   Conversion_OK                  (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Node_Id   Corresponding_Body             (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Corresponding_Generic_Association (Node_Id N)
++      { return Node5 (N); }
++   INLINE Uint      Corresponding_Integer_Value    (Node_Id N)
++      { return Uint4 (N); }
++   INLINE Node_Id   Corresponding_Spec             (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Corresponding_Stub             (Node_Id N)
++      { return Node3 (N); }
++   INLINE Entity_Id Dcheck_Function                (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Debug_Statement                (Node_Id N)
++      { return Node3 (N); }
++   INLINE List_Id   Declarations                   (Node_Id N)
++      { return List2 (N); }
++   INLINE Node_Id   Default_Expression             (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Default_Name                   (Node_Id N)
++      { return Node2 (N); }
++   INLINE Entity_Id Defining_Identifier            (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Defining_Unit_Name             (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Delay_Alternative              (Node_Id N)
++      { return Node4 (N); }
++   INLINE Boolean   Delay_Finalize_Attach          (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Node_Id   Delay_Statement                (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Delta_Expression               (Node_Id N)
++      { return Node3 (N); }
++   INLINE Node_Id   Digits_Expression              (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   Discr_Check_Funcs_Built        (Node_Id N)
++      { return Flag11 (N); }
++   INLINE List_Id   Discrete_Choices               (Node_Id N)
++      { return List4 (N); }
++   INLINE Node_Id   Discrete_Range                 (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Discrete_Subtype_Definition    (Node_Id N)
++      { return Node4 (N); }
++   INLINE List_Id   Discrete_Subtype_Definitions   (Node_Id N)
++      { return List2 (N); }
++   INLINE List_Id   Discriminant_Specifications    (Node_Id N)
++      { return List4 (N); }
++   INLINE Node_Id   Discriminant_Type              (Node_Id N)
++      { return Node5 (N); }
++   INLINE Boolean   Do_Accessibility_Check         (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Do_Discriminant_Check          (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Do_Division_Check              (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Do_Length_Check                (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Boolean   Do_Overflow_Check              (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Boolean   Do_Range_Check                 (Node_Id N)
++      { return Flag9 (N); }
++   INLINE Boolean   Do_Storage_Check               (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Boolean   Do_Tag_Check                   (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Elaborate_All_Present          (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Boolean   Elaborate_Present              (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Node_Id   Elaboration_Boolean            (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Else_Actions                   (Node_Id N)
++      { return List3 (N); }
++   INLINE List_Id   Else_Statements                (Node_Id N)
++      { return List4 (N); }
++   INLINE List_Id   Elsif_Parts                    (Node_Id N)
++      { return List3 (N); }
++   INLINE Node_Id   Enclosing_Variant              (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   End_Label                      (Node_Id N)
++      { return Node4 (N); }
++   INLINE Uint      End_Span                       (Node_Id N)
++      { return Uint5 (N); }
++   INLINE Node_Id   Entity                         (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Entity_Or_Associated_Node      (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Entry_Body_Formal_Part         (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Entry_Call_Alternative         (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Entry_Call_Statement           (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Entry_Direct_Name              (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Entry_Index                    (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Entry_Index_Specification      (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Etype                          (Node_Id N)
++      { return Node5 (N); }
++   INLINE List_Id   Exception_Choices              (Node_Id N)
++      { return List4 (N); }
++   INLINE List_Id   Exception_Handlers             (Node_Id N)
++      { return List5 (N); }
++   INLINE Boolean   Exception_Junk                 (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Explicit_Actual_Parameter      (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Expansion_Delayed              (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Explicit_Generic_Actual_Parameter (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Expression                     (Node_Id N)
++      { return Node3 (N); }
++   INLINE List_Id   Expressions                    (Node_Id N)
++      { return List1 (N); }
++   INLINE Node_Id   First_Bit                      (Node_Id N)
++      { return Node3 (N); }
++   INLINE Entity_Id First_Inlined_Subprogram       (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   First_Name                     (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Node_Id   First_Named_Actual             (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   First_Real_Statement           (Node_Id N)
++      { return Node2 (N); }
++   INLINE Entity_Id First_Subtype_Link             (Node_Id N)
++      { return Node5 (N); }
++   INLINE Boolean   Float_Truncate                 (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Formal_Type_Definition         (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Forwards_OK                    (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Boolean   From_At_Mod                    (Node_Id N)
++      { return Flag4 (N); }
++   INLINE List_Id   Generic_Associations           (Node_Id N)
++      { return List3 (N); }
++   INLINE List_Id   Generic_Formal_Declarations    (Node_Id N)
++      { return List2 (N); }
++   INLINE Node_Id   Generic_Parent                 (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Generic_Parent_Type            (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Handled_Statement_Sequence     (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Handler_List_Entry             (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   Has_Created_Identifier         (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Boolean   Has_Dynamic_Length_Check       (Node_Id N)
++      { return Flag10 (N); }
++   INLINE Boolean   Has_Dynamic_Range_Check        (Node_Id N)
++      { return Flag12 (N); }
++   INLINE Boolean   Has_No_Elaboration_Code        (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Boolean   Has_Priority_Pragma            (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Boolean   Has_Private_View               (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Boolean   Has_Storage_Size_Pragma        (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Boolean   Has_Task_Info_Pragma           (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Boolean   Has_Task_Name_Pragma           (Node_Id N)
++      { return Flag8 (N); }
++   INLINE Boolean   Has_Wide_Character             (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Elist_Id  Hidden_By_Use_Clause           (Node_Id N)
++      { return Elist4 (N); }
++   INLINE Node_Id   High_Bound                     (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Identifier                     (Node_Id N)
++      { return Node1 (N); }
++   INLINE Boolean   Implicit_With                  (Node_Id N)
++      { return Flag16 (N); }
++   INLINE Boolean   In_Present                     (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Boolean   Includes_Infinities            (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Instance_Spec                  (Node_Id N)
++      { return Node5 (N); }
++   INLINE Uint      Intval                         (Node_Id N)
++      { return Uint3 (N); }
++   INLINE Boolean   Is_Asynchronous_Call_Block     (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Boolean   Is_Component_Left_Opnd         (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Is_Component_Right_Opnd        (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Boolean   Is_Controlling_Actual          (Node_Id N)
++      { return Flag16 (N); }
++   INLINE Boolean   Is_In_Discriminant_Check       (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Boolean   Is_Machine_Number              (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Boolean   Is_Null_Loop                   (Node_Id N)
++      { return Flag16 (N); }
++   INLINE Boolean   Is_Overloaded                  (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Boolean   Is_Power_Of_2_For_Shift        (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Is_Protected_Subprogram_Body   (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Boolean   Is_Static_Expression           (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Boolean   Is_Subprogram_Descriptor       (Node_Id N)
++      { return Flag16 (N); }
++   INLINE Boolean   Is_Task_Allocation_Block       (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Boolean   Is_Task_Master                 (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Node_Id   Iteration_Scheme               (Node_Id N)
++      { return Node2 (N); }
++   INLINE Entity_Id Itype                          (Node_Id N)
++      { return Node1 (N); }
++   INLINE Boolean   Kill_Range_Check               (Node_Id N)
++      { return Flag11 (N); }
++   INLINE Node_Id   Label_Construct                (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Left_Opnd                      (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Last_Bit                       (Node_Id N)
++      { return Node4 (N); }
++   INLINE Boolean   Last_Name                      (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Node_Id   Library_Unit                   (Node_Id N)
++      { return Node4 (N); }
++   INLINE Boolean   Limited_View_Installed         (Node_Id N)
++      { return Flag18 (N); }
++   INLINE Boolean   Limited_Present                (Node_Id N)
++      { return Flag17 (N); }
++   INLINE List_Id   Literals                       (Node_Id N)
++      { return List1 (N); }
++   INLINE List_Id   Loop_Actions                   (Node_Id N)
++      { return List2 (N); }
++   INLINE Node_Id   Loop_Parameter_Specification   (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Low_Bound                      (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Mod_Clause                     (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   More_Ids                       (Node_Id N)
++      { return Flag5 (N); }
++   INLINE Boolean   Must_Be_Byte_Aligned           (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Boolean   Must_Not_Freeze                (Node_Id N)
++      { return Flag8 (N); }
++   INLINE Node_Id   Name                           (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Names                          (Node_Id N)
++      { return List2 (N); }
++   INLINE Node_Id   Next_Entity                    (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Next_Named_Actual              (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Next_Rep_Item                  (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Next_Use_Clause                (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   No_Ctrl_Actions                (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Boolean   No_Elaboration_Check           (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Boolean   No_Entities_Ref_In_Spec        (Node_Id N)
++      { return Flag8 (N); }
++   INLINE Boolean   No_Initialization              (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   No_Truncation                  (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Boolean   Null_Present                   (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Null_Record_Present            (Node_Id N)
++      { return Flag17 (N); }
++   INLINE Node_Id   Object_Definition              (Node_Id N)
++      { return Node4 (N); }
++   INLINE Boolean   OK_For_Stream                  (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Node_Id   Original_Discriminant          (Node_Id N)
++      { return Node2 (N); }
++   INLINE Entity_Id Original_Entity                (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Others_Discrete_Choices        (Node_Id N)
++      { return List1 (N); }
++   INLINE Boolean   Out_Present                    (Node_Id N)
++      { return Flag17 (N); }
++   INLINE List_Id   Parameter_Associations         (Node_Id N)
++      { return List3 (N); }
++   INLINE Boolean   Parameter_List_Truncated       (Node_Id N)
++      { return Flag17 (N); }
++   INLINE List_Id   Parameter_Specifications       (Node_Id N)
++      { return List3 (N); }
++   INLINE Node_Id   Parameter_Type                 (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Parent_Spec                    (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Position                       (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Pragma_Argument_Associations   (Node_Id N)
++      { return List2 (N); }
++   INLINE List_Id   Pragmas_After                  (Node_Id N)
++      { return List5 (N); }
++   INLINE List_Id   Pragmas_Before                 (Node_Id N)
++      { return List4 (N); }
++   INLINE Node_Id   Prefix                         (Node_Id N)
++      { return Node3 (N); }
++   INLINE Uint      Present_Expr                   (Node_Id N)
++      { return Uint3 (N); }
++   INLINE Boolean   Prev_Ids                       (Node_Id N)
++      { return Flag6 (N); }
++   INLINE Boolean   Print_In_Hex                   (Node_Id N)
++      { return Flag13 (N); }
++   INLINE List_Id   Private_Declarations           (Node_Id N)
++      { return List3 (N); }
++   INLINE Boolean   Private_Present                (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Node_Id   Procedure_To_Call              (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Proper_Body                    (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Protected_Definition           (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Protected_Present              (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Boolean   Raises_Constraint_Error        (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Node_Id   Range_Constraint               (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Range_Expression               (Node_Id N)
++      { return Node4 (N); }
++   INLINE Node_Id   Real_Range_Specification       (Node_Id N)
++      { return Node4 (N); }
++   INLINE Ureal     Realval                        (Node_Id N)
++      { return Ureal3 (N); }
++   INLINE Uint      Reason                         (Node_Id N)
++      { return Uint3 (N); }
++   INLINE Node_Id   Record_Extension_Part          (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Redundant_Use                  (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Node_Id   Return_Type                    (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   Reverse_Present                (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Node_Id   Right_Opnd                     (Node_Id N)
++      { return Node3 (N); }
++   INLINE Boolean   Rounded_Result                 (Node_Id N)
++      { return Flag18 (N); }
++   INLINE Node_Id   Scope                          (Node_Id N)
++      { return Node3 (N); }
++   INLINE List_Id   Select_Alternatives            (Node_Id N)
++      { return List1 (N); }
++   INLINE Node_Id   Selector_Name                  (Node_Id N)
++      { return Node2 (N); }
++   INLINE List_Id   Selector_Names                 (Node_Id N)
++      { return List1 (N); }
++   INLINE Boolean   Shift_Count_OK                 (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Entity_Id Source_Type                    (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Specification                  (Node_Id N)
++      { return Node1 (N); }
++   INLINE List_Id   Statements                     (Node_Id N)
++      { return List3 (N); }
++   INLINE Boolean   Static_Processing_OK           (Node_Id N)
++      { return Flag4 (N); }
++   INLINE Node_Id   Storage_Pool                   (Node_Id N)
++      { return Node1 (N); }
++   INLINE String_Id Strval                         (Node_Id N)
++      { return Str3 (N); }
++   INLINE Node_Id   Subtype_Indication             (Node_Id N)
++      { return Node5 (N); }
++   INLINE Node_Id   Subtype_Mark                   (Node_Id N)
++      { return Node4 (N); }
++   INLINE List_Id   Subtype_Marks                  (Node_Id N)
++      { return List2 (N); }
++   INLINE Boolean   Tagged_Present                 (Node_Id N)
++      { return Flag15 (N); }
++   INLINE Entity_Id Target_Type                    (Node_Id N)
++      { return Node2 (N); }
++   INLINE Entity_Id Task_Body_Procedure            (Node_Id N)
++      { return Node2 (N); }
++   INLINE Node_Id   Task_Definition                (Node_Id N)
++      { return Node3 (N); }
++   INLINE List_Id   Then_Actions                   (Node_Id N)
++      { return List2 (N); }
++   INLINE List_Id   Then_Statements                (Node_Id N)
++      { return List2 (N); }
++   INLINE Boolean   Treat_Fixed_As_Integer         (Node_Id N)
++      { return Flag14 (N); }
++   INLINE Node_Id   Triggering_Alternative         (Node_Id N)
++      { return Node1 (N); }
++   INLINE Node_Id   Triggering_Statement           (Node_Id N)
++      { return Node1 (N); }
++   INLINE Elist_Id  TSS_Elist                      (Node_Id N)
++      { return Elist3 (N); }
++   INLINE Node_Id   Type_Definition                (Node_Id N)
++      { return Node3 (N); }
++   INLINE Node_Id   Unit                           (Node_Id N)
++      { return Node2 (N); }
++   INLINE Boolean   Unknown_Discriminants_Present  (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Unreferenced_In_Spec           (Node_Id N)
++      { return Flag7 (N); }
++   INLINE Node_Id   Variant_Part                   (Node_Id N)
++      { return Node4 (N); }
++   INLINE List_Id   Variants                       (Node_Id N)
++      { return List1 (N); }
++   INLINE List_Id   Visible_Declarations           (Node_Id N)
++      { return List2 (N); }
++   INLINE Boolean   Was_Originally_Stub            (Node_Id N)
++      { return Flag13 (N); }
++   INLINE Boolean   Zero_Cost_Handling             (Node_Id N)
++      { return Flag5 (N); }
++
+--- gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/einfo.h.orig 1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/einfo.h      2004-06-02 00:54:19.000000000 +0200
+@@ -0,0 +1,1814 @@
++/*--------------------------------------------------------------------------*/
++/*                                                                          */
++/*                         GNAT COMPILER COMPONENTS                         */
++/*                                                                          */
++/*                                E I N F O                                 */
++/*                                                                          */
++/*                              C Header File                               */
++/*                                                                          */
++/*          Copyright (C) 1992-2003 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- */
++/* ware  Foundation;  either version 2,  or (at your option) any later ver- */
++/* sion.  GNAT is distributed in the hope that it will be useful, but WITH- */
++/* OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY */
++/* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License */
++/* for  more details.  You should have  received  a copy of the GNU General */
++/* Public License  distributed with GNAT;  see file COPYING.  If not, write */
++/* to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, */
++/* MA 02111-1307, USA.                                                      */
++/*                                                                          */
++/* As a special exception,  if other files  instantiate  generics from this */
++/* unit, or you link  this unit with other files  to produce an executable, */
++/* this  unit  does not  by itself cause  the resulting  executable  to  be */
++/* covered  by the  GNU  General  Public  License.  This exception does not */
++/* however invalidate  any other reasons why  the executable file  might be */
++/* covered by the  GNU Public License.                                      */
++/*                                                                          */
++/* GNAT was originally developed  by the GNAT team at  New York University. */
++/* Extensive contributions were provided by Ada Core Technologies Inc.      */
++/*                                                                          */
++/*--------------------------------------------------------------------------*/
++
++   #define E_Void                           0
++   #define E_Variable                       1
++   #define E_Component                      2
++   #define E_Constant                       3
++   #define E_Discriminant                   4
++   #define E_Loop_Parameter                 5
++   #define E_In_Parameter                   6
++   #define E_Out_Parameter                  7
++   #define E_In_Out_Parameter               8
++   #define E_Generic_In_Out_Parameter       9
++   #define E_Generic_In_Parameter           10
++   #define E_Named_Integer                  11
++   #define E_Named_Real                     12
++   #define E_Enumeration_Type               13
++   #define E_Enumeration_Subtype            14
++   #define E_Signed_Integer_Type            15
++   #define E_Signed_Integer_Subtype         16
++   #define E_Modular_Integer_Type           17
++   #define E_Modular_Integer_Subtype        18
++   #define E_Ordinary_Fixed_Point_Type      19
++   #define E_Ordinary_Fixed_Point_Subtype   20
++   #define E_Decimal_Fixed_Point_Type       21
++   #define E_Decimal_Fixed_Point_Subtype    22
++   #define E_Floating_Point_Type            23
++   #define E_Floating_Point_Subtype         24
++   #define E_Access_Type                    25
++   #define E_Access_Subtype                 26
++   #define E_Access_Attribute_Type          27
++   #define E_Allocator_Type                 28
++   #define E_General_Access_Type            29
++   #define E_Access_Subprogram_Type         30
++   #define E_Access_Protected_Subprogram_Type 31
++   #define E_Anonymous_Access_Type          32
++   #define E_Array_Type                     33
++   #define E_Array_Subtype                  34
++   #define E_String_Type                    35
++   #define E_String_Subtype                 36
++   #define E_String_Literal_Subtype         37
++   #define E_Class_Wide_Type                38
++   #define E_Class_Wide_Subtype             39
++   #define E_Record_Type                    40
++   #define E_Record_Subtype                 41
++   #define E_Record_Type_With_Private       42
++   #define E_Record_Subtype_With_Private    43
++   #define E_Private_Type                   44
++   #define E_Private_Subtype                45
++   #define E_Limited_Private_Type           46
++   #define E_Limited_Private_Subtype        47
++   #define E_Incomplete_Type                48
++   #define E_Task_Type                      49
++   #define E_Task_Subtype                   50
++   #define E_Protected_Type                 51
++   #define E_Protected_Subtype              52
++   #define E_Exception_Type                 53
++   #define E_Subprogram_Type                54
++   #define E_Enumeration_Literal            55
++   #define E_Function                       56
++   #define E_Operator                       57
++   #define E_Procedure                      58
++   #define E_Entry                          59
++   #define E_Entry_Family                   60
++   #define E_Block                          61
++   #define E_Entry_Index_Parameter          62
++   #define E_Exception                      63
++   #define E_Generic_Function               64
++   #define E_Generic_Procedure              65
++   #define E_Generic_Package                66
++   #define E_Label                          67
++   #define E_Loop                           68
++   #define E_Package                        69
++   #define E_Package_Body                   70
++   #define E_Protected_Object               71
++   #define E_Protected_Body                 72
++   #define E_Task_Body                      73
++   #define E_Subprogram_Body                74
++
++   SUBTYPE (Access_Kind, Entity_Kind, 
++      E_Access_Type, E_Anonymous_Access_Type)
++
++   SUBTYPE (Array_Kind, Entity_Kind, 
++      E_Array_Type, E_String_Literal_Subtype)
++
++   SUBTYPE (Class_Wide_Kind, Entity_Kind, 
++      E_Class_Wide_Type, E_Class_Wide_Subtype)
++
++   SUBTYPE (Composite_Kind, Entity_Kind, 
++      E_Array_Type, E_Protected_Subtype)
++
++   SUBTYPE (Concurrent_Kind, Entity_Kind, 
++      E_Task_Type, E_Protected_Subtype)
++
++   SUBTYPE (Concurrent_Body_Kind, Entity_Kind, 
++      E_Protected_Body, E_Task_Body)
++
++   SUBTYPE (Decimal_Fixed_Point_Kind, Entity_Kind, 
++      E_Decimal_Fixed_Point_Type, E_Decimal_Fixed_Point_Subtype)
++
++   SUBTYPE (Digits_Kind, Entity_Kind, 
++      E_Decimal_Fixed_Point_Type, E_Floating_Point_Subtype)
++
++   SUBTYPE (Discrete_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Modular_Integer_Subtype)
++
++   SUBTYPE (Discrete_Or_Fixed_Point_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Decimal_Fixed_Point_Subtype)
++
++   SUBTYPE (Elementary_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Anonymous_Access_Type)
++
++   SUBTYPE (Enumeration_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Enumeration_Subtype)
++
++   SUBTYPE (Entry_Kind, Entity_Kind, 
++      E_Entry, E_Entry_Family)
++
++   SUBTYPE (Fixed_Point_Kind, Entity_Kind, 
++      E_Ordinary_Fixed_Point_Type, E_Decimal_Fixed_Point_Subtype)
++
++   SUBTYPE (Float_Kind, Entity_Kind, 
++      E_Floating_Point_Type, E_Floating_Point_Subtype)
++
++   SUBTYPE (Formal_Kind, Entity_Kind, 
++      E_In_Parameter, E_In_Out_Parameter)
++
++   SUBTYPE (Generic_Subprogram_Kind, Entity_Kind, 
++      E_Generic_Function, E_Generic_Procedure)
++
++   SUBTYPE (Generic_Unit_Kind, Entity_Kind, 
++      E_Generic_Function, E_Generic_Package)
++
++   SUBTYPE (Incomplete_Or_Private_Kind, Entity_Kind, 
++      E_Record_Type_With_Private, E_Incomplete_Type)
++
++   SUBTYPE (Integer_Kind, Entity_Kind, 
++      E_Signed_Integer_Type, E_Modular_Integer_Subtype)
++
++   SUBTYPE (Modular_Integer_Kind, Entity_Kind, 
++      E_Modular_Integer_Type, E_Modular_Integer_Subtype)
++
++   SUBTYPE (Named_Kind, Entity_Kind, 
++      E_Named_Integer, E_Named_Real)
++
++   SUBTYPE (Numeric_Kind, Entity_Kind, 
++      E_Signed_Integer_Type, E_Floating_Point_Subtype)
++
++   SUBTYPE (Object_Kind, Entity_Kind, 
++      E_Variable, E_Generic_In_Parameter)
++
++   SUBTYPE (Ordinary_Fixed_Point_Kind, Entity_Kind, 
++      E_Ordinary_Fixed_Point_Type, E_Ordinary_Fixed_Point_Subtype)
++
++   SUBTYPE (Overloadable_Kind, Entity_Kind, 
++      E_Enumeration_Literal, E_Entry)
++
++   SUBTYPE (Private_Kind, Entity_Kind, 
++      E_Record_Type_With_Private, E_Limited_Private_Subtype)
++
++   SUBTYPE (Protected_Kind, Entity_Kind, 
++      E_Protected_Type, E_Protected_Subtype)
++
++   SUBTYPE (Real_Kind, Entity_Kind, 
++      E_Ordinary_Fixed_Point_Type, E_Floating_Point_Subtype)
++
++   SUBTYPE (Record_Kind, Entity_Kind, 
++      E_Class_Wide_Type, E_Record_Subtype_With_Private)
++
++   SUBTYPE (Scalar_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Floating_Point_Subtype)
++
++   SUBTYPE (String_Kind, Entity_Kind, 
++      E_String_Type, E_String_Literal_Subtype)
++
++   SUBTYPE (Subprogram_Kind, Entity_Kind, 
++      E_Function, E_Procedure)
++
++   SUBTYPE (Signed_Integer_Kind, Entity_Kind, 
++      E_Signed_Integer_Type, E_Signed_Integer_Subtype)
++
++   SUBTYPE (Task_Kind, Entity_Kind, 
++      E_Task_Type, E_Task_Subtype)
++
++   SUBTYPE (Type_Kind, Entity_Kind, 
++      E_Enumeration_Type, E_Subprogram_Type)
++
++   typedef char Component_Alignment_Kind;
++      #define Calign_Default           0
++      #define Calign_Component_Size    1
++      #define Calign_Component_Size_4  2
++      #define Calign_Storage_Unit      3
++
++   typedef Boolean B;
++   typedef Component_Alignment_Kind C;
++   typedef Entity_Id E;
++   typedef Mechanism_Type M;
++   typedef Node_Id N;
++   typedef Uint U;
++   typedef Ureal R;
++   typedef Elist_Id L;
++   typedef List_Id S;
++
++   INLINE L Accept_Address                     (E Id);
++   INLINE E Access_Disp_Table                  (E Id);
++   INLINE E Actual_Subtype                     (E Id);
++   INLINE B Address_Taken                      (E Id);
++   INLINE E Alias                              (E Id);
++   INLINE U Alignment                          (E Id);
++   INLINE E Associated_Final_Chain             (E Id);
++   INLINE E Associated_Formal_Package          (E Id);
++   INLINE N Associated_Node_For_Itype          (E Id);
++   INLINE E Associated_Storage_Pool            (E Id);
++   INLINE N Barrier_Function                   (E Id);
++   INLINE N Block_Node                         (E Id);
++   INLINE E Body_Entity                        (E Id);
++   INLINE B Body_Needed_For_SAL                (E Id);
++   INLINE E CR_Discriminant                    (E Id);
++   INLINE B C_Pass_By_Copy                     (E Id);
++   INLINE B Can_Never_Be_Null                  (E Id);
++   INLINE B Checks_May_Be_Suppressed           (E Id);
++   INLINE E Class_Wide_Type                    (E Id);
++   INLINE E Cloned_Subtype                     (E Id);
++
++   #define Component_Alignment einfo__component_alignment
++   C Component_Alignment                (E Id);
++
++   INLINE N Component_Clause                   (E Id);
++   INLINE U Component_Bit_Offset               (E Id);
++   INLINE U Component_Size                     (E Id);
++   INLINE E Component_Type                     (E Id);
++   INLINE E Corresponding_Concurrent_Type      (E Id);
++   INLINE E Corresponding_Discriminant         (E Id);
++   INLINE E Corresponding_Equality             (E Id);
++   INLINE E Corresponding_Record_Type          (E Id);
++   INLINE E Corresponding_Remote_Type          (E Id);
++   INLINE N Current_Value                      (E Id);
++   INLINE B Debug_Info_Off                     (E Id);
++   INLINE E Debug_Renaming_Link                (E Id);
++   INLINE E DTC_Entity                         (E Id);
++   INLINE U DT_Entry_Count                     (E Id);
++   INLINE U DT_Position                        (E Id);
++   INLINE E Default_Expr_Function              (E Id);
++   INLINE B Default_Expressions_Processed      (E Id);
++   INLINE N Default_Value                      (E Id);
++   INLINE B Delay_Cleanups                     (E Id);
++   INLINE B Delay_Subprogram_Descriptors       (E Id);
++   INLINE R Delta_Value                        (E Id);
++   INLINE L Dependent_Instances                (E Id);
++   INLINE B Depends_On_Private                 (E Id);
++   INLINE U Digits_Value                       (E Id);
++   INLINE E Directly_Designated_Type           (E Id);
++   INLINE B Discard_Names                      (E Id);
++   INLINE E Discriminal                        (E Id);
++   INLINE E Discriminal_Link                   (E Id);
++   INLINE E Discriminant_Checking_Func         (E Id);
++   INLINE L Discriminant_Constraint            (E Id);
++   INLINE N Discriminant_Default_Value         (E Id);
++   INLINE U Discriminant_Number                (E Id);
++   INLINE B Elaborate_All_Desirable            (E Id);
++   INLINE E Elaboration_Entity                 (E Id);
++   INLINE B Elaboration_Entity_Required        (E Id);
++   INLINE E Enclosing_Scope                    (E Id);
++   INLINE B Entry_Accepted                     (E Id);
++   INLINE E Entry_Bodies_Array                 (E Id);
++   INLINE E Entry_Cancel_Parameter             (E Id);
++   INLINE E Entry_Component                    (E Id);
++   INLINE E Entry_Formal                       (E Id);
++   INLINE E Entry_Index_Constant               (E Id);
++   INLINE E Entry_Index_Type                   (E Id);
++   INLINE E Entry_Parameters_Type              (E Id);
++   INLINE E Enum_Pos_To_Rep                    (E Id);
++   INLINE U Enumeration_Pos                    (E Id);
++   INLINE U Enumeration_Rep                    (E Id);
++   INLINE N Enumeration_Rep_Expr               (E Id);
++   INLINE E Equivalent_Type                    (E Id);
++   INLINE U Esize                              (E Id);
++   INLINE U Exception_Code                     (E Id);
++   INLINE E Extra_Accessibility                (E Id);
++   INLINE E Extra_Constrained                  (E Id);
++   INLINE E Extra_Formal                       (E Id);
++   INLINE E Finalization_Chain_Entity          (E Id);
++
++   #define Finalize_Storage_Only einfo__finalize_storage_only
++   B Finalize_Storage_Only              (E Id);
++
++   INLINE E First_Entity                       (E Id);
++   INLINE N First_Index                        (E Id);
++   INLINE E First_Literal                      (E Id);
++   INLINE E First_Optional_Parameter           (E Id);
++   INLINE E First_Private_Entity               (E Id);
++   INLINE N First_Rep_Item                     (E Id);
++   INLINE N Freeze_Node                        (E Id);
++   INLINE B From_With_Type                     (E Id);
++   INLINE E Full_View                          (E Id);
++   INLINE B Function_Returns_With_DSP          (E Id);
++   INLINE E Generic_Homonym                    (E Id);
++   INLINE L Generic_Renamings                  (E Id);
++   INLINE S Handler_Records                    (E Id);
++   INLINE B Has_Aliased_Components             (E Id);
++   INLINE B Has_Alignment_Clause               (E Id);
++   INLINE B Has_All_Calls_Remote               (E Id);
++   INLINE B Has_Atomic_Components              (E Id);
++   INLINE B Has_Biased_Representation          (E Id);
++   INLINE B Has_Completion                     (E Id);
++   INLINE B Has_Completion_In_Body             (E Id);
++   INLINE B Has_Complex_Representation         (E Id);
++   INLINE B Has_Component_Size_Clause          (E Id);
++   INLINE B Has_Contiguous_Rep                 (E Id);
++   INLINE B Has_Controlled_Component           (E Id);
++   INLINE B Has_Controlling_Result             (E Id);
++   INLINE B Has_Convention_Pragma              (E Id);
++   INLINE B Has_Delayed_Freeze                 (E Id);
++   INLINE B Has_Discriminants                  (E Id);
++   INLINE B Has_Enumeration_Rep_Clause         (E Id);
++   INLINE B Has_Exit                           (E Id);
++   INLINE B Has_External_Tag_Rep_Clause        (E Id);
++   INLINE B Has_Fully_Qualified_Name           (E Id);
++   INLINE B Has_Gigi_Rep_Item                  (E Id);
++   INLINE B Has_Homonym                        (E Id);
++
++   #define Has_Interrupt_Handler einfo__has_interrupt_handler
++   B Has_Interrupt_Handler              (E Id);
++
++   INLINE B Has_Machine_Radix_Clause           (E Id);
++   INLINE B Has_Master_Entity                  (E Id);
++   INLINE B Has_Missing_Return                 (E Id);
++   INLINE B Has_Nested_Block_With_Handler      (E Id);
++   INLINE B Has_Forward_Instantiation          (E Id);
++   INLINE B Has_Non_Standard_Rep               (E Id);
++   INLINE B Has_Object_Size_Clause             (E Id);
++   INLINE B Has_Per_Object_Constraint          (E Id);
++   INLINE B Has_Pragma_Controlled              (E Id);
++   INLINE B Has_Pragma_Elaborate_Body          (E Id);
++   INLINE B Has_Pragma_Inline                  (E Id);
++   INLINE B Has_Pragma_Pack                    (E Id);
++   INLINE B Has_Pragma_Pure_Function           (E Id);
++   INLINE B Has_Pragma_Unreferenced            (E Id);
++   INLINE B Has_Primitive_Operations           (E Id);
++   INLINE B Has_Qualified_Name                 (E Id);
++   INLINE B Has_Record_Rep_Clause              (E Id);
++   INLINE B Has_Recursive_Call                 (E Id);
++   INLINE B Has_Size_Clause                    (E Id);
++   INLINE B Has_Small_Clause                   (E Id);
++   INLINE B Has_Specified_Layout               (E Id);
++   INLINE B Has_Storage_Size_Clause            (E Id);
++   INLINE B Has_Subprogram_Descriptor          (E Id);
++   INLINE B Has_Task                           (E Id);
++   INLINE B Has_Unchecked_Union                (E Id);
++   INLINE B Has_Unknown_Discriminants          (E Id);
++   INLINE B Has_Volatile_Components            (E Id);
++   INLINE B Has_Xref_Entry                     (E Id);
++   INLINE E Hiding_Loop_Variable               (E Id);
++   INLINE E Homonym                            (E Id);
++   INLINE B In_Package_Body                    (E Id);
++   INLINE B In_Private_Part                    (E Id);
++   INLINE B In_Use                             (E Id);
++   INLINE L Inner_Instances                    (E Id);
++   INLINE N Interface_Name                     (E Id);
++   INLINE B Is_AST_Entry                       (E Id);
++   INLINE B Is_Abstract                        (E Id);
++   INLINE B Is_Access_Constant                 (E Id);
++   INLINE B Is_Aliased                         (E Id);
++   INLINE B Is_Asynchronous                    (E Id);
++   INLINE B Is_Atomic                          (E Id);
++   INLINE B Is_Bit_Packed_Array                (E Id);
++   INLINE B Is_CPP_Class                       (E Id);
++   INLINE B Is_Called                          (E Id);
++   INLINE B Is_Character_Type                  (E Id);
++   INLINE B Is_Child_Unit                      (E Id);
++   INLINE B Is_Class_Wide_Equivalent_Type      (E Id);
++   INLINE B Is_Compilation_Unit                (E Id);
++   INLINE B Is_Completely_Hidden               (E Id);
++   INLINE B Is_Constr_Subt_For_UN_Aliased      (E Id);
++   INLINE B Is_Constr_Subt_For_U_Nominal       (E Id);
++   INLINE B Is_Constrained                     (E Id);
++   INLINE B Is_Constructor                     (E Id);
++   INLINE B Is_Controlled                      (E Id);
++   INLINE B Is_Controlling_Formal              (E Id);
++   INLINE B Is_Discrim_SO_Function             (E Id);
++   INLINE B Is_Dispatching_Operation           (E Id);
++   INLINE B Is_Eliminated                      (E Id);
++   INLINE B Is_Entry_Formal                    (E Id);
++   INLINE B Is_Exported                        (E Id);
++   INLINE B Is_First_Subtype                   (E Id);
++   INLINE B Is_For_Access_Subtype              (E Id);
++   INLINE B Is_Frozen                          (E Id);
++   INLINE B Is_Generic_Instance                (E Id);
++   INLINE B Is_Hidden                          (E Id);
++   INLINE B Is_Hidden_Open_Scope               (E Id);
++   INLINE B Is_Immediately_Visible             (E Id);
++   INLINE B Is_Imported                        (E Id);
++   INLINE B Is_Inlined                         (E Id);
++   INLINE B Is_Instantiated                    (E Id);
++   INLINE B Is_Internal                        (E Id);
++   INLINE B Is_Interrupt_Handler               (E Id);
++   INLINE B Is_Intrinsic_Subprogram            (E Id);
++   INLINE B Is_Itype                           (E Id);
++   INLINE B Is_Known_Non_Null                  (E Id);
++   INLINE B Is_Known_Valid                     (E Id);
++   INLINE B Is_Limited_Composite               (E Id);
++   INLINE B Is_Machine_Code_Subprogram         (E Id);
++   INLINE B Is_Non_Static_Subtype              (E Id);
++   INLINE B Is_Null_Init_Proc                  (E Id);
++   INLINE B Is_Optional_Parameter              (E Id);
++   INLINE B Is_Package_Body_Entity             (E Id);
++   INLINE B Is_Packed                          (E Id);
++   INLINE B Is_Packed_Array_Type               (E Id);
++   INLINE B Is_Potentially_Use_Visible         (E Id);
++   INLINE B Is_Preelaborated                   (E Id);
++   INLINE B Is_Private_Composite               (E Id);
++   INLINE B Is_Private_Descendant              (E Id);
++   INLINE B Is_Psected                         (E Id);
++   INLINE B Is_Public                          (E Id);
++   INLINE B Is_Pure                            (E Id);
++   INLINE B Is_Remote_Call_Interface           (E Id);
++   INLINE B Is_Remote_Types                    (E Id);
++   INLINE B Is_Renaming_Of_Object              (E Id);
++   INLINE B Is_Shared_Passive                  (E Id);
++   INLINE B Is_Statically_Allocated            (E Id);
++   INLINE B Is_Tag                             (E Id);
++   INLINE B Is_Tagged_Type                     (E Id);
++   INLINE B Is_Thread_Body                     (E Id);
++   INLINE B Is_True_Constant                   (E Id);
++   INLINE B Is_Unchecked_Union                 (E Id);
++   INLINE B Is_Unsigned_Type                   (E Id);
++   INLINE B Is_VMS_Exception                   (E Id);
++   INLINE B Is_Valued_Procedure                (E Id);
++   INLINE B Is_Visible_Child_Unit              (E Id);
++
++   #define Is_Volatile einfo__is_volatile
++   B Is_Volatile                        (E Id);
++
++   #define Is_Wrapper_Package einfo__is_wrapper_package
++   B Is_Wrapper_Package                 (E Id);
++
++   INLINE B Kill_Elaboration_Checks            (E Id);
++   INLINE B Kill_Range_Checks                  (E Id);
++   INLINE B Kill_Tag_Checks                    (E Id);
++   INLINE E Last_Entity                        (E Id);
++   INLINE L Limited_Views                      (E Id);
++   INLINE E Lit_Indexes                        (E Id);
++   INLINE E Lit_Strings                        (E Id);
++   INLINE B Machine_Radix_10                   (E Id);
++   INLINE E Master_Id                          (E Id);
++   INLINE B Materialize_Entity                 (E Id);
++   INLINE M Mechanism                          (E Id);
++   INLINE U Modulus                            (E Id);
++   INLINE B Needs_Debug_Info                   (E Id);
++   INLINE B Needs_No_Actuals                   (E Id);
++   INLINE B Never_Set_In_Source                (E Id);
++   INLINE E Next_Inlined_Subprogram            (E Id);
++   INLINE B No_Pool_Assigned                   (E Id);
++   INLINE B No_Return                          (E Id);
++   INLINE B Non_Binary_Modulus                 (E Id);
++   INLINE E Non_Limited_View                   (E Id);
++   INLINE B Nonzero_Is_True                    (E Id);
++   INLINE U Normalized_First_Bit               (E Id);
++   INLINE U Normalized_Position                (E Id);
++   INLINE U Normalized_Position_Max            (E Id);
++   INLINE E Object_Ref                         (E Id);
++   INLINE E Original_Array_Type                (E Id);
++   INLINE E Original_Record_Component          (E Id);
++   INLINE E Packed_Array_Type                  (E Id);
++   INLINE E Parent_Subtype                     (E Id);
++   INLINE L Primitive_Operations               (E Id);
++   INLINE E Prival                             (E Id);
++   INLINE L Privals_Chain                      (E Id);
++   INLINE L Private_Dependents                 (E Id);
++   INLINE N Private_View                       (E Id);
++   INLINE E Protected_Body_Subprogram          (E Id);
++   INLINE E Protected_Formal                   (E Id);
++   INLINE E Protected_Operation                (E Id);
++   INLINE U RM_Size                            (E Id);
++   INLINE B Reachable                          (E Id);
++   INLINE B Referenced                         (E Id);
++   INLINE B Referenced_As_LHS                  (E Id);
++   INLINE N Referenced_Object                  (E Id);
++   INLINE N Register_Exception_Call            (E Id);
++   INLINE E Related_Array_Object               (E Id);
++   INLINE E Related_Instance                   (E Id);
++   INLINE N Renamed_Entity                     (E Id);
++   INLINE N Renamed_Object                     (E Id);
++   INLINE U Renaming_Map                       (E Id);
++   INLINE B Return_Present                     (E Id);
++   INLINE B Returns_By_Ref                     (E Id);
++   INLINE B Reverse_Bit_Order                  (E Id);
++   INLINE N Scalar_Range                       (E Id);
++   INLINE U Scale_Value                        (E Id);
++   INLINE U Scope_Depth_Value                  (E Id);
++   INLINE B Sec_Stack_Needed_For_Return        (E Id);
++   INLINE S Shadow_Entities                    (E Id);
++   INLINE E Shared_Var_Assign_Proc             (E Id);
++   INLINE E Shared_Var_Read_Proc               (E Id);
++   INLINE N Size_Check_Code                    (E Id);
++   INLINE B Size_Known_At_Compile_Time         (E Id);
++   INLINE B Size_Depends_On_Discriminant       (E Id);
++   INLINE R Small_Value                        (E Id);
++   INLINE E Spec_Entity                        (E Id);
++   INLINE E Storage_Size_Variable              (E Id);
++   INLINE L Stored_Constraint                  (E Id);
++   INLINE B Strict_Alignment                   (E Id);
++   INLINE U String_Literal_Length              (E Id);
++   INLINE N String_Literal_Low_Bound           (E Id);
++   INLINE B Suppress_Elaboration_Warnings      (E Id);
++   INLINE B Suppress_Init_Proc                 (E Id);
++   INLINE B Suppress_Style_Checks              (E Id);
++   INLINE B Treat_As_Volatile                  (E Id);
++   INLINE E Underlying_Full_View               (E Id);
++   INLINE N Unset_Reference                    (E Id);
++   INLINE B Uses_Sec_Stack                     (E Id);
++   INLINE B Vax_Float                          (E Id);
++   INLINE B Warnings_Off                       (E Id);
++   INLINE B Is_Access_Type                     (E Id);
++   INLINE B Is_Array_Type                      (E Id);
++   INLINE B Is_Class_Wide_Type                 (E Id);
++   INLINE B Is_Composite_Type                  (E Id);
++   INLINE B Is_Concurrent_Body                 (E Id);
++   INLINE B Is_Concurrent_Record_Type          (E Id);
++   INLINE B Is_Concurrent_Type                 (E Id);
++   INLINE B Is_Decimal_Fixed_Point_Type        (E Id);
++   INLINE B Is_Digits_Type                     (E Id);
++   INLINE B Is_Discrete_Or_Fixed_Point_Type    (E Id);
++   INLINE B Is_Discrete_Type                   (E Id);
++   INLINE B Is_Elementary_Type                 (E Id);
++   INLINE B Is_Entry                           (E Id);
++   INLINE B Is_Enumeration_Type                (E Id);
++   INLINE B Is_Fixed_Point_Type                (E Id);
++   INLINE B Is_Floating_Point_Type             (E Id);
++   INLINE B Is_Formal                          (E Id);
++   INLINE B Is_Formal_Subprogram               (E Id);
++   INLINE B Is_Generic_Actual_Type             (E Id);
++   INLINE B Is_Generic_Unit                    (E Id);
++   INLINE B Is_Generic_Type                    (E Id);
++   INLINE B Is_Generic_Subprogram              (E Id);
++   INLINE B Is_Incomplete_Or_Private_Type      (E Id);
++   INLINE B Is_Integer_Type                    (E Id);
++   INLINE B Is_Limited_Record                  (E Id);
++   INLINE B Is_Modular_Integer_Type            (E Id);
++   INLINE B Is_Named_Number                    (E Id);
++   INLINE B Is_Numeric_Type                    (E Id);
++   INLINE B Is_Object                          (E Id);
++   INLINE B Is_Ordinary_Fixed_Point_Type       (E Id);
++   INLINE B Is_Overloadable                    (E Id);
++   INLINE B Is_Overriding_Operation            (E Id);
++   INLINE B Is_Private_Type                    (E Id);
++   INLINE B Is_Protected_Type                  (E Id);
++   INLINE B Is_Real_Type                       (E Id);
++   INLINE B Is_Record_Type                     (E Id);
++   INLINE B Is_Scalar_Type                     (E Id);
++   INLINE B Is_Signed_Integer_Type             (E Id);
++   INLINE B Is_Subprogram                      (E Id);
++   INLINE B Is_Task_Type                       (E Id);
++   INLINE B Is_Type                            (E Id);
++
++   #define Address_Clause einfo__address_clause
++   N Address_Clause                     (E Id);
++
++   #define Alignment_Clause einfo__alignment_clause
++   N Alignment_Clause                   (E Id);
++
++   #define Ancestor_Subtype einfo__ancestor_subtype
++   E Ancestor_Subtype                   (E Id);
++
++   #define Base_Type einfo__base_type
++   E Base_Type                          (E Id);
++
++   #define Constant_Value einfo__constant_value
++   N Constant_Value                     (E Id);
++
++   #define Declaration_Node einfo__declaration_node
++   N Declaration_Node                   (E Id);
++
++   #define Designated_Type einfo__designated_type
++   E Designated_Type                    (E Id);
++
++   #define Enclosing_Dynamic_Scope einfo__enclosing_dynamic_scope
++   E Enclosing_Dynamic_Scope            (E Id);
++
++   #define First_Component einfo__first_component
++   E First_Component                    (E Id);
++
++   #define First_Discriminant einfo__first_discriminant
++   E First_Discriminant                 (E Id);
++
++   #define First_Formal einfo__first_formal
++   E First_Formal                       (E Id);
++
++   #define First_Stored_Discriminant einfo__first_stored_discriminant
++   E First_Stored_Discriminant          (E Id);
++
++   #define First_Subtype einfo__first_subtype
++   E First_Subtype                      (E Id);
++
++   #define Has_Attach_Handler einfo__has_attach_handler
++   B Has_Attach_Handler                 (E Id);
++
++   #define Has_Entries einfo__has_entries
++   B Has_Entries                        (E Id);
++
++   #define Has_Foreign_Convention einfo__has_foreign_convention
++   B Has_Foreign_Convention             (E Id);
++
++   #define Has_Private_Ancestor einfo__has_private_ancestor
++   B Has_Private_Ancestor               (E Id);
++
++   INLINE B Has_Private_Declaration            (E Id);
++
++   #define Implementation_Base_Type einfo__implementation_base_type
++   E Implementation_Base_Type           (E Id);
++
++   #define Is_Always_Inlined einfo__is_always_inlined
++   B Is_Always_Inlined                  (E Id);
++
++   #define Is_Boolean_Type einfo__is_boolean_type
++   B Is_Boolean_Type                    (E Id);
++
++   #define Is_By_Copy_Type einfo__is_by_copy_type
++   B Is_By_Copy_Type                    (E Id);
++
++   #define Is_By_Reference_Type einfo__is_by_reference_type
++   B Is_By_Reference_Type               (E Id);
++
++   #define Is_Derived_Type einfo__is_derived_type
++   B Is_Derived_Type                    (E Id);
++
++   #define Is_Dynamic_Scope einfo__is_dynamic_scope
++   B Is_Dynamic_Scope                   (E Id);
++
++   #define Is_Indefinite_Subtype einfo__is_indefinite_subtype
++   B Is_Indefinite_Subtype              (E Id);
++
++   #define Is_Limited_Type einfo__is_limited_type
++   B Is_Limited_Type                    (E Id);
++
++   #define Is_Package einfo__is_package
++   B Is_Package                         (E Id);
++
++   #define Is_Protected_Private einfo__is_protected_private
++   B Is_Protected_Private               (E Id);
++
++   #define Is_Protected_Record_Type einfo__is_protected_record_type
++   B Is_Protected_Record_Type           (E Id);
++
++   #define Is_Return_By_Reference_Type einfo__is_return_by_reference_type
++   B Is_Return_By_Reference_Type        (E Id);
++
++   #define Is_String_Type einfo__is_string_type
++   B Is_String_Type                     (E Id);
++
++   #define Is_Task_Record_Type einfo__is_task_record_type
++   B Is_Task_Record_Type                (E Id);
++
++   #define Next_Component einfo__next_component
++   E Next_Component                     (E Id);
++
++   #define Next_Discriminant einfo__next_discriminant
++   E Next_Discriminant                  (E Id);
++
++   #define Next_Formal einfo__next_formal
++   E Next_Formal                        (E Id);
++
++   #define Next_Formal_With_Extras einfo__next_formal_with_extras
++   E Next_Formal_With_Extras            (E Id);
++
++   INLINE E Next_Literal                       (E Id);
++
++   #define Next_Stored_Discriminant einfo__next_stored_discriminant
++   E Next_Stored_Discriminant           (E Id);
++
++   #define Number_Dimensions einfo__number_dimensions
++   Pos Number_Dimensions                  (E Id);
++
++   #define Number_Discriminants einfo__number_discriminants
++   Pos Number_Discriminants               (E Id);
++
++   #define Number_Entries einfo__number_entries
++   Nat Number_Entries                     (E Id);
++
++   #define Number_Formals einfo__number_formals
++   Pos Number_Formals                     (E Id);
++
++   INLINE Formal_Kind Parameter_Mode                     (E Id);
++
++   #define Root_Type einfo__root_type
++   E Root_Type                          (E Id);
++
++   #define Scope_Depth_Set einfo__scope_depth_set
++   B Scope_Depth_Set                    (E Id);
++
++   #define Size_Clause einfo__size_clause
++   N Size_Clause                        (E Id);
++
++   #define Tag_Component einfo__tag_component
++   E Tag_Component                      (E Id);
++
++   #define Type_High_Bound einfo__type_high_bound
++   N Type_High_Bound                    (E Id);
++
++   #define Type_Low_Bound einfo__type_low_bound
++   N Type_Low_Bound                     (E Id);
++
++   #define Underlying_Type einfo__underlying_type
++   E Underlying_Type                    (E Id);
++
++   #define Known_Alignment einfo__known_alignment
++   B Known_Alignment                       (Entity_Id E);
++
++   #define Known_Component_Bit_Offset einfo__known_component_bit_offset
++   B Known_Component_Bit_Offset            (Entity_Id E);
++
++   #define Known_Component_Size einfo__known_component_size
++   B Known_Component_Size                  (Entity_Id E);
++
++   #define Known_Esize einfo__known_esize
++   B Known_Esize                           (Entity_Id E);
++
++   #define Known_Normalized_First_Bit einfo__known_normalized_first_bit
++   B Known_Normalized_First_Bit            (Entity_Id E);
++
++   #define Known_Normalized_Position einfo__known_normalized_position
++   B Known_Normalized_Position             (Entity_Id E);
++
++   #define Known_Normalized_Position_Max einfo__known_normalized_position_max
++   B Known_Normalized_Position_Max         (Entity_Id E);
++
++   #define Known_RM_Size einfo__known_rm_size
++   B Known_RM_Size                         (Entity_Id E);
++
++   #define Known_Static_Component_Bit_Offset einfo__known_static_component_bit_offset
++   B Known_Static_Component_Bit_Offset     (Entity_Id E);
++
++   #define Known_Static_Component_Size einfo__known_static_component_size
++   B Known_Static_Component_Size           (Entity_Id E);
++
++   #define Known_Static_Esize einfo__known_static_esize
++   B Known_Static_Esize                    (Entity_Id E);
++
++   #define Known_Static_Normalized_First_Bit einfo__known_static_normalized_first_bit
++   B Known_Static_Normalized_First_Bit     (Entity_Id E);
++
++   #define Known_Static_Normalized_Position einfo__known_static_normalized_position
++   B Known_Static_Normalized_Position      (Entity_Id E);
++
++   #define Known_Static_Normalized_Position_Max einfo__known_static_normalized_position_max
++   B Known_Static_Normalized_Position_Max  (Entity_Id E);
++
++   #define Known_Static_RM_Size einfo__known_static_rm_size
++   B Known_Static_RM_Size                  (Entity_Id E);
++
++   #define Unknown_Alignment einfo__unknown_alignment
++   B Unknown_Alignment                     (Entity_Id E);
++
++   #define Unknown_Component_Bit_Offset einfo__unknown_component_bit_offset
++   B Unknown_Component_Bit_Offset          (Entity_Id E);
++
++   #define Unknown_Component_Size einfo__unknown_component_size
++   B Unknown_Component_Size                (Entity_Id E);
++
++   #define Unknown_Esize einfo__unknown_esize
++   B Unknown_Esize                         (Entity_Id E);
++
++   #define Unknown_Normalized_First_Bit einfo__unknown_normalized_first_bit
++   B Unknown_Normalized_First_Bit          (Entity_Id E);
++
++   #define Unknown_Normalized_Position einfo__unknown_normalized_position
++   B Unknown_Normalized_Position           (Entity_Id E);
++
++   #define Unknown_Normalized_Position_Max einfo__unknown_normalized_position_max
++   B Unknown_Normalized_Position_Max       (Entity_Id E);
++
++   #define Unknown_RM_Size einfo__unknown_rm_size
++   B Unknown_RM_Size                       (Entity_Id E);
++
++
++   INLINE L Accept_Address (E Id)
++      { return Elist21 (Id); }
++
++   INLINE E Access_Disp_Table (E Id)
++      { return Node16 (Implementation_Base_Type (Id)); }
++
++   INLINE E Actual_Subtype (E Id)
++      { return Node17 (Id); }
++
++   INLINE B Address_Taken (E Id)
++      { return Flag104 (Id); }
++
++   INLINE E Alias (E Id)
++      { return Node18 (Id); }
++
++   INLINE U Alignment (E Id)
++      { return Uint14 (Id); }
++
++   INLINE E Associated_Final_Chain (E Id)
++      { return Node23 (Id); }
++
++   INLINE E Associated_Formal_Package (E Id)
++      { return Node12 (Id); }
++
++   INLINE N Associated_Node_For_Itype (E Id)
++      { return Node8 (Id); }
++
++   INLINE E Associated_Storage_Pool (E Id)
++      { return Node22 (Root_Type (Id)); }
++
++   INLINE N Barrier_Function (E Id)
++      { return Node12 (Id); }
++
++   INLINE N Block_Node (E Id)
++      { return Node11 (Id); }
++
++   INLINE E Body_Entity (E Id)
++      { return Node19 (Id); }
++
++   INLINE B Body_Needed_For_SAL (E Id)
++      { return Flag40 (Id); }
++
++   INLINE B C_Pass_By_Copy (E Id)
++      { return Flag125 (Implementation_Base_Type (Id)); }
++
++   INLINE B Can_Never_Be_Null (E Id)
++      { return Flag38 (Id); }
++
++   INLINE B Checks_May_Be_Suppressed (E Id)
++      { return Flag31 (Id); }
++
++   INLINE E Class_Wide_Type (E Id)
++      { return Node9 (Id); }
++
++   INLINE E Cloned_Subtype (E Id)
++      { return Node16 (Id); }
++
++   INLINE U Component_Bit_Offset (E Id)
++      { return Uint11 (Id); }
++
++   INLINE N Component_Clause (E Id)
++      { return Node13 (Id); }
++
++   INLINE U Component_Size (E Id)
++      { return Uint22 (Implementation_Base_Type (Id)); }
++
++   INLINE E Component_Type (E Id)
++      { return Node20 (Implementation_Base_Type (Id)); }
++
++   INLINE E Corresponding_Concurrent_Type (E Id)
++      { return Node18 (Id); }
++
++   INLINE E Corresponding_Discriminant (E Id)
++      { return Node19 (Id); }
++
++   INLINE E Corresponding_Equality (E Id)
++      { return Node13 (Id); }
++
++   INLINE E Corresponding_Record_Type (E Id)
++      { return Node18 (Id); }
++
++   INLINE E Corresponding_Remote_Type (E Id)
++      { return Node22 (Id); }
++
++   INLINE N Current_Value (E Id)
++      { return Node9 (Id); }
++
++   INLINE E CR_Discriminant (E Id)
++      { return Node23 (Id); }
++
++   INLINE B Debug_Info_Off (E Id)
++      { return Flag166 (Id); }
++
++   INLINE E Debug_Renaming_Link (E Id)
++      { return Node13 (Id); }
++
++   INLINE E Default_Expr_Function (E Id)
++      { return Node21 (Id); }
++
++   INLINE B Default_Expressions_Processed (E Id)
++      { return Flag108 (Id); }
++
++   INLINE N Default_Value (E Id)
++      { return Node20 (Id); }
++
++   INLINE B Delay_Cleanups (E Id)
++      { return Flag114 (Id); }
++
++   INLINE B Delay_Subprogram_Descriptors (E Id)
++      { return Flag50 (Id); }
++
++   INLINE R Delta_Value (E Id)
++      { return Ureal18 (Id); }
++
++   INLINE L Dependent_Instances (E Id)
++      { return Elist8 (Id); }
++
++   INLINE B Depends_On_Private (E Id)
++      { return Flag14 (Id); }
++
++   INLINE U Digits_Value (E Id)
++      { return Uint17 (Id); }
++
++   INLINE E Directly_Designated_Type (E Id)
++      { return Node20 (Id); }
++
++   INLINE B Discard_Names (E Id)
++      { return Flag88 (Id); }
++
++   INLINE E Discriminal (E Id)
++      { return Node17 (Id); }
++
++   INLINE N Discriminal_Link (E Id)
++      { return Node10 (Id); }
++
++   INLINE E Discriminant_Checking_Func (E Id)
++      { return Node20 (Id); }
++
++   INLINE L Discriminant_Constraint (E Id)
++      { return Elist21 (Id); }
++
++   INLINE N Discriminant_Default_Value (E Id)
++      { return Node20 (Id); }
++
++   INLINE U Discriminant_Number (E Id)
++      { return Uint15 (Id); }
++
++   INLINE U DT_Entry_Count (E Id)
++      { return Uint15 (Id); }
++
++   INLINE U DT_Position (E Id)
++      { return Uint15 (Id); }
++
++   INLINE E DTC_Entity (E Id)
++      { return Node16 (Id); }
++
++   INLINE B Elaborate_All_Desirable (E Id)
++      { return Flag146 (Id); }
++
++   INLINE E Elaboration_Entity (E Id)
++      { return Node13 (Id); }
++
++   INLINE B Elaboration_Entity_Required (E Id)
++      { return Flag174 (Id); }
++
++   INLINE E Enclosing_Scope (E Id)
++      { return Node18 (Id); }
++
++   INLINE B Entry_Accepted (E Id)
++      { return Flag152 (Id); }
++
++   INLINE E Entry_Bodies_Array (E Id)
++      { return Node15 (Id); }
++
++   INLINE E Entry_Cancel_Parameter (E Id)
++      { return Node23 (Id); }
++
++   INLINE E Entry_Component (E Id)
++      { return Node11 (Id); }
++
++   INLINE E Entry_Formal (E Id)
++      { return Node16 (Id); }
++
++   INLINE N Entry_Index_Constant (E Id)
++      { return Node18 (Id); }
++
++   INLINE E Entry_Parameters_Type (E Id)
++      { return Node15 (Id); }
++
++   INLINE E Enum_Pos_To_Rep (E Id)
++      { return Node23 (Id); }
++
++   INLINE Uint Enumeration_Pos (E Id)
++      { return Uint11 (Id); }
++
++   INLINE U Enumeration_Rep (E Id)
++      { return Uint12 (Id); }
++
++   INLINE N Enumeration_Rep_Expr (E Id)
++      { return Node22 (Id); }
++
++   INLINE E Equivalent_Type (E Id)
++      { return Node18 (Id); }
++
++   INLINE Uint Esize (E Id)
++      { return Uint12 (Id); }
++
++   INLINE Uint Exception_Code (E Id)
++      { return Uint22 (Id); }
++
++   INLINE E Extra_Accessibility (E Id)
++      { return Node13 (Id); }
++
++   INLINE E Extra_Constrained (E Id)
++      { return Node23 (Id); }
++
++   INLINE E Extra_Formal (E Id)
++      { return Node15 (Id); }
++
++   INLINE E Finalization_Chain_Entity (E Id)
++      { return Node19 (Id); }
++
++   INLINE E First_Entity (E Id)
++      { return Node17 (Id); }
++
++   INLINE N First_Index (E Id)
++      { return Node17 (Id); }
++
++   INLINE E First_Literal (E Id)
++      { return Node17 (Id); }
++
++   INLINE E First_Optional_Parameter (E Id)
++      { return Node14 (Id); }
++
++   INLINE E First_Private_Entity (E Id)
++      { return Node16 (Id); }
++
++   INLINE E First_Rep_Item (E Id)
++      { return Node6 (Id); }
++
++   INLINE N Freeze_Node (E Id)
++      { return Node7 (Id); }
++
++   INLINE B From_With_Type (E Id)
++      { return Flag159 (Id); }
++
++   INLINE E Full_View (E Id)
++      { return Node11 (Id); }
++
++   INLINE B Function_Returns_With_DSP (E Id)
++      { return Flag169 (Id); }
++
++   INLINE E Generic_Homonym (E Id)
++      { return Node11 (Id); }
++
++   INLINE L Generic_Renamings (E Id)
++      { return Elist23 (Id); }
++
++   INLINE S Handler_Records (E Id)
++      { return List10 (Id); }
++
++   INLINE B Has_Aliased_Components (E Id)
++      { return Flag135 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Alignment_Clause (E Id)
++      { return Flag46 (Id); }
++
++   INLINE B Has_All_Calls_Remote (E Id)
++      { return Flag79 (Id); }
++
++   INLINE B Has_Atomic_Components (E Id)
++      { return Flag86 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Biased_Representation (E Id)
++      { return Flag139 (Id); }
++
++   INLINE B Has_Completion (E Id)
++      { return Flag26 (Id); }
++
++   INLINE B Has_Completion_In_Body (E Id)
++      { return Flag71 (Id); }
++
++   INLINE B Has_Complex_Representation (E Id)
++      { return Flag140 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Component_Size_Clause (E Id)
++      { return Flag68 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Controlled_Component (E Id)
++      { return Flag43 (Base_Type (Id)); }
++
++   INLINE B Has_Contiguous_Rep (E Id)
++      { return Flag181 (Id); }
++
++   INLINE B Has_Controlling_Result (E Id)
++      { return Flag98 (Id); }
++
++   INLINE B Has_Convention_Pragma (E Id)
++      { return Flag119 (Id); }
++
++   INLINE B Has_Delayed_Freeze (E Id)
++      { return Flag18 (Id); }
++
++   INLINE B Has_Discriminants (E Id)
++      { return Flag5 (Id); }
++
++   INLINE B Has_Enumeration_Rep_Clause (E Id)
++      { return Flag66 (Id); }
++
++   INLINE B Has_Exit (E Id)
++      { return Flag47 (Id); }
++
++   INLINE B Has_External_Tag_Rep_Clause (E Id)
++      { return Flag110 (Id); }
++
++   INLINE B Has_Forward_Instantiation (E Id)
++      { return Flag175 (Id); }
++
++   INLINE B Has_Fully_Qualified_Name (E Id)
++      { return Flag173 (Id); }
++
++   INLINE B Has_Gigi_Rep_Item (E Id)
++      { return Flag82 (Id); }
++
++   INLINE B Has_Homonym (E Id)
++      { return Flag56 (Id); }
++
++   INLINE B Has_Machine_Radix_Clause (E Id)
++      { return Flag83 (Id); }
++
++   INLINE B Has_Master_Entity (E Id)
++      { return Flag21 (Id); }
++
++   INLINE B Has_Missing_Return (E Id)
++      { return Flag142 (Id); }
++
++   INLINE B Has_Nested_Block_With_Handler (E Id)
++      { return Flag101 (Id); }
++
++   INLINE B Has_Non_Standard_Rep (E Id)
++      { return Flag75 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Object_Size_Clause (E Id)
++      { return Flag172 (Id); }
++
++   INLINE B Has_Per_Object_Constraint (E Id)
++      { return Flag154 (Id); }
++
++   INLINE B Has_Pragma_Controlled (E Id)
++      { return Flag27 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Pragma_Elaborate_Body (E Id)
++      { return Flag150 (Id); }
++
++   INLINE B Has_Pragma_Inline (E Id)
++      { return Flag157 (Id); }
++
++   INLINE B Has_Pragma_Pack (E Id)
++      { return Flag121 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Pragma_Pure_Function (E Id)
++      { return Flag179 (Id); }
++
++   INLINE B Has_Pragma_Unreferenced (E Id)
++      { return Flag180 (Id); }
++
++   INLINE B Has_Primitive_Operations (E Id)
++      { return Flag120 (Base_Type (Id)); }
++
++   INLINE B Has_Private_Declaration (E Id)
++      { return Flag155 (Id); }
++
++   INLINE B Has_Qualified_Name (E Id)
++      { return Flag161 (Id); }
++
++   INLINE B Has_Record_Rep_Clause (E Id)
++      { return Flag65 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Recursive_Call (E Id)
++      { return Flag143 (Id); }
++
++   INLINE B Has_Size_Clause (E Id)
++      { return Flag29 (Id); }
++
++   INLINE B Has_Small_Clause (E Id)
++      { return Flag67 (Id); }
++
++   INLINE B Has_Specified_Layout (E Id)
++      { return Flag100 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Storage_Size_Clause (E Id)
++      { return Flag23 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Subprogram_Descriptor (E Id)
++      { return Flag93 (Id); }
++
++   INLINE B Has_Task (E Id)
++      { return Flag30 (Base_Type (Id)); }
++
++   INLINE B Has_Unchecked_Union (E Id)
++      { return Flag123 (Base_Type (Id)); }
++
++   INLINE B Has_Unknown_Discriminants (E Id)
++      { return Flag72 (Id); }
++
++   INLINE B Has_Volatile_Components (E Id)
++      { return Flag87 (Implementation_Base_Type (Id)); }
++
++   INLINE B Has_Xref_Entry (E Id)
++      { return Flag182 (Implementation_Base_Type (Id)); }
++
++   INLINE E Hiding_Loop_Variable (E Id)
++      { return Node8 (Id); }
++
++   INLINE E Homonym (E Id)
++      { return Node4 (Id); }
++
++   INLINE B In_Package_Body (E Id)
++      { return Flag48 (Id); }
++
++   INLINE B In_Private_Part (E Id)
++      { return Flag45 (Id); }
++
++   INLINE B In_Use (E Id)
++      { return Flag8 (Id); }
++
++   INLINE L Inner_Instances (E Id)
++      { return Elist23 (Id); }
++
++   INLINE N Interface_Name (E Id)
++      { return Node21 (Id); }
++
++   INLINE B Is_Abstract (E Id)
++      { return Flag19 (Id); }
++
++   INLINE B Is_Access_Constant (E Id)
++      { return Flag69 (Id); }
++
++   INLINE B Is_Aliased (E Id)
++      { return Flag15 (Id); }
++
++   INLINE B Is_AST_Entry (E Id)
++      { return Flag132 (Id); }
++
++   INLINE B Is_Asynchronous (E Id)
++      { return Flag81 (Id); }
++
++   INLINE B Is_Atomic (E Id)
++      { return Flag85 (Id); }
++
++   INLINE B Is_Bit_Packed_Array (E Id)
++      { return Flag122 (Implementation_Base_Type (Id)); }
++
++   INLINE B Is_Called (E Id)
++      { return Flag102 (Id); }
++
++   INLINE B Is_Character_Type (E Id)
++      { return Flag63 (Id); }
++
++   INLINE B Is_Child_Unit (E Id)
++      { return Flag73 (Id); }
++
++   INLINE B Is_Class_Wide_Equivalent_Type (E Id)
++      { return Flag35 (Id); }
++
++   INLINE B Is_Compilation_Unit (E Id)
++      { return Flag149 (Id); }
++
++   INLINE B Is_Completely_Hidden (E Id)
++      { return Flag103 (Id); }
++
++   INLINE B Is_Constr_Subt_For_U_Nominal (E Id)
++      { return Flag80 (Id); }
++
++   INLINE B Is_Constr_Subt_For_UN_Aliased (E Id)
++      { return Flag141 (Id); }
++
++   INLINE B Is_Constrained (E Id)
++      { return Flag12 (Id); }
++
++   INLINE B Is_Constructor (E Id)
++      { return Flag76 (Id); }
++
++   INLINE B Is_Controlled (E Id)
++      { return Flag42 (Base_Type (Id)); }
++
++   INLINE B Is_Controlling_Formal (E Id)
++      { return Flag97 (Id); }
++
++   INLINE B Is_CPP_Class (E Id)
++      { return Flag74 (Id); }
++
++   INLINE B Is_Discrim_SO_Function (E Id)
++      { return Flag176 (Id); }
++
++   INLINE B Is_Dispatching_Operation (E Id)
++      { return Flag6 (Id); }
++
++   INLINE B Is_Eliminated (E Id)
++      { return Flag124 (Id); }
++
++   INLINE B Is_Entry_Formal (E Id)
++      { return Flag52 (Id); }
++
++   INLINE B Is_Exported (E Id)
++      { return Flag99 (Id); }
++
++   INLINE B Is_First_Subtype (E Id)
++      { return Flag70 (Id); }
++
++   INLINE B Is_For_Access_Subtype (E Id)
++      { return Flag118 (Id); }
++
++   INLINE B Is_Formal_Subprogram (E Id)
++      { return Flag111 (Id); }
++
++   INLINE B Is_Frozen (E Id)
++      { return Flag4 (Id); }
++
++   INLINE B Is_Generic_Actual_Type (E Id)
++      { return Flag94 (Id); }
++
++   INLINE B Is_Generic_Instance (E Id)
++      { return Flag130 (Id); }
++
++   INLINE B Is_Generic_Type (E Id)
++      { return Flag13 (Id); }
++
++   INLINE B Is_Hidden (E Id)
++      { return Flag57 (Id); }
++
++   INLINE B Is_Hidden_Open_Scope (E Id)
++      { return Flag171 (Id); }
++
++   INLINE B Is_Immediately_Visible (E Id)
++      { return Flag7 (Id); }
++
++   INLINE B Is_Imported (E Id)
++      { return Flag24 (Id); }
++
++   INLINE B Is_Inlined (E Id)
++      { return Flag11 (Id); }
++
++   INLINE B Is_Instantiated (E Id)
++      { return Flag126 (Id); }
++
++   INLINE B Is_Internal (E Id)
++      { return Flag17 (Id); }
++
++   INLINE B Is_Interrupt_Handler (E Id)
++      { return Flag89 (Id); }
++
++   INLINE B Is_Intrinsic_Subprogram (E Id)
++      { return Flag64 (Id); }
++
++   INLINE B Is_Itype (E Id)
++      { return Flag91 (Id); }
++
++   INLINE B Is_Known_Non_Null (E Id)
++      { return Flag37 (Id); }
++
++   INLINE B Is_Known_Valid (E Id)
++      { return Flag170 (Id); }
++
++   INLINE B Is_Limited_Composite (E Id)
++      { return Flag106 (Id); }
++
++   INLINE B Is_Limited_Record (E Id)
++      { return Flag25 (Id); }
++
++   INLINE B Is_Machine_Code_Subprogram (E Id)
++      { return Flag137 (Id); }
++
++   INLINE B Is_Non_Static_Subtype (E Id)
++      { return Flag109 (Id); }
++
++   INLINE B Is_Null_Init_Proc (E Id)
++      { return Flag178 (Id); }
++
++   INLINE B Is_Optional_Parameter (E Id)
++      { return Flag134 (Id); }
++
++   INLINE B Is_Overriding_Operation (E Id)
++      { return Flag39 (Id); }
++
++   INLINE B Is_Package_Body_Entity (E Id)
++      { return Flag160 (Id); }
++
++   INLINE B Is_Packed (E Id)
++      { return Flag51 (Implementation_Base_Type (Id)); }
++
++   INLINE B Is_Packed_Array_Type (E Id)
++      { return Flag138 (Id); }
++
++   INLINE B Is_Potentially_Use_Visible (E Id)
++      { return Flag9 (Id); }
++
++   INLINE B Is_Preelaborated (E Id)
++      { return Flag59 (Id); }
++
++   INLINE B Is_Private_Composite (E Id)
++      { return Flag107 (Id); }
++
++   INLINE B Is_Private_Descendant (E Id)
++      { return Flag53 (Id); }
++
++   INLINE B Is_Psected (E Id)
++      { return Flag153 (Id); }
++
++   INLINE B Is_Public (E Id)
++      { return Flag10 (Id); }
++
++   INLINE B Is_Pure (E Id)
++      { return Flag44 (Id); }
++
++   INLINE B Is_Remote_Call_Interface (E Id)
++      { return Flag62 (Id); }
++
++   INLINE B Is_Remote_Types (E Id)
++      { return Flag61 (Id); }
++
++   INLINE B Is_Renaming_Of_Object (E Id)
++      { return Flag112 (Id); }
++
++   INLINE B Is_Shared_Passive (E Id)
++      { return Flag60 (Id); }
++
++   INLINE B Is_Statically_Allocated (E Id)
++      { return Flag28 (Id); }
++
++   INLINE B Is_Tag (E Id)
++      { return Flag78 (Id); }
++
++   INLINE B Is_Tagged_Type (E Id)
++      { return Flag55 (Id); }
++
++   INLINE B Is_Thread_Body (E Id)
++      { return Flag77 (Id); }
++
++   INLINE B Is_True_Constant (E Id)
++      { return Flag163 (Id); }
++
++   INLINE B Is_Unchecked_Union (E Id)
++      { return Flag117 (Id); }
++
++   INLINE B Is_Unsigned_Type (E Id)
++      { return Flag144 (Id); }
++
++   INLINE B Is_Valued_Procedure (E Id)
++      { return Flag127 (Id); }
++
++   INLINE B Is_Visible_Child_Unit (E Id)
++      { return Flag116 (Id); }
++
++   INLINE B Is_VMS_Exception (E Id)
++      { return Flag133 (Id); }
++
++   INLINE B Kill_Elaboration_Checks (E Id)
++      { return Flag32 (Id); }
++
++   INLINE B Kill_Range_Checks (E Id)
++      { return Flag33 (Id); }
++
++   INLINE B Kill_Tag_Checks (E Id)
++      { return Flag34 (Id); }
++
++   INLINE E Last_Entity (E Id)
++      { return Node20 (Id); }
++
++   INLINE L Limited_Views (E Id)
++      { return Elist23 (Id); }
++
++   INLINE E Lit_Indexes (E Id)
++      { return Node15 (Id); }
++
++   INLINE E Lit_Strings (E Id)
++      { return Node16 (Id); }
++
++   INLINE B Machine_Radix_10 (E Id)
++      { return Flag84 (Id); }
++
++   INLINE E Master_Id (E Id)
++      { return Node17 (Id); }
++
++   INLINE B Materialize_Entity (E Id)
++      { return Flag168 (Id); }
++
++   INLINE M Mechanism (E Id)
++      { return UI_To_Int (Uint8 (Id)); }
++
++   INLINE Uint Modulus (E Id)
++      { return Uint17 (Base_Type (Id)); }
++
++   INLINE B Needs_Debug_Info (E Id)
++      { return Flag147 (Id); }
++
++   INLINE B Needs_No_Actuals (E Id)
++      { return Flag22 (Id); }
++
++   INLINE B Never_Set_In_Source (E Id)
++      { return Flag115 (Id); }
++
++   INLINE E Next_Inlined_Subprogram (E Id)
++      { return Node12 (Id); }
++
++   INLINE B No_Pool_Assigned (E Id)
++      { return Flag131 (Root_Type (Id)); }
++
++   INLINE B No_Return (E Id)
++      { return Flag113 (Id); }
++
++   INLINE B Non_Binary_Modulus (E Id)
++      { return Flag58 (Base_Type (Id)); }
++
++   INLINE E Non_Limited_View (E Id)
++      { return Node17 (Id); }
++
++   INLINE B Nonzero_Is_True (E Id)
++      { return Flag162 (Base_Type (Id)); }
++
++   INLINE U Normalized_First_Bit (E Id)
++      { return Uint8 (Id); }
++
++   INLINE U Normalized_Position (E Id)
++      { return Uint14 (Id); }
++
++   INLINE U Normalized_Position_Max (E Id)
++      { return Uint10 (Id); }
++
++   INLINE E Object_Ref (E Id)
++      { return Node17 (Id); }
++
++   INLINE E Original_Array_Type (E Id)
++      { return Node21 (Id); }
++
++   INLINE E Original_Record_Component (E Id)
++      { return Node22 (Id); }
++
++   INLINE E Packed_Array_Type (E Id)
++      { return Node23 (Id); }
++
++   INLINE E Parent_Subtype (E Id)
++      { return Node19 (Id); }
++
++   INLINE L Primitive_Operations (E Id)
++      { return Elist15 (Id); }
++
++   INLINE E Prival (E Id)
++      { return Node17 (Id); }
++
++   INLINE L Privals_Chain (E Id)
++      { return Elist23 (Id); }
++
++   INLINE L Private_Dependents (E Id)
++      { return Elist18 (Id); }
++
++   INLINE N Private_View (E Id)
++      { return Node22 (Id); }
++
++   INLINE E Protected_Body_Subprogram (E Id)
++      { return Node11 (Id); }
++
++   INLINE E Protected_Formal (E Id)
++      { return Node22 (Id); }
++
++   INLINE N Protected_Operation (E Id)
++      { return Node23 (Id); }
++
++   INLINE B Reachable (E Id)
++      { return Flag49 (Id); }
++
++   INLINE B Referenced (E Id)
++      { return Flag156 (Id); }
++
++   INLINE B Referenced_As_LHS (E Id)
++      { return Flag36 (Id); }
++
++   INLINE N Referenced_Object (E Id)
++      { return Node10 (Id); }
++
++   INLINE N Register_Exception_Call (E Id)
++      { return Node20 (Id); }
++
++   INLINE E Related_Array_Object (E Id)
++      { return Node19 (Id); }
++
++   INLINE E Related_Instance (E Id)
++      { return Node15 (Id); }
++
++   INLINE N Renamed_Entity (E Id)
++      { return Node18 (Id); }
++
++   INLINE N Renamed_Object (E Id)
++      { return Node18 (Id); }
++
++   INLINE U Renaming_Map (E Id)
++      { return Uint9 (Id); }
++
++   INLINE B Return_Present (E Id)
++      { return Flag54 (Id); }
++
++   INLINE B Returns_By_Ref (E Id)
++      { return Flag90 (Id); }
++
++   INLINE B Reverse_Bit_Order (E Id)
++      { return Flag164 (Base_Type (Id)); }
++
++   INLINE U RM_Size (E Id)
++      { return Uint13 (Id); }
++
++   INLINE N Scalar_Range (E Id)
++      { return Node20 (Id); }
++
++   INLINE U Scale_Value (E Id)
++      { return Uint15 (Id); }
++
++   INLINE U Scope_Depth_Value (E Id)
++      { return Uint22 (Id); }
++
++   INLINE B Sec_Stack_Needed_For_Return (E Id)
++      { return Flag167 (Id); }
++
++   INLINE S Shadow_Entities (E Id)
++      { return List14 (Id); }
++
++   INLINE E Shared_Var_Assign_Proc (E Id)
++      { return Node22 (Id); }
++
++   INLINE E Shared_Var_Read_Proc (E Id)
++      { return Node15 (Id); }
++
++   INLINE N Size_Check_Code (E Id)
++      { return Node19 (Id); }
++
++   INLINE B Size_Depends_On_Discriminant (E Id)
++      { return Flag177 (Id); }
++
++   INLINE B Size_Known_At_Compile_Time (E Id)
++      { return Flag92 (Id); }
++
++   INLINE R Small_Value (E Id)
++      { return Ureal21 (Id); }
++
++   INLINE E Spec_Entity (E Id)
++      { return Node19 (Id); }
++
++   INLINE E Storage_Size_Variable (E Id)
++      { return Node15 (Implementation_Base_Type (Id)); }
++
++   INLINE L Stored_Constraint (E Id)
++      { return Elist23 (Id); }
++
++   INLINE B Strict_Alignment (E Id)
++      { return Flag145 (Implementation_Base_Type (Id)); }
++
++   INLINE U String_Literal_Length (E Id)
++      { return Uint16 (Id); }
++
++   INLINE N String_Literal_Low_Bound (E Id)
++      { return Node15 (Id); }
++
++   INLINE B Suppress_Elaboration_Warnings (E Id)
++      { return Flag148 (Id); }
++
++   INLINE B Suppress_Init_Proc (E Id)
++      { return Flag105 (Base_Type (Id)); }
++
++   INLINE B Suppress_Style_Checks (E Id)
++      { return Flag165 (Id); }
++
++   INLINE B Treat_As_Volatile (E Id)
++      { return Flag41 (Id); }
++
++   INLINE E Underlying_Full_View (E Id)
++      { return Node19 (Id); }
++
++   INLINE N Unset_Reference (E Id)
++      { return Node16 (Id); }
++
++   INLINE B Uses_Sec_Stack (E Id)
++      { return Flag95 (Id); }
++
++   INLINE B Vax_Float (E Id)
++      { return Flag151 (Base_Type (Id)); }
++
++   INLINE B Warnings_Off (E Id)
++      { return Flag96 (Id); }
++
++   INLINE B Is_Access_Type                      (E Id)
++      { return IN (Ekind (Id), Access_Kind); }
++
++   INLINE B Is_Array_Type                       (E Id)
++      { return IN (Ekind (Id), Array_Kind); }
++
++   INLINE B Is_Class_Wide_Type                  (E Id)
++      { return IN (Ekind (Id), Class_Wide_Kind); }
++
++   INLINE B Is_Composite_Type                   (E Id)
++      { return IN (Ekind (Id), Composite_Kind); }
++
++   INLINE B Is_Concurrent_Body                  (E Id)
++      { return IN (Ekind (Id), Concurrent_Body_Kind); }
++
++   INLINE B Is_Concurrent_Record_Type           (E Id)
++      { return Flag20 (Id); }
++
++   INLINE B Is_Concurrent_Type                  (E Id)
++      { return IN (Ekind (Id), Concurrent_Kind); }
++
++   INLINE B Is_Decimal_Fixed_Point_Type         (E Id)
++      { return IN (Ekind (Id), Decimal_Fixed_Point_Kind); }
++
++   INLINE B Is_Digits_Type                      (E Id)
++      { return IN (Ekind (Id), Digits_Kind); }
++
++   INLINE B Is_Discrete_Or_Fixed_Point_Type     (E Id)
++      { return IN (Ekind (Id), Discrete_Or_Fixed_Point_Kind); }
++
++   INLINE B Is_Discrete_Type                    (E Id)
++      { return IN (Ekind (Id), Discrete_Kind); }
++
++   INLINE B Is_Elementary_Type                  (E Id)
++      { return IN (Ekind (Id), Elementary_Kind); }
++
++   INLINE B Is_Entry                            (E Id)
++      { return IN (Ekind (Id), Entry_Kind); }
++
++   INLINE B Is_Enumeration_Type                 (E Id)
++      { return IN (Ekind (Id), Enumeration_Kind); }
++
++   INLINE B Is_Fixed_Point_Type                 (E Id)
++      { return IN (Ekind (Id), Fixed_Point_Kind); }
++
++   INLINE B Is_Floating_Point_Type              (E Id)
++      { return IN (Ekind (Id), Float_Kind); }
++
++   INLINE B Is_Formal                           (E Id)
++      { return IN (Ekind (Id), Formal_Kind); }
++
++   INLINE B Is_Generic_Subprogram               (E Id)
++      { return IN (Ekind (Id), Generic_Subprogram_Kind); }
++
++   INLINE B Is_Generic_Unit                     (E Id)
++      { return IN (Ekind (Id), Generic_Unit_Kind); }
++
++   INLINE B Is_Incomplete_Or_Private_Type       (E Id)
++      { return IN (Ekind (Id), Incomplete_Or_Private_Kind); }
++
++   INLINE B Is_Integer_Type                     (E Id)
++      { return IN (Ekind (Id), Integer_Kind); }
++
++   INLINE B Is_Modular_Integer_Type             (E Id)
++      { return IN (Ekind (Id), Modular_Integer_Kind); }
++
++   INLINE B Is_Named_Number                     (E Id)
++      { return IN (Ekind (Id), Named_Kind); }
++
++   INLINE B Is_Numeric_Type                     (E Id)
++      { return IN (Ekind (Id), Numeric_Kind); }
++
++   INLINE B Is_Object                           (E Id)
++      { return IN (Ekind (Id), Object_Kind); }
++
++   INLINE B Is_Ordinary_Fixed_Point_Type        (E Id)
++      { return IN (Ekind (Id), Ordinary_Fixed_Point_Kind); }
++
++   INLINE B Is_Overloadable                     (E Id)
++      { return IN (Ekind (Id), Overloadable_Kind); }
++
++   INLINE B Is_Private_Type                     (E Id)
++      { return IN (Ekind (Id), Private_Kind); }
++
++   INLINE B Is_Protected_Type                   (E Id)
++      { return IN (Ekind (Id), Protected_Kind); }
++
++   INLINE B Is_Real_Type                        (E Id)
++      { return IN (Ekind (Id), Real_Kind); }
++
++   INLINE B Is_Record_Type                      (E Id)
++      { return IN (Ekind (Id), Record_Kind); }
++
++   INLINE B Is_Scalar_Type                      (E Id)
++      { return IN (Ekind (Id), Scalar_Kind); }
++
++   INLINE B Is_Signed_Integer_Type              (E Id)
++      { return IN (Ekind (Id), Signed_Integer_Kind); }
++
++   INLINE B Is_Subprogram                       (E Id)
++      { return IN (Ekind (Id), Subprogram_Kind); }
++
++   INLINE B Is_Task_Type                        (E Id)
++      { return IN (Ekind (Id), Task_Kind); }
++
++   INLINE B Is_Type                             (E Id)
++      { return IN (Ekind (Id), Type_Kind); }
++
++   INLINE N Entry_Index_Type (E Id)
++      { return Etype (Discrete_Subtype_Definition (Parent (Id))); }
++
++   INLINE Node_Id Next_Index (Node_Id Id)
++      { return Next (Id); }
++
++   INLINE E Next_Literal (E Id)
++      { return Next (Id); }
++
++   INLINE Formal_Kind Parameter_Mode (E Id)
++      { return Ekind (Id); }
++
++/* End of einfo.h (C version of Einfo package specification) */
+--- gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/nmake.adb.orig       1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/nmake.adb    2004-06-02 00:52:35.000000000 +0200
+@@ -0,0 +1,2867 @@
++------------------------------------------------------------------------------
++--                                                                          --
++--                         GNAT COMPILER COMPONENTS                         --
++--                                                                          --
++--                                N M A K E                                 --
++--                                                                          --
++--                                 B o d y                                  --
++--                                                                          --
++--          Copyright (C) 1992-2003 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- --
++-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
++-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
++-- for  more details.  You should have  received  a copy of the GNU General --
++-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
++-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
++-- MA 02111-1307, USA.                                                      --
++--                                                                          --
++-- GNAT was originally developed  by the GNAT team at  New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc.      --
++--                                                                          --
++------------------------------------------------------------------------------
++
++pragma Style_Checks (All_Checks);
++--  Turn off subprogram order checking, since the routines here are
++--  generated automatically in order.
++
++
++with Atree;  use Atree;
++with Sinfo;  use Sinfo;
++with Snames; use Snames;
++with Stand;  use Stand;
++
++package body Nmake is
++
++   function Make_Unused_At_Start (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Unused_At_Start, Sloc);
++   begin
++      return N;
++   end Make_Unused_At_Start;
++
++   function Make_Unused_At_End (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Unused_At_End, Sloc);
++   begin
++      return N;
++   end Make_Unused_At_End;
++
++   function Make_Identifier (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Identifier, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      return N;
++   end Make_Identifier;
++
++   function Make_Integer_Literal (Sloc : Source_Ptr;
++      Intval                       : Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Integer_Literal, Sloc);
++   begin
++      Set_Intval (N, Intval);
++      return N;
++   end Make_Integer_Literal;
++
++   function Make_Real_Literal (Sloc : Source_Ptr;
++      Realval                      : Ureal)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Real_Literal, Sloc);
++   begin
++      Set_Realval (N, Realval);
++      return N;
++   end Make_Real_Literal;
++
++   function Make_Character_Literal (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Char_Literal_Value           : Char_Code)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Character_Literal, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      Set_Char_Literal_Value (N, Char_Literal_Value);
++      return N;
++   end Make_Character_Literal;
++
++   function Make_String_Literal (Sloc : Source_Ptr;
++      Strval                       : String_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_String_Literal, Sloc);
++   begin
++      Set_Strval (N, Strval);
++      return N;
++   end Make_String_Literal;
++
++   function Make_Pragma (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Pragma_Argument_Associations : List_Id := No_List;
++      Debug_Statement              : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Pragma, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      Set_Pragma_Argument_Associations
++        (N, Pragma_Argument_Associations);
++      Set_Debug_Statement (N, Debug_Statement);
++      return N;
++   end Make_Pragma;
++
++   function Make_Pragma_Argument_Association (Sloc : Source_Ptr;
++      Chars                        : Name_Id := No_Name;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Pragma_Argument_Association, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Pragma_Argument_Association;
++
++   function Make_Defining_Identifier (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Entity (N_Defining_Identifier, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      return N;
++   end Make_Defining_Identifier;
++
++   function Make_Full_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Type_Definition              : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Full_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Type_Definition (N, Type_Definition);
++      return N;
++   end Make_Full_Type_Declaration;
++
++   function Make_Subtype_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Subtype_Indication           : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subtype_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Subtype_Indication (N, Subtype_Indication);
++      return N;
++   end Make_Subtype_Declaration;
++
++   function Make_Subtype_Indication (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Constraint                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subtype_Indication, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Constraint (N, Constraint);
++      return N;
++   end Make_Subtype_Indication;
++
++   function Make_Object_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Aliased_Present              : Boolean := False;
++      Constant_Present             : Boolean := False;
++      Object_Definition            : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Object_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Aliased_Present (N, Aliased_Present);
++      Set_Constant_Present (N, Constant_Present);
++      Set_Object_Definition (N, Object_Definition);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Object_Declaration;
++
++   function Make_Number_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Number_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Number_Declaration;
++
++   function Make_Derived_Type_Definition (Sloc : Source_Ptr;
++      Abstract_Present             : Boolean := False;
++      Subtype_Indication           : Node_Id;
++      Record_Extension_Part        : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Derived_Type_Definition, Sloc);
++   begin
++      Set_Abstract_Present (N, Abstract_Present);
++      Set_Subtype_Indication (N, Subtype_Indication);
++      Set_Record_Extension_Part (N, Record_Extension_Part);
++      return N;
++   end Make_Derived_Type_Definition;
++
++   function Make_Range_Constraint (Sloc : Source_Ptr;
++      Range_Expression             : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Range_Constraint, Sloc);
++   begin
++      Set_Range_Expression (N, Range_Expression);
++      return N;
++   end Make_Range_Constraint;
++
++   function Make_Range (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id;
++      Includes_Infinities          : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Range, Sloc);
++   begin
++      Set_Low_Bound (N, Low_Bound);
++      Set_High_Bound (N, High_Bound);
++      Set_Includes_Infinities (N, Includes_Infinities);
++      return N;
++   end Make_Range;
++
++   function Make_Enumeration_Type_Definition (Sloc : Source_Ptr;
++      Literals                     : List_Id;
++      End_Label                    : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Enumeration_Type_Definition, Sloc);
++   begin
++      Set_Literals (N, Literals);
++      Set_End_Label (N, End_Label);
++      return N;
++   end Make_Enumeration_Type_Definition;
++
++   function Make_Defining_Character_Literal (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Entity (N_Defining_Character_Literal, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      return N;
++   end Make_Defining_Character_Literal;
++
++   function Make_Signed_Integer_Type_Definition (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Signed_Integer_Type_Definition, Sloc);
++   begin
++      Set_Low_Bound (N, Low_Bound);
++      Set_High_Bound (N, High_Bound);
++      return N;
++   end Make_Signed_Integer_Type_Definition;
++
++   function Make_Modular_Type_Definition (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Modular_Type_Definition, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Modular_Type_Definition;
++
++   function Make_Floating_Point_Definition (Sloc : Source_Ptr;
++      Digits_Expression            : Node_Id;
++      Real_Range_Specification     : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Floating_Point_Definition, Sloc);
++   begin
++      Set_Digits_Expression (N, Digits_Expression);
++      Set_Real_Range_Specification (N, Real_Range_Specification);
++      return N;
++   end Make_Floating_Point_Definition;
++
++   function Make_Real_Range_Specification (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Real_Range_Specification, Sloc);
++   begin
++      Set_Low_Bound (N, Low_Bound);
++      Set_High_Bound (N, High_Bound);
++      return N;
++   end Make_Real_Range_Specification;
++
++   function Make_Ordinary_Fixed_Point_Definition (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Real_Range_Specification     : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Ordinary_Fixed_Point_Definition, Sloc);
++   begin
++      Set_Delta_Expression (N, Delta_Expression);
++      Set_Real_Range_Specification (N, Real_Range_Specification);
++      return N;
++   end Make_Ordinary_Fixed_Point_Definition;
++
++   function Make_Decimal_Fixed_Point_Definition (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Digits_Expression            : Node_Id;
++      Real_Range_Specification     : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Decimal_Fixed_Point_Definition, Sloc);
++   begin
++      Set_Delta_Expression (N, Delta_Expression);
++      Set_Digits_Expression (N, Digits_Expression);
++      Set_Real_Range_Specification (N, Real_Range_Specification);
++      return N;
++   end Make_Decimal_Fixed_Point_Definition;
++
++   function Make_Digits_Constraint (Sloc : Source_Ptr;
++      Digits_Expression            : Node_Id;
++      Range_Constraint             : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Digits_Constraint, Sloc);
++   begin
++      Set_Digits_Expression (N, Digits_Expression);
++      Set_Range_Constraint (N, Range_Constraint);
++      return N;
++   end Make_Digits_Constraint;
++
++   function Make_Unconstrained_Array_Definition (Sloc : Source_Ptr;
++      Subtype_Marks                : List_Id;
++      Component_Definition         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Unconstrained_Array_Definition, Sloc);
++   begin
++      Set_Subtype_Marks (N, Subtype_Marks);
++      Set_Component_Definition (N, Component_Definition);
++      return N;
++   end Make_Unconstrained_Array_Definition;
++
++   function Make_Constrained_Array_Definition (Sloc : Source_Ptr;
++      Discrete_Subtype_Definitions : List_Id;
++      Component_Definition         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Constrained_Array_Definition, Sloc);
++   begin
++      Set_Discrete_Subtype_Definitions
++        (N, Discrete_Subtype_Definitions);
++      Set_Component_Definition (N, Component_Definition);
++      return N;
++   end Make_Constrained_Array_Definition;
++
++   function Make_Component_Definition (Sloc : Source_Ptr;
++      Aliased_Present              : Boolean := False;
++      Subtype_Indication           : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Component_Definition, Sloc);
++   begin
++      Set_Aliased_Present (N, Aliased_Present);
++      Set_Subtype_Indication (N, Subtype_Indication);
++      return N;
++   end Make_Component_Definition;
++
++   function Make_Discriminant_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Type            : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Discriminant_Specification, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Type (N, Discriminant_Type);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Discriminant_Specification;
++
++   function Make_Index_Or_Discriminant_Constraint (Sloc : Source_Ptr;
++      Constraints                  : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Index_Or_Discriminant_Constraint, Sloc);
++   begin
++      Set_Constraints (N, Constraints);
++      return N;
++   end Make_Index_Or_Discriminant_Constraint;
++
++   function Make_Discriminant_Association (Sloc : Source_Ptr;
++      Selector_Names               : List_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Discriminant_Association, Sloc);
++   begin
++      Set_Selector_Names (N, Selector_Names);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Discriminant_Association;
++
++   function Make_Record_Definition (Sloc : Source_Ptr;
++      End_Label                    : Node_Id := Empty;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False;
++      Component_List               : Node_Id;
++      Null_Present                 : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Record_Definition, Sloc);
++   begin
++      Set_End_Label (N, End_Label);
++      Set_Abstract_Present (N, Abstract_Present);
++      Set_Tagged_Present (N, Tagged_Present);
++      Set_Limited_Present (N, Limited_Present);
++      Set_Component_List (N, Component_List);
++      Set_Null_Present (N, Null_Present);
++      return N;
++   end Make_Record_Definition;
++
++   function Make_Component_List (Sloc : Source_Ptr;
++      Component_Items              : List_Id;
++      Variant_Part                 : Node_Id := Empty;
++      Null_Present                 : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Component_List, Sloc);
++   begin
++      Set_Component_Items (N, Component_Items);
++      Set_Variant_Part (N, Variant_Part);
++      Set_Null_Present (N, Null_Present);
++      return N;
++   end Make_Component_List;
++
++   function Make_Component_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Component_Definition         : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Component_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Component_Definition (N, Component_Definition);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Component_Declaration;
++
++   function Make_Variant_Part (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Variants                     : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Variant_Part, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Variants (N, Variants);
++      return N;
++   end Make_Variant_Part;
++
++   function Make_Variant (Sloc : Source_Ptr;
++      Discrete_Choices             : List_Id;
++      Component_List               : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Variant, Sloc);
++   begin
++      Set_Discrete_Choices (N, Discrete_Choices);
++      Set_Component_List (N, Component_List);
++      return N;
++   end Make_Variant;
++
++   function Make_Others_Choice (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Others_Choice, Sloc);
++   begin
++      return N;
++   end Make_Others_Choice;
++
++   function Make_Access_To_Object_Definition (Sloc : Source_Ptr;
++      All_Present                  : Boolean := False;
++      Subtype_Indication           : Node_Id;
++      Constant_Present             : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Access_To_Object_Definition, Sloc);
++   begin
++      Set_All_Present (N, All_Present);
++      Set_Subtype_Indication (N, Subtype_Indication);
++      Set_Constant_Present (N, Constant_Present);
++      return N;
++   end Make_Access_To_Object_Definition;
++
++   function Make_Access_Function_Definition (Sloc : Source_Ptr;
++      Protected_Present            : Boolean := False;
++      Parameter_Specifications     : List_Id := No_List;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Access_Function_Definition, Sloc);
++   begin
++      Set_Protected_Present (N, Protected_Present);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      Set_Subtype_Mark (N, Subtype_Mark);
++      return N;
++   end Make_Access_Function_Definition;
++
++   function Make_Access_Procedure_Definition (Sloc : Source_Ptr;
++      Protected_Present            : Boolean := False;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Access_Procedure_Definition, Sloc);
++   begin
++      Set_Protected_Present (N, Protected_Present);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      return N;
++   end Make_Access_Procedure_Definition;
++
++   function Make_Access_Definition (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Access_Definition, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      return N;
++   end Make_Access_Definition;
++
++   function Make_Incomplete_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Incomplete_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Unknown_Discriminants_Present
++        (N, Unknown_Discriminants_Present);
++      return N;
++   end Make_Incomplete_Type_Declaration;
++
++   function Make_Explicit_Dereference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Explicit_Dereference, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      return N;
++   end Make_Explicit_Dereference;
++
++   function Make_Indexed_Component (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Expressions                  : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Indexed_Component, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      Set_Expressions (N, Expressions);
++      return N;
++   end Make_Indexed_Component;
++
++   function Make_Slice (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Discrete_Range               : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Slice, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      Set_Discrete_Range (N, Discrete_Range);
++      return N;
++   end Make_Slice;
++
++   function Make_Selected_Component (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Selector_Name                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Selected_Component, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      Set_Selector_Name (N, Selector_Name);
++      return N;
++   end Make_Selected_Component;
++
++   function Make_Attribute_Reference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Attribute_Name               : Name_Id;
++      Expressions                  : List_Id := No_List;
++      Must_Be_Byte_Aligned         : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Attribute_Reference, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      Set_Attribute_Name (N, Attribute_Name);
++      Set_Expressions (N, Expressions);
++      Set_Must_Be_Byte_Aligned (N, Must_Be_Byte_Aligned);
++      return N;
++   end Make_Attribute_Reference;
++
++   function Make_Aggregate (Sloc : Source_Ptr;
++      Expressions                  : List_Id := No_List;
++      Component_Associations       : List_Id := No_List;
++      Null_Record_Present          : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Aggregate, Sloc);
++   begin
++      Set_Expressions (N, Expressions);
++      Set_Component_Associations (N, Component_Associations);
++      Set_Null_Record_Present (N, Null_Record_Present);
++      return N;
++   end Make_Aggregate;
++
++   function Make_Component_Association (Sloc : Source_Ptr;
++      Choices                      : List_Id;
++      Expression                   : Node_Id;
++      Box_Present                  : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Component_Association, Sloc);
++   begin
++      Set_Choices (N, Choices);
++      Set_Expression (N, Expression);
++      Set_Box_Present (N, Box_Present);
++      return N;
++   end Make_Component_Association;
++
++   function Make_Extension_Aggregate (Sloc : Source_Ptr;
++      Ancestor_Part                : Node_Id;
++      Expressions                  : List_Id := No_List;
++      Component_Associations       : List_Id := No_List;
++      Null_Record_Present          : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Extension_Aggregate, Sloc);
++   begin
++      Set_Ancestor_Part (N, Ancestor_Part);
++      Set_Expressions (N, Expressions);
++      Set_Component_Associations (N, Component_Associations);
++      Set_Null_Record_Present (N, Null_Record_Present);
++      return N;
++   end Make_Extension_Aggregate;
++
++   function Make_Null (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Null, Sloc);
++   begin
++      return N;
++   end Make_Null;
++
++   function Make_And_Then (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_And_Then, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      return N;
++   end Make_And_Then;
++
++   function Make_Or_Else (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Or_Else, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      return N;
++   end Make_Or_Else;
++
++   function Make_In (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_In, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      return N;
++   end Make_In;
++
++   function Make_Not_In (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Not_In, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      return N;
++   end Make_Not_In;
++
++   function Make_Op_And (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_And, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_And);
++      Set_Entity (N, Standard_Op_And);
++      return N;
++   end Make_Op_And;
++
++   function Make_Op_Or (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Or, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Or);
++      Set_Entity (N, Standard_Op_Or);
++      return N;
++   end Make_Op_Or;
++
++   function Make_Op_Xor (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Xor, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Xor);
++      Set_Entity (N, Standard_Op_Xor);
++      return N;
++   end Make_Op_Xor;
++
++   function Make_Op_Eq (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Eq, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Eq);
++      Set_Entity (N, Standard_Op_Eq);
++      return N;
++   end Make_Op_Eq;
++
++   function Make_Op_Ne (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Ne, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Ne);
++      Set_Entity (N, Standard_Op_Ne);
++      return N;
++   end Make_Op_Ne;
++
++   function Make_Op_Lt (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Lt, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Lt);
++      Set_Entity (N, Standard_Op_Lt);
++      return N;
++   end Make_Op_Lt;
++
++   function Make_Op_Le (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Le, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Le);
++      Set_Entity (N, Standard_Op_Le);
++      return N;
++   end Make_Op_Le;
++
++   function Make_Op_Gt (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Gt, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Gt);
++      Set_Entity (N, Standard_Op_Gt);
++      return N;
++   end Make_Op_Gt;
++
++   function Make_Op_Ge (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Ge, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Ge);
++      Set_Entity (N, Standard_Op_Ge);
++      return N;
++   end Make_Op_Ge;
++
++   function Make_Op_Add (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Add, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Add);
++      Set_Entity (N, Standard_Op_Add);
++      return N;
++   end Make_Op_Add;
++
++   function Make_Op_Subtract (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Subtract, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Subtract);
++      Set_Entity (N, Standard_Op_Subtract);
++      return N;
++   end Make_Op_Subtract;
++
++   function Make_Op_Concat (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Concat, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Concat);
++      Set_Entity (N, Standard_Op_Concat);
++      return N;
++   end Make_Op_Concat;
++
++   function Make_Op_Multiply (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Multiply, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Multiply);
++      Set_Entity (N, Standard_Op_Multiply);
++      return N;
++   end Make_Op_Multiply;
++
++   function Make_Op_Divide (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Divide, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Divide);
++      Set_Entity (N, Standard_Op_Divide);
++      return N;
++   end Make_Op_Divide;
++
++   function Make_Op_Mod (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Mod, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Mod);
++      Set_Entity (N, Standard_Op_Mod);
++      return N;
++   end Make_Op_Mod;
++
++   function Make_Op_Rem (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Rem, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Rem);
++      Set_Entity (N, Standard_Op_Rem);
++      return N;
++   end Make_Op_Rem;
++
++   function Make_Op_Expon (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Expon, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Expon);
++      Set_Entity (N, Standard_Op_Expon);
++      return N;
++   end Make_Op_Expon;
++
++   function Make_Op_Plus (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Plus, Sloc);
++   begin
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Add);
++      Set_Entity (N, Standard_Op_Plus);
++      return N;
++   end Make_Op_Plus;
++
++   function Make_Op_Minus (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Minus, Sloc);
++   begin
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Subtract);
++      Set_Entity (N, Standard_Op_Minus);
++      return N;
++   end Make_Op_Minus;
++
++   function Make_Op_Abs (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Abs, Sloc);
++   begin
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Abs);
++      Set_Entity (N, Standard_Op_Abs);
++      return N;
++   end Make_Op_Abs;
++
++   function Make_Op_Not (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Not, Sloc);
++   begin
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Op_Not);
++      Set_Entity (N, Standard_Op_Not);
++      return N;
++   end Make_Op_Not;
++
++   function Make_Type_Conversion (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Type_Conversion, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Type_Conversion;
++
++   function Make_Qualified_Expression (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Qualified_Expression, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Qualified_Expression;
++
++   function Make_Allocator (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Allocator, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Allocator;
++
++   function Make_Null_Statement (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Null_Statement, Sloc);
++   begin
++      return N;
++   end Make_Null_Statement;
++
++   function Make_Label (Sloc : Source_Ptr;
++      Identifier                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Label, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      return N;
++   end Make_Label;
++
++   function Make_Assignment_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Assignment_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Assignment_Statement;
++
++   function Make_If_Statement (Sloc : Source_Ptr;
++      Condition                    : Node_Id;
++      Then_Statements              : List_Id;
++      Elsif_Parts                  : List_Id := No_List;
++      Else_Statements              : List_Id := No_List;
++      End_Span                     : Uint := No_Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_If_Statement, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Then_Statements (N, Then_Statements);
++      Set_Elsif_Parts (N, Elsif_Parts);
++      Set_Else_Statements (N, Else_Statements);
++      Set_End_Span (N, End_Span);
++      return N;
++   end Make_If_Statement;
++
++   function Make_Elsif_Part (Sloc : Source_Ptr;
++      Condition                    : Node_Id;
++      Then_Statements              : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Elsif_Part, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Then_Statements (N, Then_Statements);
++      return N;
++   end Make_Elsif_Part;
++
++   function Make_Case_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id;
++      Alternatives                 : List_Id;
++      End_Span                     : Uint := No_Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Case_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      Set_Alternatives (N, Alternatives);
++      Set_End_Span (N, End_Span);
++      return N;
++   end Make_Case_Statement;
++
++   function Make_Case_Statement_Alternative (Sloc : Source_Ptr;
++      Discrete_Choices             : List_Id;
++      Statements                   : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Case_Statement_Alternative, Sloc);
++   begin
++      Set_Discrete_Choices (N, Discrete_Choices);
++      Set_Statements (N, Statements);
++      return N;
++   end Make_Case_Statement_Alternative;
++
++   function Make_Loop_Statement (Sloc : Source_Ptr;
++      Identifier                   : Node_Id := Empty;
++      Iteration_Scheme             : Node_Id := Empty;
++      Statements                   : List_Id;
++      End_Label                    : Node_Id;
++      Has_Created_Identifier       : Boolean := False;
++      Is_Null_Loop                 : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Loop_Statement, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      Set_Iteration_Scheme (N, Iteration_Scheme);
++      Set_Statements (N, Statements);
++      Set_End_Label (N, End_Label);
++      Set_Has_Created_Identifier (N, Has_Created_Identifier);
++      Set_Is_Null_Loop (N, Is_Null_Loop);
++      return N;
++   end Make_Loop_Statement;
++
++   function Make_Iteration_Scheme (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Loop_Parameter_Specification : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Iteration_Scheme, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Loop_Parameter_Specification
++        (N, Loop_Parameter_Specification);
++      return N;
++   end Make_Iteration_Scheme;
++
++   function Make_Loop_Parameter_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Reverse_Present              : Boolean := False;
++      Discrete_Subtype_Definition  : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Loop_Parameter_Specification, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Reverse_Present (N, Reverse_Present);
++      Set_Discrete_Subtype_Definition (N, Discrete_Subtype_Definition);
++      return N;
++   end Make_Loop_Parameter_Specification;
++
++   function Make_Block_Statement (Sloc : Source_Ptr;
++      Identifier                   : Node_Id := Empty;
++      Declarations                 : List_Id := No_List;
++      Handled_Statement_Sequence   : Node_Id;
++      Has_Created_Identifier       : Boolean := False;
++      Is_Task_Allocation_Block     : Boolean := False;
++      Is_Asynchronous_Call_Block   : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Block_Statement, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      Set_Declarations (N, Declarations);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      Set_Has_Created_Identifier (N, Has_Created_Identifier);
++      Set_Is_Task_Allocation_Block (N, Is_Task_Allocation_Block);
++      Set_Is_Asynchronous_Call_Block (N, Is_Asynchronous_Call_Block);
++      return N;
++   end Make_Block_Statement;
++
++   function Make_Exit_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id := Empty;
++      Condition                    : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Exit_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Condition (N, Condition);
++      return N;
++   end Make_Exit_Statement;
++
++   function Make_Goto_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Goto_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      return N;
++   end Make_Goto_Statement;
++
++   function Make_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subprogram_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      return N;
++   end Make_Subprogram_Declaration;
++
++   function Make_Abstract_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Abstract_Subprogram_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      return N;
++   end Make_Abstract_Subprogram_Declaration;
++
++   function Make_Function_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Parameter_Specifications     : List_Id := No_List;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Function_Specification, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      Set_Subtype_Mark (N, Subtype_Mark);
++      return N;
++   end Make_Function_Specification;
++
++   function Make_Procedure_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Procedure_Specification, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      return N;
++   end Make_Procedure_Specification;
++
++   function Make_Designator (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Identifier                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Designator, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Identifier (N, Identifier);
++      return N;
++   end Make_Designator;
++
++   function Make_Defining_Program_Unit_Name (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Defining_Program_Unit_Name, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Defining_Program_Unit_Name;
++
++   function Make_Operator_Symbol (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Strval                       : String_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Operator_Symbol, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      Set_Strval (N, Strval);
++      return N;
++   end Make_Operator_Symbol;
++
++   function Make_Defining_Operator_Symbol (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Entity (N_Defining_Operator_Symbol, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      return N;
++   end Make_Defining_Operator_Symbol;
++
++   function Make_Parameter_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      In_Present                   : Boolean := False;
++      Out_Present                  : Boolean := False;
++      Parameter_Type               : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Parameter_Specification, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_In_Present (N, In_Present);
++      Set_Out_Present (N, Out_Present);
++      Set_Parameter_Type (N, Parameter_Type);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Parameter_Specification;
++
++   function Make_Subprogram_Body (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id;
++      Bad_Is_Detected              : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subprogram_Body, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      Set_Declarations (N, Declarations);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      Set_Bad_Is_Detected (N, Bad_Is_Detected);
++      return N;
++   end Make_Subprogram_Body;
++
++   function Make_Procedure_Call_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Procedure_Call_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Parameter_Associations (N, Parameter_Associations);
++      return N;
++   end Make_Procedure_Call_Statement;
++
++   function Make_Function_Call (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Function_Call, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Parameter_Associations (N, Parameter_Associations);
++      return N;
++   end Make_Function_Call;
++
++   function Make_Parameter_Association (Sloc : Source_Ptr;
++      Selector_Name                : Node_Id;
++      Explicit_Actual_Parameter    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Parameter_Association, Sloc);
++   begin
++      Set_Selector_Name (N, Selector_Name);
++      Set_Explicit_Actual_Parameter (N, Explicit_Actual_Parameter);
++      return N;
++   end Make_Parameter_Association;
++
++   function Make_Return_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Return_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Return_Statement;
++
++   function Make_Package_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      return N;
++   end Make_Package_Declaration;
++
++   function Make_Package_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Specification, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Visible_Declarations (N, Visible_Declarations);
++      Set_Private_Declarations (N, Private_Declarations);
++      Set_End_Label (N, End_Label);
++      return N;
++   end Make_Package_Specification;
++
++   function Make_Package_Body (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Body, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Declarations (N, Declarations);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      return N;
++   end Make_Package_Body;
++
++   function Make_Private_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Private_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Unknown_Discriminants_Present
++        (N, Unknown_Discriminants_Present);
++      Set_Abstract_Present (N, Abstract_Present);
++      Set_Tagged_Present (N, Tagged_Present);
++      Set_Limited_Present (N, Limited_Present);
++      return N;
++   end Make_Private_Type_Declaration;
++
++   function Make_Private_Extension_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False;
++      Abstract_Present             : Boolean := False;
++      Subtype_Indication           : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Private_Extension_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Unknown_Discriminants_Present
++        (N, Unknown_Discriminants_Present);
++      Set_Abstract_Present (N, Abstract_Present);
++      Set_Subtype_Indication (N, Subtype_Indication);
++      return N;
++   end Make_Private_Extension_Declaration;
++
++   function Make_Use_Package_Clause (Sloc : Source_Ptr;
++      Names                        : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Use_Package_Clause, Sloc);
++   begin
++      Set_Names (N, Names);
++      return N;
++   end Make_Use_Package_Clause;
++
++   function Make_Use_Type_Clause (Sloc : Source_Ptr;
++      Subtype_Marks                : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Use_Type_Clause, Sloc);
++   begin
++      Set_Subtype_Marks (N, Subtype_Marks);
++      return N;
++   end Make_Use_Type_Clause;
++
++   function Make_Object_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Subtype_Mark                 : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Object_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Name (N, Name);
++      return N;
++   end Make_Object_Renaming_Declaration;
++
++   function Make_Exception_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Exception_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Name (N, Name);
++      return N;
++   end Make_Exception_Renaming_Declaration;
++
++   function Make_Package_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      return N;
++   end Make_Package_Renaming_Declaration;
++
++   function Make_Subprogram_Renaming_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subprogram_Renaming_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      Set_Name (N, Name);
++      return N;
++   end Make_Subprogram_Renaming_Declaration;
++
++   function Make_Generic_Package_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Package_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      return N;
++   end Make_Generic_Package_Renaming_Declaration;
++
++   function Make_Generic_Procedure_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Procedure_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      return N;
++   end Make_Generic_Procedure_Renaming_Declaration;
++
++   function Make_Generic_Function_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Function_Renaming_Declaration, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      return N;
++   end Make_Generic_Function_Renaming_Declaration;
++
++   function Make_Task_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Task_Definition              : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Task_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Task_Definition (N, Task_Definition);
++      return N;
++   end Make_Task_Type_Declaration;
++
++   function Make_Single_Task_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Task_Definition              : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Single_Task_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Task_Definition (N, Task_Definition);
++      return N;
++   end Make_Single_Task_Declaration;
++
++   function Make_Task_Definition (Sloc : Source_Ptr;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Task_Definition, Sloc);
++   begin
++      Set_Visible_Declarations (N, Visible_Declarations);
++      Set_Private_Declarations (N, Private_Declarations);
++      Set_End_Label (N, End_Label);
++      return N;
++   end Make_Task_Definition;
++
++   function Make_Task_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Task_Body, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Declarations (N, Declarations);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      return N;
++   end Make_Task_Body;
++
++   function Make_Protected_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Protected_Definition         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Protected_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Protected_Definition (N, Protected_Definition);
++      return N;
++   end Make_Protected_Type_Declaration;
++
++   function Make_Single_Protected_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Protected_Definition         : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Single_Protected_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Protected_Definition (N, Protected_Definition);
++      return N;
++   end Make_Single_Protected_Declaration;
++
++   function Make_Protected_Definition (Sloc : Source_Ptr;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Protected_Definition, Sloc);
++   begin
++      Set_Visible_Declarations (N, Visible_Declarations);
++      Set_Private_Declarations (N, Private_Declarations);
++      Set_End_Label (N, End_Label);
++      return N;
++   end Make_Protected_Definition;
++
++   function Make_Protected_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Declarations                 : List_Id;
++      End_Label                    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Protected_Body, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Declarations (N, Declarations);
++      Set_End_Label (N, End_Label);
++      return N;
++   end Make_Protected_Body;
++
++   function Make_Entry_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discrete_Subtype_Definition  : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discrete_Subtype_Definition (N, Discrete_Subtype_Definition);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      return N;
++   end Make_Entry_Declaration;
++
++   function Make_Accept_Statement (Sloc : Source_Ptr;
++      Entry_Direct_Name            : Node_Id;
++      Entry_Index                  : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List;
++      Handled_Statement_Sequence   : Node_Id;
++      Declarations                 : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Accept_Statement, Sloc);
++   begin
++      Set_Entry_Direct_Name (N, Entry_Direct_Name);
++      Set_Entry_Index (N, Entry_Index);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      Set_Declarations (N, Declarations);
++      return N;
++   end Make_Accept_Statement;
++
++   function Make_Entry_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Entry_Body_Formal_Part       : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Body, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Entry_Body_Formal_Part (N, Entry_Body_Formal_Part);
++      Set_Declarations (N, Declarations);
++      Set_Handled_Statement_Sequence (N, Handled_Statement_Sequence);
++      return N;
++   end Make_Entry_Body;
++
++   function Make_Entry_Body_Formal_Part (Sloc : Source_Ptr;
++      Entry_Index_Specification    : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List;
++      Condition                    : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Body_Formal_Part, Sloc);
++   begin
++      Set_Entry_Index_Specification (N, Entry_Index_Specification);
++      Set_Parameter_Specifications (N, Parameter_Specifications);
++      Set_Condition (N, Condition);
++      return N;
++   end Make_Entry_Body_Formal_Part;
++
++   function Make_Entry_Index_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discrete_Subtype_Definition  : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Index_Specification, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Discrete_Subtype_Definition (N, Discrete_Subtype_Definition);
++      return N;
++   end Make_Entry_Index_Specification;
++
++   function Make_Entry_Call_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Call_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Parameter_Associations (N, Parameter_Associations);
++      return N;
++   end Make_Entry_Call_Statement;
++
++   function Make_Requeue_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Abort_Present                : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Requeue_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Abort_Present (N, Abort_Present);
++      return N;
++   end Make_Requeue_Statement;
++
++   function Make_Delay_Until_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Delay_Until_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Delay_Until_Statement;
++
++   function Make_Delay_Relative_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Delay_Relative_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Delay_Relative_Statement;
++
++   function Make_Selective_Accept (Sloc : Source_Ptr;
++      Select_Alternatives          : List_Id;
++      Else_Statements              : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Selective_Accept, Sloc);
++   begin
++      Set_Select_Alternatives (N, Select_Alternatives);
++      Set_Else_Statements (N, Else_Statements);
++      return N;
++   end Make_Selective_Accept;
++
++   function Make_Accept_Alternative (Sloc : Source_Ptr;
++      Accept_Statement             : Node_Id;
++      Condition                    : Node_Id := Empty;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Accept_Alternative, Sloc);
++   begin
++      Set_Accept_Statement (N, Accept_Statement);
++      Set_Condition (N, Condition);
++      Set_Statements (N, Statements);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      return N;
++   end Make_Accept_Alternative;
++
++   function Make_Delay_Alternative (Sloc : Source_Ptr;
++      Delay_Statement              : Node_Id;
++      Condition                    : Node_Id := Empty;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Delay_Alternative, Sloc);
++   begin
++      Set_Delay_Statement (N, Delay_Statement);
++      Set_Condition (N, Condition);
++      Set_Statements (N, Statements);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      return N;
++   end Make_Delay_Alternative;
++
++   function Make_Terminate_Alternative (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Pragmas_Before               : List_Id := No_List;
++      Pragmas_After                : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Terminate_Alternative, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      Set_Pragmas_After (N, Pragmas_After);
++      return N;
++   end Make_Terminate_Alternative;
++
++   function Make_Timed_Entry_Call (Sloc : Source_Ptr;
++      Entry_Call_Alternative       : Node_Id;
++      Delay_Alternative            : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Timed_Entry_Call, Sloc);
++   begin
++      Set_Entry_Call_Alternative (N, Entry_Call_Alternative);
++      Set_Delay_Alternative (N, Delay_Alternative);
++      return N;
++   end Make_Timed_Entry_Call;
++
++   function Make_Entry_Call_Alternative (Sloc : Source_Ptr;
++      Entry_Call_Statement         : Node_Id;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Entry_Call_Alternative, Sloc);
++   begin
++      Set_Entry_Call_Statement (N, Entry_Call_Statement);
++      Set_Statements (N, Statements);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      return N;
++   end Make_Entry_Call_Alternative;
++
++   function Make_Conditional_Entry_Call (Sloc : Source_Ptr;
++      Entry_Call_Alternative       : Node_Id;
++      Else_Statements              : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Conditional_Entry_Call, Sloc);
++   begin
++      Set_Entry_Call_Alternative (N, Entry_Call_Alternative);
++      Set_Else_Statements (N, Else_Statements);
++      return N;
++   end Make_Conditional_Entry_Call;
++
++   function Make_Asynchronous_Select (Sloc : Source_Ptr;
++      Triggering_Alternative       : Node_Id;
++      Abortable_Part               : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Asynchronous_Select, Sloc);
++   begin
++      Set_Triggering_Alternative (N, Triggering_Alternative);
++      Set_Abortable_Part (N, Abortable_Part);
++      return N;
++   end Make_Asynchronous_Select;
++
++   function Make_Triggering_Alternative (Sloc : Source_Ptr;
++      Triggering_Statement         : Node_Id;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Triggering_Alternative, Sloc);
++   begin
++      Set_Triggering_Statement (N, Triggering_Statement);
++      Set_Statements (N, Statements);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      return N;
++   end Make_Triggering_Alternative;
++
++   function Make_Abortable_Part (Sloc : Source_Ptr;
++      Statements                   : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Abortable_Part, Sloc);
++   begin
++      Set_Statements (N, Statements);
++      return N;
++   end Make_Abortable_Part;
++
++   function Make_Abort_Statement (Sloc : Source_Ptr;
++      Names                        : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Abort_Statement, Sloc);
++   begin
++      Set_Names (N, Names);
++      return N;
++   end Make_Abort_Statement;
++
++   function Make_Compilation_Unit (Sloc : Source_Ptr;
++      Context_Items                : List_Id;
++      Private_Present              : Boolean := False;
++      Unit                         : Node_Id;
++      Aux_Decls_Node               : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Compilation_Unit, Sloc);
++   begin
++      Set_Context_Items (N, Context_Items);
++      Set_Private_Present (N, Private_Present);
++      Set_Unit (N, Unit);
++      Set_Aux_Decls_Node (N, Aux_Decls_Node);
++      return N;
++   end Make_Compilation_Unit;
++
++   function Make_Compilation_Unit_Aux (Sloc : Source_Ptr;
++      Declarations                 : List_Id := No_List;
++      Actions                      : List_Id := No_List;
++      Pragmas_After                : List_Id := No_List;
++      Config_Pragmas               : List_Id := Empty_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Compilation_Unit_Aux, Sloc);
++   begin
++      Set_Declarations (N, Declarations);
++      Set_Actions (N, Actions);
++      Set_Pragmas_After (N, Pragmas_After);
++      Set_Config_Pragmas (N, Config_Pragmas);
++      return N;
++   end Make_Compilation_Unit_Aux;
++
++   function Make_With_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      First_Name                   : Boolean := True;
++      Last_Name                    : Boolean := True;
++      Limited_Present              : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_With_Clause, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_First_Name (N, First_Name);
++      Set_Last_Name (N, Last_Name);
++      Set_Limited_Present (N, Limited_Present);
++      return N;
++   end Make_With_Clause;
++
++   function Make_With_Type_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Tagged_Present               : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_With_Type_Clause, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Tagged_Present (N, Tagged_Present);
++      return N;
++   end Make_With_Type_Clause;
++
++   function Make_Subprogram_Body_Stub (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subprogram_Body_Stub, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      return N;
++   end Make_Subprogram_Body_Stub;
++
++   function Make_Package_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Body_Stub, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Package_Body_Stub;
++
++   function Make_Task_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Task_Body_Stub, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Task_Body_Stub;
++
++   function Make_Protected_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Protected_Body_Stub, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Protected_Body_Stub;
++
++   function Make_Subunit (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Proper_Body                  : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subunit, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Proper_Body (N, Proper_Body);
++      return N;
++   end Make_Subunit;
++
++   function Make_Exception_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Exception_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Exception_Declaration;
++
++   function Make_Handled_Sequence_Of_Statements (Sloc : Source_Ptr;
++      Statements                   : List_Id;
++      End_Label                    : Node_Id := Empty;
++      Exception_Handlers           : List_Id := No_List;
++      At_End_Proc                  : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Handled_Sequence_Of_Statements, Sloc);
++   begin
++      Set_Statements (N, Statements);
++      Set_End_Label (N, End_Label);
++      Set_Exception_Handlers (N, Exception_Handlers);
++      Set_At_End_Proc (N, At_End_Proc);
++      return N;
++   end Make_Handled_Sequence_Of_Statements;
++
++   function Make_Exception_Handler (Sloc : Source_Ptr;
++      Choice_Parameter             : Node_Id := Empty;
++      Exception_Choices            : List_Id;
++      Statements                   : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Exception_Handler, Sloc);
++   begin
++      Set_Choice_Parameter (N, Choice_Parameter);
++      Set_Exception_Choices (N, Exception_Choices);
++      Set_Statements (N, Statements);
++      return N;
++   end Make_Exception_Handler;
++
++   function Make_Raise_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Raise_Statement, Sloc);
++   begin
++      Set_Name (N, Name);
++      return N;
++   end Make_Raise_Statement;
++
++   function Make_Generic_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Generic_Formal_Declarations  : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Subprogram_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      Set_Generic_Formal_Declarations (N, Generic_Formal_Declarations);
++      return N;
++   end Make_Generic_Subprogram_Declaration;
++
++   function Make_Generic_Package_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Generic_Formal_Declarations  : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Package_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      Set_Generic_Formal_Declarations (N, Generic_Formal_Declarations);
++      return N;
++   end Make_Generic_Package_Declaration;
++
++   function Make_Package_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Package_Instantiation, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      Set_Generic_Associations (N, Generic_Associations);
++      return N;
++   end Make_Package_Instantiation;
++
++   function Make_Procedure_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Procedure_Instantiation, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      Set_Generic_Associations (N, Generic_Associations);
++      return N;
++   end Make_Procedure_Instantiation;
++
++   function Make_Function_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Function_Instantiation, Sloc);
++   begin
++      Set_Defining_Unit_Name (N, Defining_Unit_Name);
++      Set_Name (N, Name);
++      Set_Generic_Associations (N, Generic_Associations);
++      return N;
++   end Make_Function_Instantiation;
++
++   function Make_Generic_Association (Sloc : Source_Ptr;
++      Selector_Name                : Node_Id := Empty;
++      Explicit_Generic_Actual_Parameter : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Generic_Association, Sloc);
++   begin
++      Set_Selector_Name (N, Selector_Name);
++      Set_Explicit_Generic_Actual_Parameter
++        (N, Explicit_Generic_Actual_Parameter);
++      return N;
++   end Make_Generic_Association;
++
++   function Make_Formal_Object_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      In_Present                   : Boolean := False;
++      Out_Present                  : Boolean := False;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Object_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_In_Present (N, In_Present);
++      Set_Out_Present (N, Out_Present);
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Formal_Object_Declaration;
++
++   function Make_Formal_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Formal_Type_Definition       : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Type_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Formal_Type_Definition (N, Formal_Type_Definition);
++      Set_Discriminant_Specifications (N, Discriminant_Specifications);
++      Set_Unknown_Discriminants_Present
++        (N, Unknown_Discriminants_Present);
++      return N;
++   end Make_Formal_Type_Declaration;
++
++   function Make_Formal_Private_Type_Definition (Sloc : Source_Ptr;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Private_Type_Definition, Sloc);
++   begin
++      Set_Abstract_Present (N, Abstract_Present);
++      Set_Tagged_Present (N, Tagged_Present);
++      Set_Limited_Present (N, Limited_Present);
++      return N;
++   end Make_Formal_Private_Type_Definition;
++
++   function Make_Formal_Derived_Type_Definition (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Private_Present              : Boolean := False;
++      Abstract_Present             : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Derived_Type_Definition, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Private_Present (N, Private_Present);
++      Set_Abstract_Present (N, Abstract_Present);
++      return N;
++   end Make_Formal_Derived_Type_Definition;
++
++   function Make_Formal_Discrete_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Discrete_Type_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Discrete_Type_Definition;
++
++   function Make_Formal_Signed_Integer_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Signed_Integer_Type_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Signed_Integer_Type_Definition;
++
++   function Make_Formal_Modular_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Modular_Type_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Modular_Type_Definition;
++
++   function Make_Formal_Floating_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Floating_Point_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Floating_Point_Definition;
++
++   function Make_Formal_Ordinary_Fixed_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Ordinary_Fixed_Point_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Ordinary_Fixed_Point_Definition;
++
++   function Make_Formal_Decimal_Fixed_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Decimal_Fixed_Point_Definition, Sloc);
++   begin
++      return N;
++   end Make_Formal_Decimal_Fixed_Point_Definition;
++
++   function Make_Formal_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Default_Name                 : Node_Id := Empty;
++      Box_Present                  : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Subprogram_Declaration, Sloc);
++   begin
++      Set_Specification (N, Specification);
++      Set_Default_Name (N, Default_Name);
++      Set_Box_Present (N, Box_Present);
++      return N;
++   end Make_Formal_Subprogram_Declaration;
++
++   function Make_Formal_Package_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List;
++      Box_Present                  : Boolean := False)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Formal_Package_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      Set_Name (N, Name);
++      Set_Generic_Associations (N, Generic_Associations);
++      Set_Box_Present (N, Box_Present);
++      return N;
++   end Make_Formal_Package_Declaration;
++
++   function Make_Attribute_Definition_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Chars                        : Name_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Attribute_Definition_Clause, Sloc);
++   begin
++      Set_Name (N, Name);
++      Set_Chars (N, Chars);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Attribute_Definition_Clause;
++
++   function Make_Enumeration_Representation_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Array_Aggregate              : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Enumeration_Representation_Clause, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      Set_Array_Aggregate (N, Array_Aggregate);
++      return N;
++   end Make_Enumeration_Representation_Clause;
++
++   function Make_Record_Representation_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Mod_Clause                   : Node_Id := Empty;
++      Component_Clauses            : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Record_Representation_Clause, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      Set_Mod_Clause (N, Mod_Clause);
++      Set_Component_Clauses (N, Component_Clauses);
++      return N;
++   end Make_Record_Representation_Clause;
++
++   function Make_Component_Clause (Sloc : Source_Ptr;
++      Component_Name               : Node_Id;
++      Position                     : Node_Id;
++      First_Bit                    : Node_Id;
++      Last_Bit                     : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Component_Clause, Sloc);
++   begin
++      Set_Component_Name (N, Component_Name);
++      Set_Position (N, Position);
++      Set_First_Bit (N, First_Bit);
++      Set_Last_Bit (N, Last_Bit);
++      return N;
++   end Make_Component_Clause;
++
++   function Make_Code_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Code_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Code_Statement;
++
++   function Make_Op_Rotate_Left (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Rotate_Left, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Rotate_Left);
++      Set_Entity (N, Standard_Op_Rotate_Left);
++      return N;
++   end Make_Op_Rotate_Left;
++
++   function Make_Op_Rotate_Right (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Rotate_Right, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Rotate_Right);
++      Set_Entity (N, Standard_Op_Rotate_Right);
++      return N;
++   end Make_Op_Rotate_Right;
++
++   function Make_Op_Shift_Left (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Shift_Left, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Shift_Left);
++      Set_Entity (N, Standard_Op_Shift_Left);
++      return N;
++   end Make_Op_Shift_Left;
++
++   function Make_Op_Shift_Right_Arithmetic (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Shift_Right_Arithmetic, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Shift_Right_Arithmetic);
++      Set_Entity (N, Standard_Op_Shift_Right_Arithmetic);
++      return N;
++   end Make_Op_Shift_Right_Arithmetic;
++
++   function Make_Op_Shift_Right (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Op_Shift_Right, Sloc);
++   begin
++      Set_Left_Opnd (N, Left_Opnd);
++      Set_Right_Opnd (N, Right_Opnd);
++      Set_Chars (N, Name_Shift_Right);
++      Set_Entity (N, Standard_Op_Shift_Right);
++      return N;
++   end Make_Op_Shift_Right;
++
++   function Make_Delta_Constraint (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Range_Constraint             : Node_Id := Empty)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Delta_Constraint, Sloc);
++   begin
++      Set_Delta_Expression (N, Delta_Expression);
++      Set_Range_Constraint (N, Range_Constraint);
++      return N;
++   end Make_Delta_Constraint;
++
++   function Make_At_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_At_Clause, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_At_Clause;
++
++   function Make_Mod_Clause (Sloc : Source_Ptr;
++      Expression                   : Node_Id;
++      Pragmas_Before               : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Mod_Clause, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      Set_Pragmas_Before (N, Pragmas_Before);
++      return N;
++   end Make_Mod_Clause;
++
++   function Make_Conditional_Expression (Sloc : Source_Ptr;
++      Expressions                  : List_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Conditional_Expression, Sloc);
++   begin
++      Set_Expressions (N, Expressions);
++      return N;
++   end Make_Conditional_Expression;
++
++   function Make_Expanded_Name (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Prefix                       : Node_Id;
++      Selector_Name                : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Expanded_Name, Sloc);
++   begin
++      Set_Chars (N, Chars);
++      Set_Prefix (N, Prefix);
++      Set_Selector_Name (N, Selector_Name);
++      return N;
++   end Make_Expanded_Name;
++
++   function Make_Free_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Free_Statement, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Free_Statement;
++
++   function Make_Freeze_Entity (Sloc : Source_Ptr;
++      Actions                      : List_Id := No_List)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Freeze_Entity, Sloc);
++   begin
++      Set_Actions (N, Actions);
++      return N;
++   end Make_Freeze_Entity;
++
++   function Make_Implicit_Label_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Implicit_Label_Declaration, Sloc);
++   begin
++      Set_Defining_Identifier (N, Defining_Identifier);
++      return N;
++   end Make_Implicit_Label_Declaration;
++
++   function Make_Itype_Reference (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Itype_Reference, Sloc);
++   begin
++      return N;
++   end Make_Itype_Reference;
++
++   function Make_Raise_Constraint_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Raise_Constraint_Error, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Reason (N, Reason);
++      return N;
++   end Make_Raise_Constraint_Error;
++
++   function Make_Raise_Program_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Raise_Program_Error, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Reason (N, Reason);
++      return N;
++   end Make_Raise_Program_Error;
++
++   function Make_Raise_Storage_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Raise_Storage_Error, Sloc);
++   begin
++      Set_Condition (N, Condition);
++      Set_Reason (N, Reason);
++      return N;
++   end Make_Raise_Storage_Error;
++
++   function Make_Reference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Reference, Sloc);
++   begin
++      Set_Prefix (N, Prefix);
++      return N;
++   end Make_Reference;
++
++   function Make_Subprogram_Info (Sloc : Source_Ptr;
++      Identifier                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Subprogram_Info, Sloc);
++   begin
++      Set_Identifier (N, Identifier);
++      return N;
++   end Make_Subprogram_Info;
++
++   function Make_Unchecked_Expression (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Unchecked_Expression, Sloc);
++   begin
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Unchecked_Expression;
++
++   function Make_Unchecked_Type_Conversion (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Unchecked_Type_Conversion, Sloc);
++   begin
++      Set_Subtype_Mark (N, Subtype_Mark);
++      Set_Expression (N, Expression);
++      return N;
++   end Make_Unchecked_Type_Conversion;
++
++   function Make_Validate_Unchecked_Conversion (Sloc : Source_Ptr)
++      return Node_Id
++   is
++      N : constant Node_Id :=
++            New_Node (N_Validate_Unchecked_Conversion, Sloc);
++   begin
++      return N;
++   end Make_Validate_Unchecked_Conversion;
++
++end Nmake;
+--- gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/nmake.ads.orig       1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/nmake.ads    2004-06-02 00:52:35.000000000 +0200
+@@ -0,0 +1,1351 @@
++------------------------------------------------------------------------------
++--                                                                          --
++--                         GNAT COMPILER COMPONENTS                         --
++--                                                                          --
++--                                N M A K E                                 --
++--                                                                          --
++--                                 S p e c                                  --
++--                                                                          --
++--          Copyright (C) 1992-2003 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- --
++-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
++-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
++-- for  more details.  You should have  received  a copy of the GNU General --
++-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
++-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
++-- MA 02111-1307, USA.                                                      --
++--                                                                          --
++-- GNAT was originally developed  by the GNAT team at  New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc.      --
++--                                                                          --
++------------------------------------------------------------------------------
++
++pragma Style_Checks (All_Checks);
++--  Turn off subprogram order checking, since the routines here are
++--  generated automatically in order.
++
++
++with Nlists; use Nlists;
++with Types;  use Types;
++with Uintp;  use Uintp;
++with Urealp; use Urealp;
++
++package Nmake is
++
++--  This package contains a set of routines used to construct tree nodes
++--  using a functional style. There is one routine for each node type defined
++--  in Sinfo with the general interface:
++
++--    function Make_xxx (Sloc : Source_Ptr,
++--                       Field_Name_1 : Field_Name_1_Type [:= default]
++--                       Field_Name_2 : Field_Name_2_Type [:= default]
++--                       ...)
++--    return Node_Id
++
++--  Only syntactic fields are included (i.e. fields marked as "-Sem" or "-Lib"
++--  in the Sinfo spec are excluded). In addition, the following four syntactic
++--  fields are excluded:
++
++--    Prev_Ids
++--    More_Ids
++--    Comes_From_Source
++--    Paren_Count
++
++--  since they are very rarely set in expanded code. If they need to be set,
++--  to other than the default values (False, False, False, zero), then the
++--  appropriate Set_xxx procedures must be used on the returned value.
++
++--  Default values are provided only for flag fields (where the default is
++--  False), and for optional fields. An optional field is one where the
++--  comment line describing the field contains the string "(set to xxx if".
++--  For such fields, a default value of xxx is provided."
++
++--  Warning: since calls to Make_xxx routines are normal function calls, the
++--  arguments can be evaluated in any order. This means that at most one such
++--  argument can have side effects (e.g. be a call to a parse routine).
++
++   function Make_Unused_At_Start (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Unused_At_Start);
++
++   function Make_Unused_At_End (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Unused_At_End);
++
++   function Make_Identifier (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id;
++   pragma Inline (Make_Identifier);
++
++   function Make_Integer_Literal (Sloc : Source_Ptr;
++      Intval                       : Uint)
++      return Node_Id;
++   pragma Inline (Make_Integer_Literal);
++
++   function Make_Real_Literal (Sloc : Source_Ptr;
++      Realval                      : Ureal)
++      return Node_Id;
++   pragma Inline (Make_Real_Literal);
++
++   function Make_Character_Literal (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Char_Literal_Value           : Char_Code)
++      return Node_Id;
++   pragma Inline (Make_Character_Literal);
++
++   function Make_String_Literal (Sloc : Source_Ptr;
++      Strval                       : String_Id)
++      return Node_Id;
++   pragma Inline (Make_String_Literal);
++
++   function Make_Pragma (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Pragma_Argument_Associations : List_Id := No_List;
++      Debug_Statement              : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Pragma);
++
++   function Make_Pragma_Argument_Association (Sloc : Source_Ptr;
++      Chars                        : Name_Id := No_Name;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Pragma_Argument_Association);
++
++   function Make_Defining_Identifier (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id;
++   pragma Inline (Make_Defining_Identifier);
++
++   function Make_Full_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Type_Definition              : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Full_Type_Declaration);
++
++   function Make_Subtype_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Subtype_Indication           : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subtype_Declaration);
++
++   function Make_Subtype_Indication (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Constraint                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subtype_Indication);
++
++   function Make_Object_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Aliased_Present              : Boolean := False;
++      Constant_Present             : Boolean := False;
++      Object_Definition            : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Object_Declaration);
++
++   function Make_Number_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Number_Declaration);
++
++   function Make_Derived_Type_Definition (Sloc : Source_Ptr;
++      Abstract_Present             : Boolean := False;
++      Subtype_Indication           : Node_Id;
++      Record_Extension_Part        : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Derived_Type_Definition);
++
++   function Make_Range_Constraint (Sloc : Source_Ptr;
++      Range_Expression             : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Range_Constraint);
++
++   function Make_Range (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id;
++      Includes_Infinities          : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Range);
++
++   function Make_Enumeration_Type_Definition (Sloc : Source_Ptr;
++      Literals                     : List_Id;
++      End_Label                    : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Enumeration_Type_Definition);
++
++   function Make_Defining_Character_Literal (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id;
++   pragma Inline (Make_Defining_Character_Literal);
++
++   function Make_Signed_Integer_Type_Definition (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Signed_Integer_Type_Definition);
++
++   function Make_Modular_Type_Definition (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Modular_Type_Definition);
++
++   function Make_Floating_Point_Definition (Sloc : Source_Ptr;
++      Digits_Expression            : Node_Id;
++      Real_Range_Specification     : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Floating_Point_Definition);
++
++   function Make_Real_Range_Specification (Sloc : Source_Ptr;
++      Low_Bound                    : Node_Id;
++      High_Bound                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Real_Range_Specification);
++
++   function Make_Ordinary_Fixed_Point_Definition (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Real_Range_Specification     : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Ordinary_Fixed_Point_Definition);
++
++   function Make_Decimal_Fixed_Point_Definition (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Digits_Expression            : Node_Id;
++      Real_Range_Specification     : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Decimal_Fixed_Point_Definition);
++
++   function Make_Digits_Constraint (Sloc : Source_Ptr;
++      Digits_Expression            : Node_Id;
++      Range_Constraint             : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Digits_Constraint);
++
++   function Make_Unconstrained_Array_Definition (Sloc : Source_Ptr;
++      Subtype_Marks                : List_Id;
++      Component_Definition         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Unconstrained_Array_Definition);
++
++   function Make_Constrained_Array_Definition (Sloc : Source_Ptr;
++      Discrete_Subtype_Definitions : List_Id;
++      Component_Definition         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Constrained_Array_Definition);
++
++   function Make_Component_Definition (Sloc : Source_Ptr;
++      Aliased_Present              : Boolean := False;
++      Subtype_Indication           : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Component_Definition);
++
++   function Make_Discriminant_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Type            : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Discriminant_Specification);
++
++   function Make_Index_Or_Discriminant_Constraint (Sloc : Source_Ptr;
++      Constraints                  : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Index_Or_Discriminant_Constraint);
++
++   function Make_Discriminant_Association (Sloc : Source_Ptr;
++      Selector_Names               : List_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Discriminant_Association);
++
++   function Make_Record_Definition (Sloc : Source_Ptr;
++      End_Label                    : Node_Id := Empty;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False;
++      Component_List               : Node_Id;
++      Null_Present                 : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Record_Definition);
++
++   function Make_Component_List (Sloc : Source_Ptr;
++      Component_Items              : List_Id;
++      Variant_Part                 : Node_Id := Empty;
++      Null_Present                 : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Component_List);
++
++   function Make_Component_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Component_Definition         : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Component_Declaration);
++
++   function Make_Variant_Part (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Variants                     : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Variant_Part);
++
++   function Make_Variant (Sloc : Source_Ptr;
++      Discrete_Choices             : List_Id;
++      Component_List               : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Variant);
++
++   function Make_Others_Choice (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Others_Choice);
++
++   function Make_Access_To_Object_Definition (Sloc : Source_Ptr;
++      All_Present                  : Boolean := False;
++      Subtype_Indication           : Node_Id;
++      Constant_Present             : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Access_To_Object_Definition);
++
++   function Make_Access_Function_Definition (Sloc : Source_Ptr;
++      Protected_Present            : Boolean := False;
++      Parameter_Specifications     : List_Id := No_List;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Access_Function_Definition);
++
++   function Make_Access_Procedure_Definition (Sloc : Source_Ptr;
++      Protected_Present            : Boolean := False;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Access_Procedure_Definition);
++
++   function Make_Access_Definition (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Access_Definition);
++
++   function Make_Incomplete_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Incomplete_Type_Declaration);
++
++   function Make_Explicit_Dereference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Explicit_Dereference);
++
++   function Make_Indexed_Component (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Expressions                  : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Indexed_Component);
++
++   function Make_Slice (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Discrete_Range               : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Slice);
++
++   function Make_Selected_Component (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Selector_Name                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Selected_Component);
++
++   function Make_Attribute_Reference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id;
++      Attribute_Name               : Name_Id;
++      Expressions                  : List_Id := No_List;
++      Must_Be_Byte_Aligned         : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Attribute_Reference);
++
++   function Make_Aggregate (Sloc : Source_Ptr;
++      Expressions                  : List_Id := No_List;
++      Component_Associations       : List_Id := No_List;
++      Null_Record_Present          : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Aggregate);
++
++   function Make_Component_Association (Sloc : Source_Ptr;
++      Choices                      : List_Id;
++      Expression                   : Node_Id;
++      Box_Present                  : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Component_Association);
++
++   function Make_Extension_Aggregate (Sloc : Source_Ptr;
++      Ancestor_Part                : Node_Id;
++      Expressions                  : List_Id := No_List;
++      Component_Associations       : List_Id := No_List;
++      Null_Record_Present          : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Extension_Aggregate);
++
++   function Make_Null (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Null);
++
++   function Make_And_Then (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_And_Then);
++
++   function Make_Or_Else (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Or_Else);
++
++   function Make_In (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_In);
++
++   function Make_Not_In (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Not_In);
++
++   function Make_Op_And (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_And);
++
++   function Make_Op_Or (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Or);
++
++   function Make_Op_Xor (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Xor);
++
++   function Make_Op_Eq (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Eq);
++
++   function Make_Op_Ne (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Ne);
++
++   function Make_Op_Lt (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Lt);
++
++   function Make_Op_Le (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Le);
++
++   function Make_Op_Gt (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Gt);
++
++   function Make_Op_Ge (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Ge);
++
++   function Make_Op_Add (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Add);
++
++   function Make_Op_Subtract (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Subtract);
++
++   function Make_Op_Concat (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Concat);
++
++   function Make_Op_Multiply (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Multiply);
++
++   function Make_Op_Divide (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Divide);
++
++   function Make_Op_Mod (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Mod);
++
++   function Make_Op_Rem (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Rem);
++
++   function Make_Op_Expon (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Expon);
++
++   function Make_Op_Plus (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Plus);
++
++   function Make_Op_Minus (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Minus);
++
++   function Make_Op_Abs (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Abs);
++
++   function Make_Op_Not (Sloc : Source_Ptr;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Not);
++
++   function Make_Type_Conversion (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Type_Conversion);
++
++   function Make_Qualified_Expression (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Qualified_Expression);
++
++   function Make_Allocator (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Allocator);
++
++   function Make_Null_Statement (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Null_Statement);
++
++   function Make_Label (Sloc : Source_Ptr;
++      Identifier                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Label);
++
++   function Make_Assignment_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Assignment_Statement);
++
++   function Make_If_Statement (Sloc : Source_Ptr;
++      Condition                    : Node_Id;
++      Then_Statements              : List_Id;
++      Elsif_Parts                  : List_Id := No_List;
++      Else_Statements              : List_Id := No_List;
++      End_Span                     : Uint := No_Uint)
++      return Node_Id;
++   pragma Inline (Make_If_Statement);
++
++   function Make_Elsif_Part (Sloc : Source_Ptr;
++      Condition                    : Node_Id;
++      Then_Statements              : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Elsif_Part);
++
++   function Make_Case_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id;
++      Alternatives                 : List_Id;
++      End_Span                     : Uint := No_Uint)
++      return Node_Id;
++   pragma Inline (Make_Case_Statement);
++
++   function Make_Case_Statement_Alternative (Sloc : Source_Ptr;
++      Discrete_Choices             : List_Id;
++      Statements                   : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Case_Statement_Alternative);
++
++   function Make_Loop_Statement (Sloc : Source_Ptr;
++      Identifier                   : Node_Id := Empty;
++      Iteration_Scheme             : Node_Id := Empty;
++      Statements                   : List_Id;
++      End_Label                    : Node_Id;
++      Has_Created_Identifier       : Boolean := False;
++      Is_Null_Loop                 : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Loop_Statement);
++
++   function Make_Iteration_Scheme (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Loop_Parameter_Specification : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Iteration_Scheme);
++
++   function Make_Loop_Parameter_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Reverse_Present              : Boolean := False;
++      Discrete_Subtype_Definition  : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Loop_Parameter_Specification);
++
++   function Make_Block_Statement (Sloc : Source_Ptr;
++      Identifier                   : Node_Id := Empty;
++      Declarations                 : List_Id := No_List;
++      Handled_Statement_Sequence   : Node_Id;
++      Has_Created_Identifier       : Boolean := False;
++      Is_Task_Allocation_Block     : Boolean := False;
++      Is_Asynchronous_Call_Block   : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Block_Statement);
++
++   function Make_Exit_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id := Empty;
++      Condition                    : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Exit_Statement);
++
++   function Make_Goto_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Goto_Statement);
++
++   function Make_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subprogram_Declaration);
++
++   function Make_Abstract_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Abstract_Subprogram_Declaration);
++
++   function Make_Function_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Parameter_Specifications     : List_Id := No_List;
++      Subtype_Mark                 : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Function_Specification);
++
++   function Make_Procedure_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Procedure_Specification);
++
++   function Make_Designator (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Identifier                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Designator);
++
++   function Make_Defining_Program_Unit_Name (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Defining_Program_Unit_Name);
++
++   function Make_Operator_Symbol (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Strval                       : String_Id)
++      return Node_Id;
++   pragma Inline (Make_Operator_Symbol);
++
++   function Make_Defining_Operator_Symbol (Sloc : Source_Ptr;
++      Chars                        : Name_Id)
++      return Node_Id;
++   pragma Inline (Make_Defining_Operator_Symbol);
++
++   function Make_Parameter_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      In_Present                   : Boolean := False;
++      Out_Present                  : Boolean := False;
++      Parameter_Type               : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Parameter_Specification);
++
++   function Make_Subprogram_Body (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id;
++      Bad_Is_Detected              : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Subprogram_Body);
++
++   function Make_Procedure_Call_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Procedure_Call_Statement);
++
++   function Make_Function_Call (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Function_Call);
++
++   function Make_Parameter_Association (Sloc : Source_Ptr;
++      Selector_Name                : Node_Id;
++      Explicit_Actual_Parameter    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Parameter_Association);
++
++   function Make_Return_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Return_Statement);
++
++   function Make_Package_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Package_Declaration);
++
++   function Make_Package_Specification (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Package_Specification);
++
++   function Make_Package_Body (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Package_Body);
++
++   function Make_Private_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Private_Type_Declaration);
++
++   function Make_Private_Extension_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False;
++      Abstract_Present             : Boolean := False;
++      Subtype_Indication           : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Private_Extension_Declaration);
++
++   function Make_Use_Package_Clause (Sloc : Source_Ptr;
++      Names                        : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Use_Package_Clause);
++
++   function Make_Use_Type_Clause (Sloc : Source_Ptr;
++      Subtype_Marks                : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Use_Type_Clause);
++
++   function Make_Object_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Subtype_Mark                 : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Object_Renaming_Declaration);
++
++   function Make_Exception_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Exception_Renaming_Declaration);
++
++   function Make_Package_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Package_Renaming_Declaration);
++
++   function Make_Subprogram_Renaming_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subprogram_Renaming_Declaration);
++
++   function Make_Generic_Package_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Package_Renaming_Declaration);
++
++   function Make_Generic_Procedure_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Procedure_Renaming_Declaration);
++
++   function Make_Generic_Function_Renaming_Declaration (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Function_Renaming_Declaration);
++
++   function Make_Task_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Task_Definition              : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Task_Type_Declaration);
++
++   function Make_Single_Task_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Task_Definition              : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Single_Task_Declaration);
++
++   function Make_Task_Definition (Sloc : Source_Ptr;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Task_Definition);
++
++   function Make_Task_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Task_Body);
++
++   function Make_Protected_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Protected_Definition         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Protected_Type_Declaration);
++
++   function Make_Single_Protected_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Protected_Definition         : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Single_Protected_Declaration);
++
++   function Make_Protected_Definition (Sloc : Source_Ptr;
++      Visible_Declarations         : List_Id;
++      Private_Declarations         : List_Id := No_List;
++      End_Label                    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Protected_Definition);
++
++   function Make_Protected_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Declarations                 : List_Id;
++      End_Label                    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Protected_Body);
++
++   function Make_Entry_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discrete_Subtype_Definition  : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Entry_Declaration);
++
++   function Make_Accept_Statement (Sloc : Source_Ptr;
++      Entry_Direct_Name            : Node_Id;
++      Entry_Index                  : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List;
++      Handled_Statement_Sequence   : Node_Id;
++      Declarations                 : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Accept_Statement);
++
++   function Make_Entry_Body (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Entry_Body_Formal_Part       : Node_Id;
++      Declarations                 : List_Id;
++      Handled_Statement_Sequence   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Entry_Body);
++
++   function Make_Entry_Body_Formal_Part (Sloc : Source_Ptr;
++      Entry_Index_Specification    : Node_Id := Empty;
++      Parameter_Specifications     : List_Id := No_List;
++      Condition                    : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Entry_Body_Formal_Part);
++
++   function Make_Entry_Index_Specification (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Discrete_Subtype_Definition  : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Entry_Index_Specification);
++
++   function Make_Entry_Call_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Parameter_Associations       : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Entry_Call_Statement);
++
++   function Make_Requeue_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Abort_Present                : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Requeue_Statement);
++
++   function Make_Delay_Until_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Delay_Until_Statement);
++
++   function Make_Delay_Relative_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Delay_Relative_Statement);
++
++   function Make_Selective_Accept (Sloc : Source_Ptr;
++      Select_Alternatives          : List_Id;
++      Else_Statements              : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Selective_Accept);
++
++   function Make_Accept_Alternative (Sloc : Source_Ptr;
++      Accept_Statement             : Node_Id;
++      Condition                    : Node_Id := Empty;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Accept_Alternative);
++
++   function Make_Delay_Alternative (Sloc : Source_Ptr;
++      Delay_Statement              : Node_Id;
++      Condition                    : Node_Id := Empty;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Delay_Alternative);
++
++   function Make_Terminate_Alternative (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Pragmas_Before               : List_Id := No_List;
++      Pragmas_After                : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Terminate_Alternative);
++
++   function Make_Timed_Entry_Call (Sloc : Source_Ptr;
++      Entry_Call_Alternative       : Node_Id;
++      Delay_Alternative            : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Timed_Entry_Call);
++
++   function Make_Entry_Call_Alternative (Sloc : Source_Ptr;
++      Entry_Call_Statement         : Node_Id;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Entry_Call_Alternative);
++
++   function Make_Conditional_Entry_Call (Sloc : Source_Ptr;
++      Entry_Call_Alternative       : Node_Id;
++      Else_Statements              : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Conditional_Entry_Call);
++
++   function Make_Asynchronous_Select (Sloc : Source_Ptr;
++      Triggering_Alternative       : Node_Id;
++      Abortable_Part               : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Asynchronous_Select);
++
++   function Make_Triggering_Alternative (Sloc : Source_Ptr;
++      Triggering_Statement         : Node_Id;
++      Statements                   : List_Id := Empty_List;
++      Pragmas_Before               : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Triggering_Alternative);
++
++   function Make_Abortable_Part (Sloc : Source_Ptr;
++      Statements                   : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Abortable_Part);
++
++   function Make_Abort_Statement (Sloc : Source_Ptr;
++      Names                        : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Abort_Statement);
++
++   function Make_Compilation_Unit (Sloc : Source_Ptr;
++      Context_Items                : List_Id;
++      Private_Present              : Boolean := False;
++      Unit                         : Node_Id;
++      Aux_Decls_Node               : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Compilation_Unit);
++
++   function Make_Compilation_Unit_Aux (Sloc : Source_Ptr;
++      Declarations                 : List_Id := No_List;
++      Actions                      : List_Id := No_List;
++      Pragmas_After                : List_Id := No_List;
++      Config_Pragmas               : List_Id := Empty_List)
++      return Node_Id;
++   pragma Inline (Make_Compilation_Unit_Aux);
++
++   function Make_With_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      First_Name                   : Boolean := True;
++      Last_Name                    : Boolean := True;
++      Limited_Present              : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_With_Clause);
++
++   function Make_With_Type_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Tagged_Present               : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_With_Type_Clause);
++
++   function Make_Subprogram_Body_Stub (Sloc : Source_Ptr;
++      Specification                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subprogram_Body_Stub);
++
++   function Make_Package_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Package_Body_Stub);
++
++   function Make_Task_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Task_Body_Stub);
++
++   function Make_Protected_Body_Stub (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Protected_Body_Stub);
++
++   function Make_Subunit (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Proper_Body                  : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subunit);
++
++   function Make_Exception_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Exception_Declaration);
++
++   function Make_Handled_Sequence_Of_Statements (Sloc : Source_Ptr;
++      Statements                   : List_Id;
++      End_Label                    : Node_Id := Empty;
++      Exception_Handlers           : List_Id := No_List;
++      At_End_Proc                  : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Handled_Sequence_Of_Statements);
++
++   function Make_Exception_Handler (Sloc : Source_Ptr;
++      Choice_Parameter             : Node_Id := Empty;
++      Exception_Choices            : List_Id;
++      Statements                   : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Exception_Handler);
++
++   function Make_Raise_Statement (Sloc : Source_Ptr;
++      Name                         : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Raise_Statement);
++
++   function Make_Generic_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Generic_Formal_Declarations  : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Subprogram_Declaration);
++
++   function Make_Generic_Package_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Generic_Formal_Declarations  : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Package_Declaration);
++
++   function Make_Package_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Package_Instantiation);
++
++   function Make_Procedure_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Procedure_Instantiation);
++
++   function Make_Function_Instantiation (Sloc : Source_Ptr;
++      Defining_Unit_Name           : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Function_Instantiation);
++
++   function Make_Generic_Association (Sloc : Source_Ptr;
++      Selector_Name                : Node_Id := Empty;
++      Explicit_Generic_Actual_Parameter : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Generic_Association);
++
++   function Make_Formal_Object_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      In_Present                   : Boolean := False;
++      Out_Present                  : Boolean := False;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Formal_Object_Declaration);
++
++   function Make_Formal_Type_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Formal_Type_Definition       : Node_Id;
++      Discriminant_Specifications  : List_Id := No_List;
++      Unknown_Discriminants_Present : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Formal_Type_Declaration);
++
++   function Make_Formal_Private_Type_Definition (Sloc : Source_Ptr;
++      Abstract_Present             : Boolean := False;
++      Tagged_Present               : Boolean := False;
++      Limited_Present              : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Formal_Private_Type_Definition);
++
++   function Make_Formal_Derived_Type_Definition (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Private_Present              : Boolean := False;
++      Abstract_Present             : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Formal_Derived_Type_Definition);
++
++   function Make_Formal_Discrete_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Discrete_Type_Definition);
++
++   function Make_Formal_Signed_Integer_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Signed_Integer_Type_Definition);
++
++   function Make_Formal_Modular_Type_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Modular_Type_Definition);
++
++   function Make_Formal_Floating_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Floating_Point_Definition);
++
++   function Make_Formal_Ordinary_Fixed_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Ordinary_Fixed_Point_Definition);
++
++   function Make_Formal_Decimal_Fixed_Point_Definition (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Formal_Decimal_Fixed_Point_Definition);
++
++   function Make_Formal_Subprogram_Declaration (Sloc : Source_Ptr;
++      Specification                : Node_Id;
++      Default_Name                 : Node_Id := Empty;
++      Box_Present                  : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Formal_Subprogram_Declaration);
++
++   function Make_Formal_Package_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id;
++      Name                         : Node_Id;
++      Generic_Associations         : List_Id := No_List;
++      Box_Present                  : Boolean := False)
++      return Node_Id;
++   pragma Inline (Make_Formal_Package_Declaration);
++
++   function Make_Attribute_Definition_Clause (Sloc : Source_Ptr;
++      Name                         : Node_Id;
++      Chars                        : Name_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Attribute_Definition_Clause);
++
++   function Make_Enumeration_Representation_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Array_Aggregate              : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Enumeration_Representation_Clause);
++
++   function Make_Record_Representation_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Mod_Clause                   : Node_Id := Empty;
++      Component_Clauses            : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Record_Representation_Clause);
++
++   function Make_Component_Clause (Sloc : Source_Ptr;
++      Component_Name               : Node_Id;
++      Position                     : Node_Id;
++      First_Bit                    : Node_Id;
++      Last_Bit                     : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Component_Clause);
++
++   function Make_Code_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Code_Statement);
++
++   function Make_Op_Rotate_Left (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Rotate_Left);
++
++   function Make_Op_Rotate_Right (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Rotate_Right);
++
++   function Make_Op_Shift_Left (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Shift_Left);
++
++   function Make_Op_Shift_Right_Arithmetic (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Shift_Right_Arithmetic);
++
++   function Make_Op_Shift_Right (Sloc : Source_Ptr;
++      Left_Opnd                    : Node_Id;
++      Right_Opnd                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Op_Shift_Right);
++
++   function Make_Delta_Constraint (Sloc : Source_Ptr;
++      Delta_Expression             : Node_Id;
++      Range_Constraint             : Node_Id := Empty)
++      return Node_Id;
++   pragma Inline (Make_Delta_Constraint);
++
++   function Make_At_Clause (Sloc : Source_Ptr;
++      Identifier                   : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_At_Clause);
++
++   function Make_Mod_Clause (Sloc : Source_Ptr;
++      Expression                   : Node_Id;
++      Pragmas_Before               : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Mod_Clause);
++
++   function Make_Conditional_Expression (Sloc : Source_Ptr;
++      Expressions                  : List_Id)
++      return Node_Id;
++   pragma Inline (Make_Conditional_Expression);
++
++   function Make_Expanded_Name (Sloc : Source_Ptr;
++      Chars                        : Name_Id;
++      Prefix                       : Node_Id;
++      Selector_Name                : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Expanded_Name);
++
++   function Make_Free_Statement (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Free_Statement);
++
++   function Make_Freeze_Entity (Sloc : Source_Ptr;
++      Actions                      : List_Id := No_List)
++      return Node_Id;
++   pragma Inline (Make_Freeze_Entity);
++
++   function Make_Implicit_Label_Declaration (Sloc : Source_Ptr;
++      Defining_Identifier          : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Implicit_Label_Declaration);
++
++   function Make_Itype_Reference (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Itype_Reference);
++
++   function Make_Raise_Constraint_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id;
++   pragma Inline (Make_Raise_Constraint_Error);
++
++   function Make_Raise_Program_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id;
++   pragma Inline (Make_Raise_Program_Error);
++
++   function Make_Raise_Storage_Error (Sloc : Source_Ptr;
++      Condition                    : Node_Id := Empty;
++      Reason                       : Uint)
++      return Node_Id;
++   pragma Inline (Make_Raise_Storage_Error);
++
++   function Make_Reference (Sloc : Source_Ptr;
++      Prefix                       : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Reference);
++
++   function Make_Subprogram_Info (Sloc : Source_Ptr;
++      Identifier                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Subprogram_Info);
++
++   function Make_Unchecked_Expression (Sloc : Source_Ptr;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Unchecked_Expression);
++
++   function Make_Unchecked_Type_Conversion (Sloc : Source_Ptr;
++      Subtype_Mark                 : Node_Id;
++      Expression                   : Node_Id)
++      return Node_Id;
++   pragma Inline (Make_Unchecked_Type_Conversion);
++
++   function Make_Validate_Unchecked_Conversion (Sloc : Source_Ptr)
++      return Node_Id;
++   pragma Inline (Make_Validate_Unchecked_Conversion);
++
++end Nmake;
+--- gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/treeprs.ads.orig     1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.0/obj-amd64-pld-linux/gcc/ada/treeprs.ads  2004-06-02 00:54:11.000000000 +0200
+@@ -0,0 +1,801 @@
++------------------------------------------------------------------------------
++--                                                                          --
++--                         GNAT COMPILER COMPONENTS                         --
++--                                                                          --
++--                              T R E E P R S                               --
++--                                                                          --
++--                                 S p e c                                  --
++--                                                                          --
++--          Copyright (C) 1992-2003 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- --
++-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
++-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
++-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
++-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
++-- for  more details.  You should have  received  a copy of the GNU General --
++-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
++-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
++-- MA 02111-1307, USA.                                                      --
++--                                                                          --
++-- GNAT was originally developed  by the GNAT team at  New York University. --
++-- Extensive contributions were provided by Ada Core Technologies Inc.      --
++--                                                                          --
++------------------------------------------------------------------------------
++
++
++--  This package contains the declaration of the string used by the Tree_Print
++--  package. It must be updated whenever the arrangements of the field names
++--  in package Sinfo is changed. The utility program XTREEPRS is used to
++--  do this update correctly using the template treeprs.adt as input.
++
++with Sinfo; use Sinfo;
++
++package Treeprs is
++
++   --------------------------------
++   -- String Data for Node Print --
++   --------------------------------
++
++   --  String data for print out. The Pchars array is a long string with the
++   --  the entry for each node type consisting of a single blank, followed by
++   --  a series of entries, one for each Op or Flag field used for the node.
++   --  Each entry has a single character which identifies the field, followed
++   --  by the synonym name. The starting location for a given node type is
++   --  found from the corresponding entry in the Pchars_Pos_Array.
++
++   --  The following characters identify the field. These are characters
++   --  which  could never occur in a field name, so they also mark the
++   --  end of the previous name.
++
++   subtype Fchar is Character range '#' .. '9';
++
++   F_Field1     : constant Fchar := '#'; -- Character'Val (16#23#)
++   F_Field2     : constant Fchar := '$'; -- Character'Val (16#24#)
++   F_Field3     : constant Fchar := '%'; -- Character'Val (16#25#)
++   F_Field4     : constant Fchar := '&'; -- Character'Val (16#26#)
++   F_Field5     : constant Fchar := '''; -- Character'Val (16#27#)
++   F_Flag1      : constant Fchar := '('; -- Character'Val (16#28#)
++   F_Flag2      : constant Fchar := ')'; -- Character'Val (16#29#)
++   F_Flag3      : constant Fchar := '*'; -- Character'Val (16#2A#)
++   F_Flag4      : constant Fchar := '+'; -- Character'Val (16#2B#)
++   F_Flag5      : constant Fchar := ','; -- Character'Val (16#2C#)
++   F_Flag6      : constant Fchar := '-'; -- Character'Val (16#2D#)
++   F_Flag7      : constant Fchar := '.'; -- Character'Val (16#2E#)
++   F_Flag8      : constant Fchar := '/'; -- Character'Val (16#2F#)
++   F_Flag9      : constant Fchar := '0'; -- Character'Val (16#30#)
++   F_Flag10     : constant Fchar := '1'; -- Character'Val (16#31#)
++   F_Flag11     : constant Fchar := '2'; -- Character'Val (16#32#)
++   F_Flag12     : constant Fchar := '3'; -- Character'Val (16#33#)
++   F_Flag13     : constant Fchar := '4'; -- Character'Val (16#34#)
++   F_Flag14     : constant Fchar := '5'; -- Character'Val (16#35#)
++   F_Flag15     : constant Fchar := '6'; -- Character'Val (16#36#)
++   F_Flag16     : constant Fchar := '7'; -- Character'Val (16#37#)
++   F_Flag17     : constant Fchar := '8'; -- Character'Val (16#38#)
++   F_Flag18     : constant Fchar := '9'; -- Character'Val (16#39#)
++
++   --  Note this table does not include entity field and flags whose access
++   --  functions are in Einfo (these are handled by the Print_Entity_Info
++   --  procedure in Treepr, which uses the routines in Einfo to get the
++   --  proper symbolic information). In addition, the following fields are
++   --  handled by Treepr, and do not appear in the Pchars array:
++
++   --    Analyzed
++   --    Cannot_Be_Constant
++   --    Chars
++   --    Comes_From_Source
++   --    Error_Posted
++   --    Etype
++   --    Is_Controlling_Actual
++   --    Is_Overloaded
++   --    Is_Static_Expression
++   --    Left_Opnd
++   --    Must_Check_Expr
++   --    Must_Not_Freeze
++   --    No_Overflow_Expr
++   --    Paren_Count
++   --    Raises_Constraint_Error
++   --    Right_Opnd
++
++   Pchars : constant String :=
++      --  Unused_At_Start
++      "" &
++      --  At_Clause
++      "#Identifier%Expression" &
++      --  Component_Clause
++      "#Component_Name$Position%First_Bit&Last_Bit" &
++      --  Enumeration_Representation_Clause
++      "#Identifier%Array_Aggregate&Next_Rep_Item" &
++      --  Mod_Clause
++      "%Expression&Pragmas_Before" &
++      --  Record_Representation_Clause
++      "#Identifier$Mod_Clause%Component_Clauses&Next_Rep_Item" &
++      --  Attribute_Definition_Clause
++      "$Name%Expression&Next_Rep_Item+From_At_Mod2Check_Address_Alignment" &
++      --  Empty
++      "" &
++      --  Pragma
++      "$Pragma_Argument_Associations%Debug_Statement&Next_Rep_Item" &
++      --  Pragma_Argument_Association
++      "%Expression" &
++      --  Error
++      "" &
++      --  Defining_Character_Literal
++      "$Next_Entity%Scope" &
++      --  Defining_Identifier
++      "$Next_Entity%Scope" &
++      --  Defining_Operator_Symbol
++      "$Next_Entity%Scope" &
++      --  Expanded_Name
++      "%Prefix$Selector_Name&Entity&Associated_Node4Redundant_Use2Has_Privat" &
++         "e_View" &
++      --  Identifier
++      "&Entity&Associated_Node$Original_Discriminant4Redundant_Use2Has_Priva" &
++         "te_View" &
++      --  Operator_Symbol
++      "%Strval&Entity&Associated_Node2Has_Private_View" &
++      --  Character_Literal
++      "$Char_Literal_Value&Entity&Associated_Node2Has_Private_View" &
++      --  Op_Add
++      "" &
++      --  Op_Concat
++      "4Is_Component_Left_Opnd5Is_Component_Right_Opnd" &
++      --  Op_Expon
++      "4Is_Power_Of_2_For_Shift" &
++      --  Op_Subtract
++      "" &
++      --  Op_Divide
++      "5Treat_Fixed_As_Integer4Do_Division_Check9Rounded_Result" &
++      --  Op_Mod
++      "5Treat_Fixed_As_Integer4Do_Division_Check" &
++      --  Op_Multiply
++      "5Treat_Fixed_As_Integer9Rounded_Result" &
++      --  Op_Rem
++      "5Treat_Fixed_As_Integer4Do_Division_Check" &
++      --  Op_And
++      "+Do_Length_Check" &
++      --  Op_Eq
++      "" &
++      --  Op_Ge
++      "" &
++      --  Op_Gt
++      "" &
++      --  Op_Le
++      "" &
++      --  Op_Lt
++      "" &
++      --  Op_Ne
++      "" &
++      --  Op_Or
++      "+Do_Length_Check" &
++      --  Op_Xor
++      "+Do_Length_Check" &
++      --  Op_Rotate_Left
++      "+Shift_Count_OK" &
++      --  Op_Rotate_Right
++      "+Shift_Count_OK" &
++      --  Op_Shift_Left
++      "+Shift_Count_OK" &
++      --  Op_Shift_Right
++      "+Shift_Count_OK" &
++      --  Op_Shift_Right_Arithmetic
++      "+Shift_Count_OK" &
++      --  Op_Abs
++      "" &
++      --  Op_Minus
++      "" &
++      --  Op_Not
++      "" &
++      --  Op_Plus
++      "" &
++      --  Attribute_Reference
++      "%Prefix$Attribute_Name#Expressions&Entity&Associated_Node8Do_Overflow" &
++         "_Check4Redundant_Use+OK_For_Stream5Must_Be_Byte_Aligned" &
++      --  And_Then
++      "#Actions" &
++      --  Conditional_Expression
++      "#Expressions$Then_Actions%Else_Actions" &
++      --  Explicit_Dereference
++      "%Prefix" &
++      --  Function_Call
++      "$Name%Parameter_Associations&First_Named_Actual#Controlling_Argument4" &
++         "Do_Tag_Check5No_Elaboration_Check8Parameter_List_Truncated9ABE_Is_" &
++         "Certain" &
++      --  In
++      "" &
++      --  Indexed_Component
++      "%Prefix#Expressions" &
++      --  Integer_Literal
++      "$Original_Entity%Intval4Print_In_Hex" &
++      --  Not_In
++      "" &
++      --  Null
++      "" &
++      --  Or_Else
++      "#Actions" &
++      --  Procedure_Call_Statement
++      "$Name%Parameter_Associations&First_Named_Actual#Controlling_Argument4" &
++         "Do_Tag_Check5No_Elaboration_Check8Parameter_List_Truncated9ABE_Is_" &
++         "Certain" &
++      --  Qualified_Expression
++      "&Subtype_Mark%Expression" &
++      --  Raise_Constraint_Error
++      "#Condition%Reason" &
++      --  Raise_Program_Error
++      "#Condition%Reason" &
++      --  Raise_Storage_Error
++      "#Condition%Reason" &
++      --  Aggregate
++      "#Expressions$Component_Associations8Null_Record_Present%Aggregate_Bou" &
++         "nds&Associated_Node+Static_Processing_OK9Compile_Time_Known_Aggreg" &
++         "ate2Expansion_Delayed" &
++      --  Allocator
++      "%Expression#Storage_Pool&Procedure_To_Call4No_Initialization8Do_Stora" &
++         "ge_Check" &
++      --  Extension_Aggregate
++      "%Ancestor_Part&Associated_Node#Expressions$Component_Associations8Nul" &
++         "l_Record_Present2Expansion_Delayed" &
++      --  Range
++      "#Low_Bound$High_Bound2Includes_Infinities" &
++      --  Real_Literal
++      "$Original_Entity%Realval&Corresponding_Integer_Value2Is_Machine_Numbe" &
++         "r" &
++      --  Reference
++      "%Prefix" &
++      --  Selected_Component
++      "%Prefix$Selector_Name&Associated_Node4Do_Discriminant_Check2Is_In_Dis" &
++         "criminant_Check" &
++      --  Slice
++      "%Prefix&Discrete_Range" &
++      --  String_Literal
++      "%Strval2Has_Wide_Character" &
++      --  Subprogram_Info
++      "#Identifier" &
++      --  Type_Conversion
++      "&Subtype_Mark%Expression4Do_Tag_Check+Do_Length_Check8Do_Overflow_Che" &
++         "ck2Float_Truncate9Rounded_Result5Conversion_OK" &
++      --  Unchecked_Expression
++      "%Expression" &
++      --  Unchecked_Type_Conversion
++      "&Subtype_Mark%Expression2Kill_Range_Check8No_Truncation" &
++      --  Subtype_Indication
++      "&Subtype_Mark%Constraint/Must_Not_Freeze" &
++      --  Component_Declaration
++      "#Defining_Identifier&Component_Definition%Expression,More_Ids-Prev_Id" &
++         "s" &
++      --  Entry_Declaration
++      "#Defining_Identifier&Discrete_Subtype_Definition%Parameter_Specificat" &
++         "ions'Corresponding_Body" &
++      --  Formal_Object_Declaration
++      "#Defining_Identifier6In_Present8Out_Present&Subtype_Mark%Expression,M" &
++         "ore_Ids-Prev_Ids" &
++      --  Formal_Type_Declaration
++      "#Defining_Identifier%Formal_Type_Definition&Discriminant_Specificatio" &
++         "ns4Unknown_Discriminants_Present" &
++      --  Full_Type_Declaration
++      "#Defining_Identifier&Discriminant_Specifications%Type_Definition2Disc" &
++         "r_Check_Funcs_Built" &
++      --  Incomplete_Type_Declaration
++      "#Defining_Identifier&Discriminant_Specifications4Unknown_Discriminant" &
++         "s_Present" &
++      --  Loop_Parameter_Specification
++      "#Defining_Identifier6Reverse_Present&Discrete_Subtype_Definition" &
++      --  Object_Declaration
++      "#Defining_Identifier+Aliased_Present8Constant_Present&Object_Definiti" &
++         "on%Expression$Handler_List_Entry'Corresponding_Generic_Association" &
++         ",More_Ids-Prev_Ids4No_Initialization6Assignment_OK2Exception_Junk5" &
++         "Delay_Finalize_Attach7Is_Subprogram_Descriptor" &
++      --  Protected_Type_Declaration
++      "#Defining_Identifier&Discriminant_Specifications%Protected_Definition" &
++         "'Corresponding_Body" &
++      --  Private_Extension_Declaration
++      "#Defining_Identifier&Discriminant_Specifications4Unknown_Discriminant" &
++         "s_Present+Abstract_Present'Subtype_Indication" &
++      --  Private_Type_Declaration
++      "#Defining_Identifier&Discriminant_Specifications4Unknown_Discriminant" &
++         "s_Present+Abstract_Present6Tagged_Present8Limited_Present" &
++      --  Subtype_Declaration
++      "#Defining_Identifier'Subtype_Indication&Generic_Parent_Type2Exception" &
++         "_Junk" &
++      --  Function_Specification
++      "#Defining_Unit_Name$Elaboration_Boolean%Parameter_Specifications&Subt" &
++         "ype_Mark'Generic_Parent" &
++      --  Procedure_Specification
++      "#Defining_Unit_Name$Elaboration_Boolean%Parameter_Specifications'Gene" &
++         "ric_Parent" &
++      --  Entry_Index_Specification
++      "#Defining_Identifier&Discrete_Subtype_Definition" &
++      --  Freeze_Entity
++      "&Entity$Access_Types_To_Process%TSS_Elist#Actions'First_Subtype_Link" &
++      --  Access_Function_Definition
++      "6Protected_Present%Parameter_Specifications&Subtype_Mark" &
++      --  Access_Procedure_Definition
++      "6Protected_Present%Parameter_Specifications" &
++      --  Task_Type_Declaration
++      "#Defining_Identifier$Task_Body_Procedure&Discriminant_Specifications%" &
++         "Task_Definition'Corresponding_Body" &
++      --  Package_Body_Stub
++      "#Defining_Identifier&Library_Unit'Corresponding_Body" &
++      --  Protected_Body_Stub
++      "#Defining_Identifier&Library_Unit'Corresponding_Body" &
++      --  Subprogram_Body_Stub
++      "#Specification&Library_Unit'Corresponding_Body" &
++      --  Task_Body_Stub
++      "#Defining_Identifier&Library_Unit'Corresponding_Body" &
++      --  Function_Instantiation
++      "#Defining_Unit_Name$Name%Generic_Associations&Parent_Spec'Instance_Sp" &
++         "ec9ABE_Is_Certain" &
++      --  Package_Instantiation
++      "#Defining_Unit_Name$Name%Generic_Associations&Parent_Spec'Instance_Sp" &
++         "ec9ABE_Is_Certain" &
++      --  Procedure_Instantiation
++      "#Defining_Unit_Name$Name&Parent_Spec%Generic_Associations'Instance_Sp" &
++         "ec9ABE_Is_Certain" &
++      --  Package_Body
++      "#Defining_Unit_Name$Declarations&Handled_Statement_Sequence'Correspon" &
++         "ding_Spec4Was_Originally_Stub" &
++      --  Subprogram_Body
++      "#Specification$Declarations&Handled_Statement_Sequence%Activation_Cha" &
++         "in_Entity'Corresponding_Spec+Acts_As_Spec6Bad_Is_Detected8Do_Stora" &
++         "ge_Check-Has_Priority_Pragma.Is_Protected_Subprogram_Body,Is_Task_" &
++         "Master4Was_Originally_Stub" &
++      --  Protected_Body
++      "#Defining_Identifier$Declarations&End_Label'Corresponding_Spec4Was_Or" &
++         "iginally_Stub" &
++      --  Task_Body
++      "#Defining_Identifier$Declarations&Handled_Statement_Sequence,Is_Task_" &
++         "Master%Activation_Chain_Entity'Corresponding_Spec4Was_Originally_S" &
++         "tub" &
++      --  Implicit_Label_Declaration
++      "#Defining_Identifier$Label_Construct" &
++      --  Package_Declaration
++      "#Specification'Corresponding_Body&Parent_Spec%Activation_Chain_Entity" &
++      --  Single_Task_Declaration
++      "#Defining_Identifier%Task_Definition" &
++      --  Subprogram_Declaration
++      "#Specification%Body_To_Inline'Corresponding_Body&Parent_Spec" &
++      --  Use_Package_Clause
++      "$Names%Next_Use_Clause&Hidden_By_Use_Clause" &
++      --  Generic_Package_Declaration
++      "#Specification'Corresponding_Body$Generic_Formal_Declarations&Parent_" &
++         "Spec%Activation_Chain_Entity" &
++      --  Generic_Subprogram_Declaration
++      "#Specification'Corresponding_Body$Generic_Formal_Declarations&Parent_" &
++         "Spec" &
++      --  Constrained_Array_Definition
++      "$Discrete_Subtype_Definitions&Component_Definition" &
++      --  Unconstrained_Array_Definition
++      "$Subtype_Marks&Component_Definition" &
++      --  Exception_Renaming_Declaration
++      "#Defining_Identifier$Name" &
++      --  Object_Renaming_Declaration
++      "#Defining_Identifier&Subtype_Mark$Name'Corresponding_Generic_Associat" &
++         "ion" &
++      --  Package_Renaming_Declaration
++      "#Defining_Unit_Name$Name&Parent_Spec" &
++      --  Subprogram_Renaming_Declaration
++      "#Specification$Name&Parent_Spec'Corresponding_Spec" &
++      --  Generic_Function_Renaming_Declaration
++      "#Defining_Unit_Name$Name&Parent_Spec" &
++      --  Generic_Package_Renaming_Declaration
++      "#Defining_Unit_Name$Name&Parent_Spec" &
++      --  Generic_Procedure_Renaming_Declaration
++      "#Defining_Unit_Name$Name&Parent_Spec" &
++      --  Abort_Statement
++      "$Names" &
++      --  Accept_Statement
++      "#Entry_Direct_Name'Entry_Index%Parameter_Specifications&Handled_State" &
++         "ment_Sequence$Declarations" &
++      --  Assignment_Statement
++      "$Name%Expression4Do_Tag_Check+Do_Length_Check,Forwards_OK-Backwards_O" &
++         "K.No_Ctrl_Actions" &
++      --  Asynchronous_Select
++      "#Triggering_Alternative$Abortable_Part" &
++      --  Block_Statement
++      "#Identifier$Declarations&Handled_Statement_Sequence,Is_Task_Master%Ac" &
++         "tivation_Chain_Entity6Has_Created_Identifier-Is_Task_Allocation_Bl" &
++         "ock.Is_Asynchronous_Call_Block" &
++      --  Case_Statement
++      "%Expression&Alternatives'End_Span" &
++      --  Code_Statement
++      "%Expression" &
++      --  Conditional_Entry_Call
++      "#Entry_Call_Alternative&Else_Statements" &
++      --  Delay_Relative_Statement
++      "%Expression" &
++      --  Delay_Until_Statement
++      "%Expression" &
++      --  Entry_Call_Statement
++      "$Name%Parameter_Associations&First_Named_Actual" &
++      --  Free_Statement
++      "%Expression#Storage_Pool&Procedure_To_Call" &
++      --  Goto_Statement
++      "$Name2Exception_Junk" &
++      --  Loop_Statement
++      "#Identifier$Iteration_Scheme%Statements&End_Label6Has_Created_Identif" &
++         "ier7Is_Null_Loop" &
++      --  Null_Statement
++      "" &
++      --  Raise_Statement
++      "$Name" &
++      --  Requeue_Statement
++      "$Name6Abort_Present" &
++      --  Return_Statement
++      "%Expression#Storage_Pool&Procedure_To_Call4Do_Tag_Check$Return_Type,B" &
++         "y_Ref" &
++      --  Selective_Accept
++      "#Select_Alternatives&Else_Statements" &
++      --  Timed_Entry_Call
++      "#Entry_Call_Alternative&Delay_Alternative" &
++      --  Exit_Statement
++      "$Name#Condition" &
++      --  If_Statement
++      "#Condition$Then_Statements%Elsif_Parts&Else_Statements'End_Span" &
++      --  Accept_Alternative
++      "$Accept_Statement#Condition%Statements&Pragmas_Before'Accept_Handler_" &
++         "Records" &
++      --  Delay_Alternative
++      "$Delay_Statement#Condition%Statements&Pragmas_Before" &
++      --  Elsif_Part
++      "#Condition$Then_Statements%Condition_Actions" &
++      --  Entry_Body_Formal_Part
++      "&Entry_Index_Specification%Parameter_Specifications#Condition" &
++      --  Iteration_Scheme
++      "#Condition%Condition_Actions&Loop_Parameter_Specification" &
++      --  Terminate_Alternative
++      "#Condition&Pragmas_Before'Pragmas_After" &
++      --  Abortable_Part
++      "%Statements" &
++      --  Abstract_Subprogram_Declaration
++      "#Specification" &
++      --  Access_Definition
++      "&Subtype_Mark" &
++      --  Access_To_Object_Definition
++      "6All_Present'Subtype_Indication8Constant_Present" &
++      --  Case_Statement_Alternative
++      "&Discrete_Choices%Statements" &
++      --  Compilation_Unit
++      "&Library_Unit#Context_Items6Private_Present$Unit'Aux_Decls_Node8Has_N" &
++         "o_Elaboration_Code4Body_Required+Acts_As_Spec%First_Inlined_Subpro" &
++         "gram" &
++      --  Compilation_Unit_Aux
++      "$Declarations#Actions'Pragmas_After&Config_Pragmas" &
++      --  Component_Association
++      "#Choices$Loop_Actions%Expression6Box_Present" &
++      --  Component_Definition
++      "+Aliased_Present'Subtype_Indication" &
++      --  Component_List
++      "%Component_Items&Variant_Part4Null_Present" &
++      --  Derived_Type_Definition
++      "+Abstract_Present'Subtype_Indication%Record_Extension_Part" &
++      --  Decimal_Fixed_Point_Definition
++      "%Delta_Expression$Digits_Expression&Real_Range_Specification" &
++      --  Defining_Program_Unit_Name
++      "$Name#Defining_Identifier" &
++      --  Delta_Constraint
++      "%Delta_Expression&Range_Constraint" &
++      --  Designator
++      "$Name#Identifier" &
++      --  Digits_Constraint
++      "$Digits_Expression&Range_Constraint" &
++      --  Discriminant_Association
++      "#Selector_Names%Expression" &
++      --  Discriminant_Specification
++      "#Defining_Identifier'Discriminant_Type%Expression,More_Ids-Prev_Ids" &
++      --  Enumeration_Type_Definition
++      "#Literals&End_Label" &
++      --  Entry_Body
++      "#Defining_Identifier'Entry_Body_Formal_Part$Declarations&Handled_Stat" &
++         "ement_Sequence%Activation_Chain_Entity" &
++      --  Entry_Call_Alternative
++      "#Entry_Call_Statement%Statements&Pragmas_Before" &
++      --  Exception_Declaration
++      "#Defining_Identifier%Expression,More_Ids-Prev_Ids" &
++      --  Exception_Handler
++      "$Choice_Parameter&Exception_Choices%Statements,Zero_Cost_Handling" &
++      --  Floating_Point_Definition
++      "$Digits_Expression&Real_Range_Specification" &
++      --  Formal_Decimal_Fixed_Point_Definition
++      "" &
++      --  Formal_Derived_Type_Definition
++      "&Subtype_Mark6Private_Present+Abstract_Present" &
++      --  Formal_Discrete_Type_Definition
++      "" &
++      --  Formal_Floating_Point_Definition
++      "" &
++      --  Formal_Modular_Type_Definition
++      "" &
++      --  Formal_Ordinary_Fixed_Point_Definition
++      "" &
++      --  Formal_Package_Declaration
++      "#Defining_Identifier$Name%Generic_Associations6Box_Present'Instance_S" &
++         "pec9ABE_Is_Certain" &
++      --  Formal_Private_Type_Definition
++      "+Abstract_Present6Tagged_Present8Limited_Present" &
++      --  Formal_Signed_Integer_Type_Definition
++      "" &
++      --  Formal_Subprogram_Declaration
++      "#Specification$Default_Name6Box_Present" &
++      --  Generic_Association
++      "$Selector_Name#Explicit_Generic_Actual_Parameter" &
++      --  Handled_Sequence_Of_Statements
++      "%Statements&End_Label'Exception_Handlers#At_End_Proc$First_Real_State" &
++         "ment,Zero_Cost_Handling" &
++      --  Index_Or_Discriminant_Constraint
++      "#Constraints" &
++      --  Itype_Reference
++      "#Itype" &
++      --  Label
++      "#Identifier2Exception_Junk" &
++      --  Modular_Type_Definition
++      "%Expression" &
++      --  Number_Declaration
++      "#Defining_Identifier%Expression,More_Ids-Prev_Ids" &
++      --  Ordinary_Fixed_Point_Definition
++      "%Delta_Expression&Real_Range_Specification" &
++      --  Others_Choice
++      "#Others_Discrete_Choices2All_Others" &
++      --  Package_Specification
++      "#Defining_Unit_Name$Visible_Declarations%Private_Declarations&End_Lab" &
++         "el'Generic_Parent9Limited_View_Installed" &
++      --  Parameter_Association
++      "$Selector_Name%Explicit_Actual_Parameter&Next_Named_Actual" &
++      --  Parameter_Specification
++      "#Defining_Identifier6In_Present8Out_Present$Parameter_Type%Expression" &
++         "4Do_Accessibility_Check,More_Ids-Prev_Ids'Default_Expression" &
++      --  Protected_Definition
++      "$Visible_Declarations%Private_Declarations&End_Label-Has_Priority_Pra" &
++         "gma" &
++      --  Range_Constraint
++      "&Range_Expression" &
++      --  Real_Range_Specification
++      "#Low_Bound$High_Bound" &
++      --  Record_Definition
++      "&End_Label+Abstract_Present6Tagged_Present8Limited_Present#Component_" &
++         "List4Null_Present" &
++      --  Signed_Integer_Type_Definition
++      "#Low_Bound$High_Bound" &
++      --  Single_Protected_Declaration
++      "#Defining_Identifier%Protected_Definition" &
++      --  Subunit
++      "$Name#Proper_Body%Corresponding_Stub" &
++      --  Task_Definition
++      "$Visible_Declarations%Private_Declarations&End_Label-Has_Priority_Pra" &
++         "gma,Has_Storage_Size_Pragma.Has_Task_Info_Pragma/Has_Task_Name_Pra" &
++         "gma" &
++      --  Triggering_Alternative
++      "#Triggering_Statement%Statements&Pragmas_Before" &
++      --  Use_Type_Clause
++      "$Subtype_Marks%Next_Use_Clause&Hidden_By_Use_Clause" &
++      --  Validate_Unchecked_Conversion
++      "#Source_Type$Target_Type" &
++      --  Variant
++      "&Discrete_Choices#Component_List$Enclosing_Variant%Present_Expr'Dchec" &
++         "k_Function" &
++      --  Variant_Part
++      "$Name#Variants" &
++      --  With_Clause
++      "$Name&Library_Unit'Corresponding_Spec,First_Name-Last_Name4Context_In" &
++         "stalled+Elaborate_Present6Elaborate_All_Present7Implicit_With8Limi" &
++         "ted_Present9Limited_View_Installed.Unreferenced_In_Spec/No_Entitie" &
++         "s_Ref_In_Spec" &
++      --  With_Type_Clause
++      "$Name6Tagged_Present" &
++      --  Unused_At_End
++      "";
++
++   type Pchar_Pos_Array is array (Node_Kind) of Positive;
++   Pchar_Pos : constant Pchar_Pos_Array := Pchar_Pos_Array'(
++      N_Unused_At_Start                        => 1,
++      N_At_Clause                              => 1,
++      N_Component_Clause                       => 23,
++      N_Enumeration_Representation_Clause      => 66,
++      N_Mod_Clause                             => 107,
++      N_Record_Representation_Clause           => 133,
++      N_Attribute_Definition_Clause            => 187,
++      N_Empty                                  => 253,
++      N_Pragma                                 => 253,
++      N_Pragma_Argument_Association            => 312,
++      N_Error                                  => 323,
++      N_Defining_Character_Literal             => 323,
++      N_Defining_Identifier                    => 341,
++      N_Defining_Operator_Symbol               => 359,
++      N_Expanded_Name                          => 377,
++      N_Identifier                             => 452,
++      N_Operator_Symbol                        => 528,
++      N_Character_Literal                      => 575,
++      N_Op_Add                                 => 634,
++      N_Op_Concat                              => 634,
++      N_Op_Expon                               => 681,
++      N_Op_Subtract                            => 705,
++      N_Op_Divide                              => 705,
++      N_Op_Mod                                 => 761,
++      N_Op_Multiply                            => 802,
++      N_Op_Rem                                 => 840,
++      N_Op_And                                 => 881,
++      N_Op_Eq                                  => 897,
++      N_Op_Ge                                  => 897,
++      N_Op_Gt                                  => 897,
++      N_Op_Le                                  => 897,
++      N_Op_Lt                                  => 897,
++      N_Op_Ne                                  => 897,
++      N_Op_Or                                  => 897,
++      N_Op_Xor                                 => 913,
++      N_Op_Rotate_Left                         => 929,
++      N_Op_Rotate_Right                        => 944,
++      N_Op_Shift_Left                          => 959,
++      N_Op_Shift_Right                         => 974,
++      N_Op_Shift_Right_Arithmetic              => 989,
++      N_Op_Abs                                 => 1004,
++      N_Op_Minus                               => 1004,
++      N_Op_Not                                 => 1004,
++      N_Op_Plus                                => 1004,
++      N_Attribute_Reference                    => 1004,
++      N_And_Then                               => 1128,
++      N_Conditional_Expression                 => 1136,
++      N_Explicit_Dereference                   => 1174,
++      N_Function_Call                          => 1181,
++      N_In                                     => 1323,
++      N_Indexed_Component                      => 1323,
++      N_Integer_Literal                        => 1342,
++      N_Not_In                                 => 1378,
++      N_Null                                   => 1378,
++      N_Or_Else                                => 1378,
++      N_Procedure_Call_Statement               => 1386,
++      N_Qualified_Expression                   => 1528,
++      N_Raise_Constraint_Error                 => 1552,
++      N_Raise_Program_Error                    => 1569,
++      N_Raise_Storage_Error                    => 1586,
++      N_Aggregate                              => 1603,
++      N_Allocator                              => 1759,
++      N_Extension_Aggregate                    => 1836,
++      N_Range                                  => 1939,
++      N_Real_Literal                           => 1980,
++      N_Reference                              => 2050,
++      N_Selected_Component                     => 2057,
++      N_Slice                                  => 2141,
++      N_String_Literal                         => 2163,
++      N_Subprogram_Info                        => 2189,
++      N_Type_Conversion                        => 2200,
++      N_Unchecked_Expression                   => 2315,
++      N_Unchecked_Type_Conversion              => 2326,
++      N_Subtype_Indication                     => 2381,
++      N_Component_Declaration                  => 2421,
++      N_Entry_Declaration                      => 2491,
++      N_Formal_Object_Declaration              => 2583,
++      N_Formal_Type_Declaration                => 2668,
++      N_Full_Type_Declaration                  => 2769,
++      N_Incomplete_Type_Declaration            => 2857,
++      N_Loop_Parameter_Specification           => 2935,
++      N_Object_Declaration                     => 2999,
++      N_Protected_Type_Declaration             => 3246,
++      N_Private_Extension_Declaration          => 3334,
++      N_Private_Type_Declaration               => 3448,
++      N_Subtype_Declaration                    => 3574,
++      N_Function_Specification                 => 3648,
++      N_Procedure_Specification                => 3740,
++      N_Entry_Index_Specification              => 3819,
++      N_Freeze_Entity                          => 3867,
++      N_Access_Function_Definition             => 3935,
++      N_Access_Procedure_Definition            => 3991,
++      N_Task_Type_Declaration                  => 4034,
++      N_Package_Body_Stub                      => 4137,
++      N_Protected_Body_Stub                    => 4189,
++      N_Subprogram_Body_Stub                   => 4241,
++      N_Task_Body_Stub                         => 4287,
++      N_Function_Instantiation                 => 4339,
++      N_Package_Instantiation                  => 4425,
++      N_Procedure_Instantiation                => 4511,
++      N_Package_Body                           => 4597,
++      N_Subprogram_Body                        => 4695,
++      N_Protected_Body                         => 4922,
++      N_Task_Body                              => 5004,
++      N_Implicit_Label_Declaration             => 5142,
++      N_Package_Declaration                    => 5178,
++      N_Single_Task_Declaration                => 5247,
++      N_Subprogram_Declaration                 => 5283,
++      N_Use_Package_Clause                     => 5343,
++      N_Generic_Package_Declaration            => 5386,
++      N_Generic_Subprogram_Declaration         => 5483,
++      N_Constrained_Array_Definition           => 5556,
++      N_Unconstrained_Array_Definition         => 5606,
++      N_Exception_Renaming_Declaration         => 5641,
++      N_Object_Renaming_Declaration            => 5666,
++      N_Package_Renaming_Declaration           => 5738,
++      N_Subprogram_Renaming_Declaration        => 5774,
++      N_Generic_Function_Renaming_Declaration  => 5824,
++      N_Generic_Package_Renaming_Declaration   => 5860,
++      N_Generic_Procedure_Renaming_Declaration => 5896,
++      N_Abort_Statement                        => 5932,
++      N_Accept_Statement                       => 5938,
++      N_Assignment_Statement                   => 6033,
++      N_Asynchronous_Select                    => 6119,
++      N_Block_Statement                        => 6157,
++      N_Case_Statement                         => 6322,
++      N_Code_Statement                         => 6355,
++      N_Conditional_Entry_Call                 => 6366,
++      N_Delay_Relative_Statement               => 6405,
++      N_Delay_Until_Statement                  => 6416,
++      N_Entry_Call_Statement                   => 6427,
++      N_Free_Statement                         => 6474,
++      N_Goto_Statement                         => 6516,
++      N_Loop_Statement                         => 6536,
++      N_Null_Statement                         => 6621,
++      N_Raise_Statement                        => 6621,
++      N_Requeue_Statement                      => 6626,
++      N_Return_Statement                       => 6645,
++      N_Selective_Accept                       => 6719,
++      N_Timed_Entry_Call                       => 6755,
++      N_Exit_Statement                         => 6796,
++      N_If_Statement                           => 6811,
++      N_Accept_Alternative                     => 6874,
++      N_Delay_Alternative                      => 6950,
++      N_Elsif_Part                             => 7002,
++      N_Entry_Body_Formal_Part                 => 7046,
++      N_Iteration_Scheme                       => 7107,
++      N_Terminate_Alternative                  => 7164,
++      N_Abortable_Part                         => 7203,
++      N_Abstract_Subprogram_Declaration        => 7214,
++      N_Access_Definition                      => 7228,
++      N_Access_To_Object_Definition            => 7241,
++      N_Case_Statement_Alternative             => 7289,
++      N_Compilation_Unit                       => 7317,
++      N_Compilation_Unit_Aux                   => 7456,
++      N_Component_Association                  => 7506,
++      N_Component_Definition                   => 7550,
++      N_Component_List                         => 7585,
++      N_Derived_Type_Definition                => 7627,
++      N_Decimal_Fixed_Point_Definition         => 7685,
++      N_Defining_Program_Unit_Name             => 7745,
++      N_Delta_Constraint                       => 7770,
++      N_Designator                             => 7804,
++      N_Digits_Constraint                      => 7820,
++      N_Discriminant_Association               => 7855,
++      N_Discriminant_Specification             => 7881,
++      N_Enumeration_Type_Definition            => 7948,
++      N_Entry_Body                             => 7967,
++      N_Entry_Call_Alternative                 => 8074,
++      N_Exception_Declaration                  => 8121,
++      N_Exception_Handler                      => 8170,
++      N_Floating_Point_Definition              => 8235,
++      N_Formal_Decimal_Fixed_Point_Definition  => 8278,
++      N_Formal_Derived_Type_Definition         => 8278,
++      N_Formal_Discrete_Type_Definition        => 8324,
++      N_Formal_Floating_Point_Definition       => 8324,
++      N_Formal_Modular_Type_Definition         => 8324,
++      N_Formal_Ordinary_Fixed_Point_Definition => 8324,
++      N_Formal_Package_Declaration             => 8324,
++      N_Formal_Private_Type_Definition         => 8411,
++      N_Formal_Signed_Integer_Type_Definition  => 8459,
++      N_Formal_Subprogram_Declaration          => 8459,
++      N_Generic_Association                    => 8498,
++      N_Handled_Sequence_Of_Statements         => 8546,
++      N_Index_Or_Discriminant_Constraint       => 8638,
++      N_Itype_Reference                        => 8650,
++      N_Label                                  => 8656,
++      N_Modular_Type_Definition                => 8682,
++      N_Number_Declaration                     => 8693,
++      N_Ordinary_Fixed_Point_Definition        => 8742,
++      N_Others_Choice                          => 8784,
++      N_Package_Specification                  => 8819,
++      N_Parameter_Association                  => 8928,
++      N_Parameter_Specification                => 8986,
++      N_Protected_Definition                   => 9115,
++      N_Range_Constraint                       => 9187,
++      N_Real_Range_Specification               => 9204,
++      N_Record_Definition                      => 9225,
++      N_Signed_Integer_Type_Definition         => 9311,
++      N_Single_Protected_Declaration           => 9332,
++      N_Subunit                                => 9373,
++      N_Task_Definition                        => 9409,
++      N_Triggering_Alternative                 => 9547,
++      N_Use_Type_Clause                        => 9594,
++      N_Validate_Unchecked_Conversion          => 9645,
++      N_Variant                                => 9669,
++      N_Variant_Part                           => 9748,
++      N_With_Clause                            => 9762,
++      N_With_Type_Clause                       => 9976,
++      N_Unused_At_End                          => 9996);
++
++end Treeprs;
diff --git a/gcc3-ada-link-new-libgnat.patch b/gcc3-ada-link-new-libgnat.patch
new file mode 100644 (file)
index 0000000..59ee893
--- /dev/null
@@ -0,0 +1,11 @@
+--- gcc-3.4-20040611/gcc/ada/Make-lang.in.orig 2004-06-09 11:20:41.000000000 +0200
++++ gcc-3.4-20040611/gcc/ada/Make-lang.in      2004-06-12 03:38:09.373698608 +0200
+@@ -446,7 +446,7 @@
+ ada/doctools/xgnatugn$(build_exeext): ada/xgnatugn.adb
+       -$(MKDIR) ada/doctools
+       $(CP) $^ ada/doctools
+-      cd ada/doctools && gnatmake -q xgnatugn
++      cd ada/doctools && gnatmake -q xgnatugn -a0../rts
+ doc/gnat_ugn_unw.texi : ada/doctools/xgnatugn$(build_exeext) \
+       $(srcdir)/ada/gnat_ugn.texi $(srcdir)/ada/ug_words
diff --git a/gcc3-ada-link.patch b/gcc3-ada-link.patch
new file mode 100644 (file)
index 0000000..339e870
--- /dev/null
@@ -0,0 +1,154 @@
+--- gcc-3.4.0/gcc/ada/link.c.orig      Mon Jan 12 12:45:24 2004
++++ gcc-3.4.0/gcc/ada/link.c   Tue Jun  1 15:57:42 2004
+@@ -165,9 +165,9 @@
+ #elif defined (linux)
+ const char *object_file_option = "";
+-const char *run_path_option = "-Wl,-rpath,";
+-char shared_libgnat_default = STATIC;
+-int link_max = 8192;
++const char *run_path_option = "";
++char shared_libgnat_default = SHARED;
++int link_max = 131072;
+ unsigned char objlist_file_supported = 1;
+ unsigned char using_gnu_linker = 1;
+ const char *object_library_extension = ".a";
+--- gcc-3.4.0/gcc/ada/Makefile.in.orig Mon Apr 26 11:19:09 2004
++++ gcc-3.4.0/gcc/ada/Makefile.in      Tue Jun  1 15:58:33 2004
+@@ -142,7 +142,7 @@
+ objext = .o
+ exeext =
+ arext  = .a
+-soext  = .so
++soext  = .so.1
+ shext  =
+ # Define this as & to perform parallel make on a Sequent.
+@@ -1269,6 +1269,90 @@
+   LIBRARY_VERSION := $(LIB_VERSION)
+ endif
++ifeq ($(strip $(filter-out alpha% linux%,$(arch) $(osys))),)
++  LIBGNAT_TARGET_PAIRS = \
++  a-intnam.ads<4lintnam.ads \
++  s-inmaop.adb<7sinmaop.adb \
++  s-intman.adb<7sintman.adb \
++  s-osinte.ads<5iosinte.ads \
++  s-osinte.adb<5iosinte.adb \
++  s-osprim.adb<7sosprim.adb \
++  s-taprop.adb<5itaprop.adb \
++  s-tpopsp.adb<5atpopsp.adb \
++  s-taspri.ads<5itaspri.ads \
++  system.ads<5nsystem.ads
++  TOOLS_TARGET_PAIRS=mlib-tgt.adb<5lml-tgt.adb
++  THREADSLIB=-lpthread
++  GNATLIB_SHARED=gnatlib-shared-dual
++  PREFIX_OBJS=$(PREFIX_REAL_OBJS)
++  LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
++ifeq ($(strip $(filter-out sparc% linux%,$(arch) $(osys))),)
++  LIBGNAT_TARGET_PAIRS = \
++  a-intnam.ads<4lintnam.ads \
++  s-inmaop.adb<7sinmaop.adb \
++  s-intman.adb<7sintman.adb \
++  s-osinte.ads<5iosinte.ads \
++  s-osinte.adb<5iosinte.adb \
++  s-osprim.adb<7sosprim.adb \
++  s-taprop.adb<5itaprop.adb \
++  s-tpopsp.adb<5atpopsp.adb \
++  s-taspri.ads<5itaspri.ads
++#  system.ads<5ssystem.ads  (Tick and Stack_Check_Probes differ)
++  TOOLS_TARGET_PAIRS=mlib-tgt.adb<5lml-tgt.adb
++  THREADSLIB=-lpthread
++  GNATLIB_SHARED=gnatlib-shared-dual
++  PREFIX_OBJS=$(PREFIX_REAL_OBJS)
++  LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
++ifeq ($(strip $(filter-out ppc% linux%,$(arch) $(osys))),)
++  LIBGNAT_TARGET_PAIRS = \
++  a-intnam.ads<4lintnam.ads \
++  s-inmaop.adb<7sinmaop.adb \
++  s-intman.adb<7sintman.adb \
++  s-osinte.ads<5iosinte.ads \
++  s-osinte.adb<5iosinte.adb \
++  s-osprim.adb<7sosprim.adb \
++  s-taprop.adb<5itaprop.adb \
++  s-tpopsp.adb<5atpopsp.adb \
++  s-taspri.ads<5itaspri.ads
++#  system.ads<59system.ads  (???)
++  TOOLS_TARGET_PAIRS=mlib-tgt.adb<5lml-tgt.adb
++  THREADSLIB=-lpthread
++  GNATLIB_SHARED=gnatlib-shared-dual
++  PREFIX_OBJS=$(PREFIX_REAL_OBJS)
++  LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
++ifeq ($(strip $(filter-out powerpc% linux%,$(arch) $(osys))),)
++  LIBGNAT_TARGET_PAIRS = \
++  a-intnam.ads<4lintnam.ads \
++  s-inmaop.adb<7sinmaop.adb \
++  s-intman.adb<7sintman.adb \
++  s-osinte.ads<5iosinte.ads \
++  s-osinte.adb<5iosinte.adb \
++  s-osprim.adb<7sosprim.adb \
++  s-taprop.adb<5itaprop.adb \
++  s-tpopsp.adb<5atpopsp.adb \
++  s-taspri.ads<5itaspri.ads
++#  system.ads<59system.ads  (???)
++  TOOLS_TARGET_PAIRS=mlib-tgt.adb<5lml-tgt.adb
++  THREADSLIB=-lpthread
++  GNATLIB_SHARED=gnatlib-shared-dual
++  PREFIX_OBJS=$(PREFIX_REAL_OBJS)
++  LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
++ifeq ($(strip $(filter-out s390% linux%,$(arch) $(osys))),)
++  TOOLS_TARGET_PAIRS=mlib-tgt.adb<5lml-tgt.adb
++  THREADSLIB=-lpthread
++  GNATLIB_SHARED=gnatlib-shared-dual
++  PREFIX_OBJS=$(PREFIX_REAL_OBJS)
++  LIBRARY_VERSION := $(LIB_VERSION)
++endif
++
+ ifeq ($(strip $(filter-out %x86_64 linux%,$(arch) $(osys))),)
+   LIBGNAT_TARGET_PAIRS = \
+   a-intnam.ads<4lintnam.ads \
+@@ -1767,6 +1840,9 @@
+ # is guaranteed to overflow the buffer.
+ gnatlib: ../stamp-gnatlib1 ../stamp-gnatlib2
++      $(RMDIR) save
++      $(MKDIR) save
++      $(MV) *.o save/
+       $(MAKE) -C rts CC="../../xgcc -B../../" \
+               INCLUDES="$(INCLUDES_FOR_SUBDIR) -I./../.." \
+                 CFLAGS="$(GNATLIBCFLAGS_FOR_C)" \
+@@ -1779,6 +1855,8 @@
+               srcdir=$(fsrcdir) \
+               -f ../Makefile \
+               $(GNATRTL_OBJS)
++      $(MV) save/*.o .
++      $(RMDIR) save
+       $(RM) rts/libgnat$(arext) rts/libgnarl$(arext)
+       $(AR) $(AR_FLAGS) rts/libgnat$(arext) \
+          $(addprefix rts/,$(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS))
+@@ -1891,14 +1969,15 @@
+            THREAD_KIND="$(THREAD_KIND)" \
+              gnatlib
+       $(RM) rts/libgnat$(soext) rts/libgnarl$(soext)
+-      cd rts; ../../xgcc -B../../ -shared $(TARGET_LIBGCC2_CFLAGS) \
++      cd rts; ../../xgcc -B../../ -shared -shared-libgcc $(TARGET_LIBGCC2_CFLAGS) \
+               -o libgnat-$(LIBRARY_VERSION)$(soext) \
+               $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \
+               $(SO_OPTS)libgnat-$(LIBRARY_VERSION)$(soext) $(MISCLIB) -lm
+       cd rts; ../../xgcc -B../../ -shared $(TARGET_LIBGCC2_CFLAGS) \
+               -o libgnarl-$(LIBRARY_VERSION)$(soext) \
+               $(GNATRTL_TASKING_OBJS) \
+-              $(SO_OPTS)libgnarl-$(LIBRARY_VERSION)$(soext) $(THREADSLIB)
++              $(SO_OPTS)libgnarl-$(LIBRARY_VERSION)$(soext) $(THREADSLIB) \
++              ./libgnat-$(LIBRARY_VERSION)$(soext)
+       cd rts; $(LN_S) libgnat-$(LIBRARY_VERSION)$(soext) libgnat$(soext)
+       cd rts; $(LN_S) libgnarl-$(LIBRARY_VERSION)$(soext) libgnarl$(soext)
diff --git a/gcc3-cxxabi.patch b/gcc3-cxxabi.patch
new file mode 100644 (file)
index 0000000..1797a85
--- /dev/null
@@ -0,0 +1,47 @@
+2005-02-18  Richard Henderson  <rth@redhat.com>
+
+       PR libstdc++/10606
+       * config/linker-map.gnu (CXXABI_1.3.1): Add __cxa_get_exception_ptr.
+       * libsupc++/eh_catch.cc (__cxa_get_exception_ptr): New.
+       * libsupc++/unwind-cxx.h (__cxa_get_exception_ptr): Declare.
+
+--- libstdc++-v3/config/linker-map.gnu (revision 94498)
++++ libstdc++-v3/config/linker-map.gnu (revision 95705)
+@@ -406,3 +410,9 @@ CXXABI_1.3 {
+   local:
+     *;
+ };
++
++CXXABI_1.3.1 {
++
++    __cxa_get_exception_ptr;
++
++} CXXABI_1.3;
+--- libstdc++-v3/libsupc++/unwind-cxx.h        (revision 94498)
++++ libstdc++-v3/libsupc++/unwind-cxx.h        (revision 95705)
+@@ -107,6 +107,7 @@ extern "C" void __cxa_throw (void *throw
+      __attribute__((noreturn));
+ // Used to implement exception handlers.
++extern "C" void *__cxa_get_exception_ptr (void *) throw();
+ extern "C" void *__cxa_begin_catch (void *) throw();
+ extern "C" void __cxa_end_catch ();
+ extern "C" void __cxa_rethrow () __attribute__((noreturn));
+--- libstdc++-v3/libsupc++/eh_catch.cc (revision 94498)
++++ libstdc++-v3/libsupc++/eh_catch.cc (revision 95705)
+@@ -33,6 +33,15 @@
+ using namespace __cxxabiv1;
++extern "C" void *
++__cxxabiv1::__cxa_get_exception_ptr(void *exc_obj_in) throw()
++{
++  _Unwind_Exception *exceptionObject
++    = reinterpret_cast <_Unwind_Exception *>(exc_obj_in);
++  __cxa_exception *header = __get_exception_header_from_ue (exceptionObject);
++
++  return header->adjustedPtr;
++}
+ extern "C" void *
+ __cxxabiv1::__cxa_begin_catch (void *exc_obj_in) throw()
diff --git a/gcc3-gcc_visibility.m4 b/gcc3-gcc_visibility.m4
new file mode 100644 (file)
index 0000000..e0d8f2a
--- /dev/null
@@ -0,0 +1,26 @@
+AC_DEFUN([HIDE_INLINES], [
+    visibility_inlines_hidden=yes
+    if test "X$CXX" != "X"; then
+       AC_MSG_CHECKING([whether ${CXX} accepts -fvisbility-inlines-hidden])
+       visbility_old_cxxflags="$CXXFLAGS"
+       CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+       AC_TRY_COMPILE(, , , visibility_inlines_hidden=no)
+       echo $visibility_inlines_hidden
+       if test "X$visibility_inlines_hidden" = "Xno"; then
+           CXXFLAGS="$visibility_old_cxxflags"
+       fi
+    fi
+])
+
+AC_DEFUN([HIDDEN_ATTRIBUTE], [
+    if test "X$CC" != "X"; then
+       AC_MSG_CHECKING([GCC visibility attribute])
+       AC_TRY_COMPILE(
+           [int __attribute__((visibility("hidden"))) test();],
+           [],
+           AC_DEFINE(HAVE_HIDDEN_ATTRIBUTE, 1, [])
+           AC_MSG_RESULT(yes),
+           AC_MSG_RESULT(no)
+       )
+    fi
+])
diff --git a/gcc3-info.patch b/gcc3-info.patch
new file mode 100644 (file)
index 0000000..54f3a9b
--- /dev/null
@@ -0,0 +1,233 @@
+--- gcc-3.4-20040611/gcc/doc/cpp.texi.orig     2004-01-18 12:59:03.000000000 +0100
++++ gcc-3.4-20040611/gcc/doc/cpp.texi  2004-06-12 03:49:21.959450032 +0200
+@@ -52,9 +52,9 @@
+ @set cppmanual
+ @ifinfo
+-@dircategory Programming
++@dircategory Programming Languages
+ @direntry
+-* Cpp: (cpp).                The GNU C preprocessor.
++* Cpp: (cpp).                         The GNU C preprocessor.
+ @end direntry
+ @end ifinfo
+--- gcc-3.4-20040611/gcc/doc/cppinternals.texi.orig    2002-01-07 20:03:36.000000000 +0100
++++ gcc-3.4-20040611/gcc/doc/cppinternals.texi 2004-06-12 03:50:08.394390848 +0200
+@@ -3,9 +3,9 @@
+ @settitle The GNU C Preprocessor Internals
+ @ifinfo
+-@dircategory Programming
++@dircategory Programming Languages
+ @direntry
+-* Cpplib: (cppinternals).      Cpplib internals.
++* Cpplib: (cppinternals).                     Cpplib internals.
+ @end direntry
+ @end ifinfo
+--- gcc-3.2/gcc/doc/gcc.texi.orig      Fri Nov  1 22:58:48 2002
++++ gcc-3.2/gcc/doc/gcc.texi   Fri Nov  1 23:06:12 2002
+@@ -65,9 +65,9 @@
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ @end macro
+ @ifnottex
+-@dircategory Programming
++@dircategory Programming Languages:
+ @direntry
+-* gcc: (gcc).                  The GNU Compiler Collection.
++* gcc: (gcc).                         The GNU Compiler Collection
+ @end direntry
+ This file documents the use of the GNU compilers.
+ @sp 1
+--- gcc-3.2/gcc/doc/gccint.texi.orig   Wed Jan 23 18:30:28 2002
++++ gcc-3.2/gcc/doc/gccint.texi        Fri Nov  1 23:06:57 2002
+@@ -51,9 +51,9 @@
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ @end macro
+ @ifnottex
+-@dircategory Programming
++@dircategory Programming Languages:
+ @direntry
+-* gccint: (gccint).            Internals of the GNU Compiler Collection.
++* gccint: (gccint).                   Internals of the GNU Compiler Collection
+ @end direntry
+ This file documents the internals of the GNU compilers.
+ @sp 1
+--- gcc-3.4-20040611/gcc/ada/gnat-style.texi.orig      2004-06-09 11:20:43.000000000 +0200
++++ gcc-3.4-20040611/gcc/ada/gnat-style.texi   2004-06-12 03:22:07.287957872 +0200
+@@ -28,9 +28,9 @@
+ @setchapternewpage odd
+-@dircategory Programming
++@dircategory Programming Languages
+ @direntry
+-* gnat-style: (gnat-style).      GNAT Coding Style
++* gnat-style: (gnat-style).           GNAT Coding Style
+ @end direntry
+ @macro syntax{element}
+--- gcc-3.4-20040611/gcc/ada/gnat_ugn.texi.orig        Fri Nov  1 22:58:52 2002
++++ gcc-3.4-20040611/gcc/ada/gnat_ugn.texi     Fri Nov  1 23:10:20 2002
+@@ -75,6 +75,11 @@
+ @syncodeindex fn cp
+ @c %**end of header
++@dircategory Programming Languages:
++@direntry
++* gnat_ug: (gnat_ug).                   GNAT User's Guide
++@end direntry
++
+ @titlepage
+ @ifset vms
+--- gcc-3.2/gcc/f/g77.texi.orig        Mon Apr 29 09:58:32 2002
++++ gcc-3.2/gcc/f/g77.texi     Fri Nov  1 23:11:56 2002
+@@ -90,9 +90,9 @@
+ @c @end tex
+ @ifinfo
+-@dircategory Programming
++@dircategory Programming Languages:
+ @direntry
+-* g77: (g77).                  The GNU Fortran compiler.
++* g77: (g77).                         The GNU Fortran compiler
+ @end direntry
+ @ifset INTERNALS
+ @ifset USING
+--- gcc-3.2/gcc/java/gcj.texi.orig     Sun Aug  4 18:55:55 2002
++++ gcc-3.2/gcc/java/gcj.texi  Fri Nov  1 23:16:39 2002
+@@ -20,26 +20,20 @@
+ @ifinfo
+ @format
+-@dircategory Programming
++@dircategory Programming Languages:
+ @direntry
+-* Gcj: (gcj).               Ahead-of-time compiler for the Java language
++* Gcj: (gcj).                         Ahead-of-time compiler for the Java language
+ @end direntry
+-@dircategory Individual utilities
++@dircategory Programming tools:
+ @direntry
+-* gcjh: (gcj)Invoking gcjh.
+-                            Generate header files from Java class files
+-* jv-scan: (gcj)Invoking jv-scan.
+-                            Print information about Java source files
+-* jcf-dump: (gcj)Invoking jcf-dump.
+-                            Print information about Java class files
+-* gij: (gcj)Invoking gij.   GNU interpreter for Java bytecode
+-* jv-convert: (gcj)Invoking jv-convert.
+-                            Convert file from one encoding to another
+-* rmic: (gcj)Invoking rmic.
+-                            Generate stubs for Remote Method Invocation.
+-* rmiregistry: (gcj)Invoking rmiregistry.
+-                            The remote object registry.
++* gcjh: (gcj)gcjh.                    Generate header files from Java class files
++* jv-scan: (gcj)jv-scan.              Print information about Java source files
++* jcf-dump: (gcj)jcf-dump.            Print information about Java class files
++* gij: (gcj)gij.                      GNU interpreter for Java bytecode
++* jv-convert: (gcj)jv-convert.                Convert file from one encoding to another
++* rmic: (gcj)rmic.                    Generate stubs for Remote Method Invocation.
++* rmiregistry: (gcj)rmiregistry.      The remote object registry
+ @end direntry
+ @end format
+@@ -120,15 +114,15 @@
+ * Copying::            The GNU General Public License
+ * GNU Free Documentation License::
+                       How you can share and copy this manual
+-* Invoking gcj::      Compiler options supported by @command{gcj}
++* gcj::                       Compiler options supported by @command{gcj}
+ * Compatibility::     Compatibility between gcj and other tools for Java
+-* Invoking gcjh::       Generate header files from class files
+-* Invoking jv-scan::    Print information about source files
+-* Invoking jcf-dump::   Print information about class files
+-* Invoking gij::      Interpreting Java bytecodes
+-* Invoking jv-convert:: Converting from one encoding to another
+-* Invoking rmic::        Generate stubs for Remote Method Invocation.
+-* Invoking rmiregistry:: The remote object registry.
++* gcjh::                Generate header files from class files
++* jv-scan::             Print information about source files
++* jcf-dump::            Print information about class files
++* gij::                       Interpreting Java bytecodes
++* jv-convert::          Converting from one encoding to another
++* rmic::                Generate stubs for Remote Method Invocation.
++* rmiregistry::         The remote object registry.
+ * About CNI::           Description of the Compiled Native Interface
+ * System properties::   Modifying runtime behavior of the libgcj library
+ * Resources::         Where to look for more information
+@@ -139,7 +133,7 @@
+ @include fdl.texi
+-@node Invoking gcj
++@node gcj
+ @chapter Invoking gcj
+ @c man title gcj Ahead-of-time compiler for the Java language
+@@ -506,7 +500,7 @@
+ @end itemize
+-@node Invoking gcjh
++@node gcjh
+ @chapter Invoking gcjh
+ @c man title gcjh generate header files from Java class files
+@@ -607,7 +601,7 @@
+ @c man end
+-@node Invoking jv-scan
++@node jv-scan
+ @chapter Invoking jv-scan
+ @c man title jv-scan print information about Java source file
+@@ -665,7 +659,7 @@
+ @c man end
+-@node Invoking jcf-dump
++@node jcf-dump
+ @chapter Invoking jcf-dump
+ @c man title jcf-dump print information about Java class files
+@@ -720,7 +714,7 @@
+ @c man end
+-@node Invoking gij
++@node gij
+ @chapter Invoking gij
+ @c man title gij GNU interpreter for Java bytecode
+@@ -798,7 +792,7 @@
+ @c man end
+-@node Invoking jv-convert
++@node jv-convert
+ @chapter Invoking jv-convert
+ @c man title jv-convert Convert file from one encoding to another
+@@ -857,7 +851,7 @@
+ @c man end
+-@node Invoking rmic
++@node rmic
+ @chapter Invoking rmic
+ @c man title rmic Generate stubs for Remote Method Invocation
+@@ -936,7 +930,7 @@
+ @c man end
+-@node Invoking rmiregistry
++@node rmiregistry
+ @chapter Invoking rmiregistry
+ @c man title rmiregistry Remote object registry
diff --git a/gcc3-nodebug.patch b/gcc3-nodebug.patch
new file mode 100644 (file)
index 0000000..b4e5be5
--- /dev/null
@@ -0,0 +1,66 @@
+--- gcc-3.3.3/gcc/Makefile.in.orig     2004-02-16 18:57:42.824016056 +0100
++++ gcc-3.3.3/gcc/Makefile.in  2004-02-16 18:59:52.167352880 +0100
+@@ -65,9 +65,9 @@
+ # TCFLAGS is used for compilations with the GCC just built.
+ XCFLAGS =
+ TCFLAGS =
+-CFLAGS = -g
+-STAGE1_CFLAGS = -g @stage1_cflags@
+-BOOT_CFLAGS = -g -O2
++CFLAGS =
++STAGE1_CFLAGS = @stage1_cflags@
++BOOT_CFLAGS = -O2
+ # Flags to determine code coverage. When coverage is disabled, this will
+ # contain the optimization flags, as you normally want code coverage
+@@ -390,7 +390,7 @@
+ # Options to use when compiling libgcc2.a.
+ #
+-LIBGCC2_DEBUG_CFLAGS = -g
++LIBGCC2_DEBUG_CFLAGS =
+ LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED @inhibit_libc@
+ # Additional options to use when compiling libgcc2.a.
+--- gcc-3.3.3/gcc/ada/Makefile.in.orig 2004-02-16 08:29:33.000000000 +0100
++++ gcc-3.3.3/gcc/ada/Makefile.in      2004-02-16 19:04:55.708207656 +0100
+@@ -73,7 +73,7 @@
+ # to the stage2 and stage3 compilations
+ # XCFLAGS is used for most compilations but not when using the GCC just built.
+ XCFLAGS =
+-CFLAGS = -g
++CFLAGS =
+ BOOT_CFLAGS = -O $(CFLAGS)
+ # These exists to be overridden by the x-* and t-* files, respectively.
+ X_CFLAGS =
+@@ -127,7 +127,7 @@
+ SOME_ADAFLAGS =-gnata
+ FORCE_DEBUG_ADAFLAGS = -g
+ GNATLIBFLAGS = -gnatpg
+-GNATLIBCFLAGS = -g -O2
++GNATLIBCFLAGS = -O2
+ GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) -fexceptions \
+       -DIN_RTS
+ ALL_ADA_CFLAGS = $(X_ADA_CFLAGS) $(T_ADA_CFLAGS) $(ADA_CFLAGS)
+--- gcc-3.3.3/libjava/Makefile.am.orig 2004-02-16 08:29:34.000000000 +0100
++++ gcc-3.3.3/libjava/Makefile.am      2004-02-16 19:02:25.582030304 +0100
+@@ -95,7 +95,7 @@
+ AM_CFLAGS = @LIBGCJ_CFLAGS@
+ endif
+-JCFLAGS = -g
++JCFLAGS =
+ JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS)
+ LIBFFIINCS = @LIBFFIINCS@
+--- gcc-3.3.3/libjava/Makefile.in.orig 2004-02-16 08:29:34.000000000 +0100
++++ gcc-3.3.3/libjava/Makefile.in      2004-02-16 19:02:31.196176824 +0100
+@@ -180,7 +180,7 @@
+ @USING_GCC_TRUE@AM_CFLAGS = @USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS)
+ @USING_GCC_FALSE@AM_CFLAGS = @USING_GCC_FALSE@@LIBGCJ_CFLAGS@
+-JCFLAGS = -g
++JCFLAGS =
+ JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS)
+ LIBFFIINCS = @LIBFFIINCS@
diff --git a/gcc3-nolocalefiles.patch b/gcc3-nolocalefiles.patch
new file mode 100644 (file)
index 0000000..720954a
--- /dev/null
@@ -0,0 +1,11 @@
+--- gcc-3.2/libstdc++-v3/configure.orig        Sat Jul 27 01:23:04 2002
++++ gcc-3.2/libstdc++-v3/configure     Thu Aug 22 08:03:18 2002
+@@ -2957,7 +2957,7 @@
+               int j;
+               __locale_t        loc;
+                __locale_t        loc_dup;
+-              loc = __newlocale(1 << LC_ALL, "de_DE", 0);
++              loc = __newlocale(1 << LC_ALL, "C", 0);
+               loc_dup = __duplocale(loc);
+               i = __strcoll_l(__one, __two, loc);
+               j = __strcoll_l(__one, __two, loc_dup);
diff --git a/gcc3-pr-rh.patch b/gcc3-pr-rh.patch
new file mode 100644 (file)
index 0000000..5d4abef
--- /dev/null
@@ -0,0 +1,3102 @@
+2006-02-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libstdc++/11953
+       * gthr-posix.h (_REENTRANT): Only define if __osf__ is defined.
+
+       * config/ia64/linux.h (CPP_SPEC): Define.
+       * config/s390/linux.h (CPP_SPEC): Define.
+--- gcc/gthr-posix.h   (revision 111211)
++++ gcc/gthr-posix.h   (revision 111212)
+@@ -36,7 +36,7 @@ Software Foundation, 51 Franklin Street,
+ #define __GTHREADS 1
+ /* Some implementations of <pthread.h> require this to be defined.  */
+-#ifndef _REENTRANT
++#if !defined(_REENTRANT) && defined(__osf__)
+ #define _REENTRANT 1
+ #endif
+--- gcc/config/s390/linux.h    (revision 111211)
++++ gcc/config/s390/linux.h    (revision 111212)
+@@ -89,6 +89,7 @@ Software Foundation, 51 Franklin Street,
+           %{m31:-dynamic-linker /lib/ld.so.1} \
+           %{m64:-dynamic-linker /lib64/ld64.so.1}}}}"
++#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
+ #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
+--- gcc/config/ia64/linux.h    (revision 111211)
++++ gcc/config/ia64/linux.h    (revision 111212)
+@@ -48,6 +48,7 @@ do {                                         \
+       %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \
+       %{static:-static}}"
++#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
+ #define JMP_BUF_SIZE  76
+2004-05-27  Josef Zlomek  <zlomekj@suse.cz>
+
+       PR middle-end/14084
+       * emit-rtl.c (gen_rtx_REG_offset): Adjust the offset according
+       to size of decl.
+
+--- gcc/emit-rtl.c     25 May 2004 12:04:15 -0000      1.391
++++ gcc/emit-rtl.c     27 May 2004 04:28:12 -0000      1.392
+@@ -746,13 +746,96 @@ gen_reg_rtx (enum machine_mode mode)
+   return val;
+ }
+-/* Generate a register with same attributes as REG,
+-   but offsetted by OFFSET.  */
++/* Generate a register with same attributes as REG, but offsetted by OFFSET.
++   Do the big endian correction if needed.  */
+ rtx
+ gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int offset)
+ {
+   rtx new = gen_rtx_REG (mode, regno);
++  tree decl;
++  HOST_WIDE_INT var_size;
++
++  /* PR middle-end/14084
++     The problem appears when a variable is stored in a larger register
++     and later it is used in the original mode or some mode in between
++     or some part of variable is accessed.
++
++     On little endian machines there is no problem because
++     the REG_OFFSET of the start of the variable is the same when
++     accessed in any mode (it is 0).
++
++     However, this is not true on big endian machines.
++     The offset of the start of the variable is different when accessed
++     in different modes.
++     When we are taking a part of the REG we have to change the OFFSET
++     from offset WRT size of mode of REG to offset WRT size of variable.
++
++     If we would not do the big endian correction the resulting REG_OFFSET
++     would be larger than the size of the DECL.
++
++     Examples of correction, for BYTES_BIG_ENDIAN WORDS_BIG_ENDIAN machine:
++
++     REG.mode  MODE  DECL size  old offset  new offset  description
++     DI        SI    4          4           0           int32 in SImode
++     DI        SI    1          4           0           char in SImode
++     DI        QI    1          7           0           char in QImode
++     DI        QI    4          5           1           1st element in QImode
++                                                        of char[4]
++     DI        HI    4          6           2           1st element in HImode
++                                                        of int16[2]
++
++     If the size of DECL is equal or greater than the size of REG
++     we can't do this correction because the register holds the
++     whole variable or a part of the variable and thus the REG_OFFSET
++     is already correct.  */
++
++  decl = REG_EXPR (reg);
++  if ((BYTES_BIG_ENDIAN || WORDS_BIG_ENDIAN)
++      && decl != NULL
++      && offset > 0
++      && GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (mode)
++      && ((var_size = int_size_in_bytes (TREE_TYPE (decl))) > 0
++        && var_size < GET_MODE_SIZE (GET_MODE (reg))))
++    {
++      int offset_le;
++
++      /* Convert machine endian to little endian WRT size of mode of REG.  */
++      if (WORDS_BIG_ENDIAN)
++      offset_le = ((GET_MODE_SIZE (GET_MODE (reg)) - 1 - offset)
++                   / UNITS_PER_WORD) * UNITS_PER_WORD;
++      else
++      offset_le = (offset / UNITS_PER_WORD) * UNITS_PER_WORD;
++
++      if (BYTES_BIG_ENDIAN)
++      offset_le += ((GET_MODE_SIZE (GET_MODE (reg)) - 1 - offset)
++                    % UNITS_PER_WORD);
++      else
++      offset_le += offset % UNITS_PER_WORD;
++
++      if (offset_le >= var_size)
++      {
++        /* MODE is wider than the variable so the new reg will cover
++           the whole variable so the resulting OFFSET should be 0.  */
++        offset = 0;
++      }
++      else
++      {
++        /* Convert little endian to machine endian WRT size of variable.  */
++        if (WORDS_BIG_ENDIAN)
++          offset = ((var_size - 1 - offset_le)
++                    / UNITS_PER_WORD) * UNITS_PER_WORD;
++        else
++          offset = (offset_le / UNITS_PER_WORD) * UNITS_PER_WORD;
++
++        if (BYTES_BIG_ENDIAN)
++          offset += ((var_size - 1 - offset_le)
++                     % UNITS_PER_WORD);
++        else
++          offset += offset_le % UNITS_PER_WORD;
++      }
++    }
++
+   REG_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
+                                  REG_OFFSET (reg) + offset);
+   return new;
+2005-01-13  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/16104
+       * expr.c (convert_move): Handle vector from resp. to if mode
+       sizes differ.
+
+       * gcc.c-torture/execute/20050113-1.c: New test.
+
+--- gcc/expr.c.jj      2004-12-27 21:31:08.000000000 +0100
++++ gcc/expr.c 2005-01-13 15:56:31.229253647 +0100
+@@ -590,7 +590,26 @@ convert_move (rtx to, rtx from, int unsi
+   if (VECTOR_MODE_P (to_mode) || VECTOR_MODE_P (from_mode))
+     {
+       if (GET_MODE_BITSIZE (from_mode) != GET_MODE_BITSIZE (to_mode))
+-      abort ();
++        {
++          if (VECTOR_MODE_P (from_mode))
++            {
++              enum machine_mode new_mode;
++
++              new_mode = mode_for_size (GET_MODE_BITSIZE (from_mode),
++                                        MODE_INT, 0);
++              from = simplify_gen_subreg (new_mode, from, from_mode, 0);
++            }
++          if (VECTOR_MODE_P (to_mode))
++            {
++              enum machine_mode new_mode;
++
++              new_mode = mode_for_size (GET_MODE_BITSIZE (to_mode),
++                                        MODE_INT, 0);
++              to = simplify_gen_subreg (new_mode, to, to_mode, 0);
++            }
++          convert_move (to, from, unsignedp);
++          return;
++        }
+       if (VECTOR_MODE_P (to_mode))
+       from = simplify_gen_subreg (to_mode, from, GET_MODE (from), 0);
+--- gcc/testsuite/gcc.c-torture/execute/20050113-1.c.jj        2005-01-13 15:51:09.194383356 +0100
++++ gcc/testsuite/gcc.c-torture/execute/20050113-1.c   2005-01-13 15:37:22.000000000 +0100
+@@ -0,0 +1,56 @@
++/* PR rtl-optimization/16104 */
++
++extern void abort (void);
++
++typedef int V2SI __attribute__ ((vector_size (8)));
++typedef short V2HI __attribute__ ((vector_size (4)));
++
++int
++test1 (void)
++{
++  return (long long) (V2SI) 0LL;
++}
++
++int
++test2 (V2SI x)
++{
++  return (long long) x;
++}
++
++V2SI
++test3 (void)
++{
++  return (V2SI) (long long) (int) (V2HI) 0;
++}
++
++V2SI
++test4 (V2HI x)
++{
++  return (V2SI) (long long) (int) x;
++}
++
++int
++main (void)
++{
++  if (sizeof (short) != 2 || sizeof (int) != 4 || sizeof (long long) != 8)
++    return 0;
++
++  if (test1 () != 0)
++    abort ();
++
++  V2SI x = { 2, 2 };
++  if (test2 (x) != 2)
++    abort ();
++
++  union { V2SI x; int y[2]; } u;
++  u.x = test3 ();
++  if (u.y[0] != 0 || u.y[1] != 0)
++    abort ();
++
++  V2HI y = { 4, 4 };
++  union { V2SI x; long long y; } v;
++  v.x = test4 (y);
++  if (v.y != 0x40004)
++    abort ();
++  return 0;
++}
+2005-09-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/18300
+       * config/i386/i386.c (classify_argument): Only use different
+       iterators for nested loops if nested loops sharing the same
+       iterator would hang.
+
+2004-11-13  Zak Kipling  <zak@transversal.com>
+
+       PR target/18300
+       * config/i386/i386.c (classify_argument): Fix infinite loop when
+       passing object with 3 or more base classes by value.
+
+--- gcc/config/i386/i386.c.jj  2005-07-21 11:01:36.000000000 +0200
++++ gcc/config/i386/i386.c     2005-09-07 14:22:19.000000000 +0200
+@@ -2028,8 +2028,17 @@ classify_argument (enum machine_mode mod
+           {
+             tree bases = TYPE_BINFO_BASETYPES (type);
+             int n_bases = TREE_VEC_LENGTH (bases);
+-            int i;
+-
++            int i, basenum;
++            enum x86_64_reg_class saveclasses[MAX_CLASSES];
++            bool seen[MAX_CLASSES];
++
++            /* PR target/18300: The following code mistakenly uses the same
++               iterator variable in both nested for loops.  But to preserve
++               binary compatibility, do whatever this code used to do before
++               unless old GCC would hang in an infinite loop.  In that case
++               use whatever GCC 4.0+ does.  */
++            memset (seen, 0, sizeof (seen));
++            memcpy (saveclasses, classes, sizeof (saveclasses));
+             for (i = 0; i < n_bases; ++i)
+               {
+                  tree binfo = TREE_VEC_ELT (bases, i);
+@@ -2037,6 +2046,12 @@ classify_argument (enum machine_mode mod
+                  int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
+                  tree type = BINFO_TYPE (binfo);
++                 if (i < MAX_CLASSES)
++                   {
++                     if (seen[i])
++                       break;
++                     seen[i] = true;
++                   }
+                  num = classify_argument (TYPE_MODE (type),
+                                           type, subclasses,
+                                           (offset + bit_offset) % 256);
+@@ -2049,6 +2064,32 @@ classify_argument (enum machine_mode mod
+                        merge_classes (subclasses[i], classes[i + pos]);
+                    }
+               }
++            if (i < n_bases)
++              {
++                /* Older GCC 3.[0-4].x would hang in the above loop, so
++                   don't worry about backwards compatibility and
++                   just DTRT.  */
++                memcpy (classes, saveclasses, sizeof (saveclasses));
++                for (basenum = 0; basenum < n_bases; ++basenum)
++                  {
++                    tree binfo = TREE_VEC_ELT (bases, basenum);
++                    int num;
++                    int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
++                    tree type = BINFO_TYPE (binfo);
++
++                    num = classify_argument (TYPE_MODE (type),
++                                             type, subclasses,
++                                             (offset + bit_offset) % 256);
++                    if (!num)
++                      return 0;
++                    for (i = 0; i < num; i++)
++                      {
++                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
++                        classes[i + pos] =
++                          merge_classes (subclasses[i], classes[i + pos]);
++                      }
++                  }
++              }
+           }
+         /* And now merge the fields of structure.  */
+         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+@@ -2116,8 +2157,17 @@ classify_argument (enum machine_mode mod
+           {
+             tree bases = TYPE_BINFO_BASETYPES (type);
+             int n_bases = TREE_VEC_LENGTH (bases);
+-            int i;
+-
++            int i, basenum;
++            enum x86_64_reg_class saveclasses[MAX_CLASSES];
++            bool seen[MAX_CLASSES];
++
++            /* PR target/18300: The following code mistakenly uses the same
++               iterator variable in both nested for loops.  But to preserve
++               binary compatibility, do whatever this code used to do before
++               unless old GCC would hang in an infinite loop.  In that case
++               use whatever GCC 4.0+ does.  */
++            memset (seen, 0, sizeof (seen));
++            memcpy (saveclasses, classes, sizeof (saveclasses));
+             for (i = 0; i < n_bases; ++i)
+               {
+                  tree binfo = TREE_VEC_ELT (bases, i);
+@@ -2125,6 +2175,12 @@ classify_argument (enum machine_mode mod
+                  int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
+                  tree type = BINFO_TYPE (binfo);
++                 if (i < MAX_CLASSES)
++                   {
++                     if (seen[i])
++                       break;
++                     seen[i] = true;
++                   }
+                  num = classify_argument (TYPE_MODE (type),
+                                           type, subclasses,
+                                           (offset + (bit_offset % 64)) % 256);
+@@ -2137,6 +2193,32 @@ classify_argument (enum machine_mode mod
+                        merge_classes (subclasses[i], classes[i + pos]);
+                    }
+               }
++            if (i < n_bases)
++              {
++                /* Older GCC 3.[0-4].x would hang in the above loop, so
++                   don't worry about backwards compatibility and
++                   just DTRT.  */
++                memcpy (classes, saveclasses, sizeof (saveclasses));
++                for (basenum = 0; basenum < n_bases; ++basenum)
++                  {
++                    tree binfo = TREE_VEC_ELT (bases, basenum);
++                    int num;
++                    int offset = tree_low_cst (BINFO_OFFSET (binfo), 0) * 8;
++                    tree type = BINFO_TYPE (binfo);
++
++                    num = classify_argument (TYPE_MODE (type),
++                                             type, subclasses,
++                                             (offset + (bit_offset % 64)) % 256);
++                    if (!num)
++                      return 0;
++                    for (i = 0; i < num; i++)
++                      {
++                        int pos = (offset + (bit_offset % 64)) / 8 / 8;
++                        classes[i + pos] =
++                          merge_classes (subclasses[i], classes[i + pos]);
++                      }
++                  }
++              }
+           }
+         for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+           {
+--- gcc/testsuite/g++.dg/other/infloop-1.C 1 Jan 1970 00:00:00 -0000
++++ gcc/testsuite/g++.dg/other/infloop-1.C     13 Nov 2004 23:09:08 -0000      1.1
+@@ -0,0 +1,16 @@
++// PR 18300: This sends old compilers into an infinite loop on x86_64
++// Testcase and patch contributed by Zak Kipling <zak@transversal.com>
++
++struct base1 { };
++struct base2 { };
++struct base3 { };
++
++struct derived : base1, base2, base3 { };
++
++void foo(derived);
++
++int main()
++{
++  foo(derived());
++}
++
+--- gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C        1 Jan 1970 00:00:00 -0000
++++ gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C        14 Dec 2004 02:15:55 -0000      1.1
+@@ -0,0 +1,20 @@
++// PR c++/18925
++// { dg-do compile { target ia64-*-linux* } }
++// { dg-options "-fPIC -fvisibility=hidden" }
++// { dg-final { scan-assembler-not "gprel" } }
++
++class __attribute__ ((visibility("default"))) Type 
++{ 
++ private: 
++  static long _staticTypeCount; 
++ public: 
++  Type() { _staticTypeCount++; } 
++  ~Type(); 
++}; 
++ 
++long Type::_staticTypeCount = 0; 
++ 
++Type::~Type() 
++{ 
++ _staticTypeCount--; 
++} 
+2005-05-07  Richard Henderson  <rth@redhat.com>
+
+       PR target/21412
+       * config/rs6000/rs6000.c (rs6000_emit_move): Look for tls addresses
+       with constant offsets.
+
+2004-07-11  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * config/s390/s390.c (legitimize_tls_address): Handle constant offsets
+       added to TLS symbol addresses.
+
+2004-07-06  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.c (legitimize_address): Handle CONST with TLS
+       operand.
+       (ix86_expand_move): Don't call legitimize_pic_address directly.
+
+2006-05-05  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/tls/opt-12.c: New test.
+
+--- gcc/config/s390/s390.c     (revision 84404)
++++ gcc/config/s390/s390.c     (revision 84535)
+@@ -2913,6 +2913,18 @@ legitimize_tls_address (rtx addr, rtx re
+       }
+     }
++  else if (GET_CODE (addr) == CONST && GET_CODE (XEXP (addr, 0)) == PLUS
++         && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
++    {
++      new = XEXP (XEXP (addr, 0), 0);
++      if (GET_CODE (new) != SYMBOL_REF)
++      new = gen_rtx_CONST (Pmode, new);
++
++      new = legitimize_tls_address (new, reg);
++      new = plus_constant (new, INTVAL (XEXP (XEXP (addr, 0), 1)));
++      new = force_operand (new, 0);
++    }
++
+   else
+     abort ();  /* for now ... */
+--- gcc/config/i386/i386.c     2005-11-21 14:56:49.000000000 +0100
++++ gcc/config/i386/i386.c     2006-05-05 11:21:54.000000000 +0200
+@@ -6604,6 +6604,13 @@ legitimize_address (rtx x, rtx oldx ATTR
+   log = tls_symbolic_operand (x, mode);
+   if (log)
+     return legitimize_tls_address (x, log, false);
++  if (GET_CODE (x) == CONST
++      && GET_CODE (XEXP (x, 0)) == PLUS
++      && (log = tls_symbolic_operand (XEXP (XEXP (x, 0), 0), Pmode)))
++    {
++      rtx t = legitimize_tls_address (XEXP (XEXP (x, 0), 0), log, false);
++      return gen_rtx_PLUS (Pmode, t, XEXP (XEXP (x, 0), 1));
++    }
+   if (flag_pic && SYMBOLIC_CONST (x))
+     return legitimize_pic_address (x, 0);
+@@ -8395,6 +8402,10 @@ ix86_expand_move (enum machine_mode mode
+ #else
+       if (GET_CODE (op0) == MEM)
+       op1 = force_reg (Pmode, op1);
++      else if (GET_CODE (op1) == CONST
++             && GET_CODE (XEXP (op1, 0)) == PLUS
++             && tls_symbolic_operand (XEXP (XEXP (op1, 0), 0), Pmode))
++      op1 = legitimize_address (op1, op1, Pmode);
+       else
+       {
+         rtx temp = op0;
+--- gcc/config/rs6000/rs6000.c (revision 99334)
++++ gcc/config/rs6000/rs6000.c (revision 99367)
+@@ -4436,11 +4436,31 @@ rs6000_emit_move (rtx dest, rtx source, 
+   /* Recognize the case where operand[1] is a reference to thread-local
+      data and load its address to a register.  */
+-  if (GET_CODE (operands[1]) == SYMBOL_REF)
++  if (rs6000_tls_referenced_p (operands[1]))
+     {
+-      enum tls_model model = SYMBOL_REF_TLS_MODEL (operands[1]);
+-      if (model != 0)
+-      operands[1] = rs6000_legitimize_tls_address (operands[1], model);
++      enum tls_model model;
++      rtx tmp = operands[1];
++      rtx addend = NULL;
++
++      if (GET_CODE (tmp) == CONST && GET_CODE (XEXP (tmp, 0)) == PLUS)
++      {
++          addend = XEXP (XEXP (tmp, 0), 1);
++        tmp = XEXP (XEXP (tmp, 0), 0);
++      }
++
++      if (GET_CODE (tmp) != SYMBOL_REF)
++      abort ();
++      model = SYMBOL_REF_TLS_MODEL (tmp);
++      if (model == 0)
++      abort ();
++
++      tmp = rs6000_legitimize_tls_address (tmp, model);
++      if (addend)
++      {
++        tmp = gen_rtx_PLUS (mode, tmp, addend);
++        tmp = force_operand (tmp, operands[0]);
++      }
++      operands[1] = tmp;
+     }
+   /* Handle the case where reload calls us with an invalid address.  */
+--- gcc/testsuite/gcc.dg/tls/opt-9.c   (revision 0)
++++ gcc/testsuite/gcc.dg/tls/opt-9.c   (revision 99367)
+@@ -0,0 +1,7 @@
++/* PR 21412 */
++/* { dg-do compile */
++/* { dg-options "-O2 -fPIC" } */
++
++struct S { int x[10]; };
++extern __thread struct S s;
++int *foo() { return &s.x[2]; }
+--- gcc/testsuite/gcc.dg/tls/opt-12.c  2006-04-19 19:21:31.748476000 +0200
++++ gcc/testsuite/gcc.dg/tls/opt-12.c  2006-05-05 11:01:33.000000000 +0200
+@@ -0,0 +1,16 @@
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++/* { XXdgXX-require-effective-target tls } */
++
++__thread struct
++{
++  int a;
++  char b[32];
++} thr;
++
++int
++main ()
++{
++  __builtin_strcpy (thr.b, "abcd");
++  return 0;
++}
+2005-07-22  Jakub Jelinek  <jakub@redhat.com>
+
+       * src/sstream-inst.cc: Add .hidden directive for
+       streamsize basic_stringbuf<{char,wchar_t}>::showmanyc().
+       * src/sstream-inst-showmanyc.cc: New file.
+       * src/Makefile.am (libstdc++_nonshared.la): Add new library.
+       * src/Makefile.in: Rebuilt.
+       * testsuite/lib/libstdc++.exp: Append -lstdc++_nonshared for
+       testsuite executable linking.
+
+2005-06-08  Benjamin Kosnik  <bkoz@redhat.com>
+
+       PR libstdc++/21955
+       * include/std/std_sstream.h (basic_stringbuf::showmanyc): Add.
+       * testsuite/27_io/basic_streambuf/in_avail/char/1.cc: New, test
+       base class behavior.
+       * testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc: Same.
+       * testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc: New.
+       * testsuite/27_io/basic_stringbuf/in_avail/char/1.cc: Match
+       filebuf behavior.
+       * testsuite/27_io/basic_stringbuf/str/char/1.cc: Same.
+
+--- libstdc++-v3/src/sstream-inst.cc.jj        2003-07-11 10:28:13.000000000 +0200
++++ libstdc++-v3/src/sstream-inst.cc   2005-07-21 17:46:08.000000000 +0200
+@@ -60,3 +60,8 @@ namespace std
+   template class basic_stringstream<wchar_t>; 
+ #endif
+ } // namespace std
++
++#ifdef PIC
++__asm (".hidden _ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9showmanycEv");
++__asm (".hidden _ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9showmanycEv");
++#endif
+--- libstdc++-v3/src/sstream-inst-showmanyc.cc.jj      2005-07-21 21:27:40.000000000 +0200
++++ libstdc++-v3/src/sstream-inst-showmanyc.cc 2005-07-22 09:16:58.000000000 +0200
+@@ -0,0 +1,39 @@
++// Explicit instantiation file.
++
++// Copyright (C) 2005
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 2, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// As a special exception, you may use this file as part of a free software
++// library without restriction.  Specifically, if other files instantiate
++// templates or use macros or inline functions from this file, or you compile
++// this file and link it with other files to produce an executable, this
++// file does not by itself cause the resulting executable to be covered by
++// the GNU General Public License.  This exception does not however
++// invalidate any other reasons why the executable file might be covered by
++// the GNU General Public License.
++
++#include <sstream>
++
++namespace std
++{
++  // These symbols are hidden in libstdc++.so, as it is undesirable to export
++  // @@GLIBCXX_3.4.6
++  template streamsize basic_stringbuf<char, char_traits<char>, allocator<char> >::showmanyc();
++  template streamsize basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >::showmanyc();
++} // namespace std
+--- libstdc++-v3/src/Makefile.am.jj    2004-04-20 15:55:47.000000000 +0200
++++ libstdc++-v3/src/Makefile.am       2005-07-22 09:00:32.000000000 +0200
+@@ -25,7 +25,7 @@
+ include $(top_srcdir)/fragment.am
+ # Cross compiler support.
+-toolexeclib_LTLIBRARIES = libstdc++.la
++toolexeclib_LTLIBRARIES = libstdc++.la libstdc++_nonshared.la
+ # Symbol versioning for shared libraries.
+ if GLIBCXX_BUILD_VERSIONED_SHLIB
+@@ -150,6 +150,11 @@ libstdc___la_DEPENDENCIES = ${version_de
+ libstdc___la_LDFLAGS = \
+       -version-info $(libtool_VERSION) ${version_arg} -lm 
++libstdc___nonshared_la_SOURCES = \
++      sstream-inst-showmanyc.cc
++libstdc___nonshared_la_LIBADD =
++libstdc___nonshared_la_DEPENDENCIES = $(libstdc___nonshared_la_LIBADD)
++libstdc___nonshared_la_LDFLAGS = -static
+ # Use special rules for the deprecated source files so that they find
+ # deprecated include files.
+@@ -159,6 +164,14 @@ strstream.lo: strstream.cc
+ strstream.o: strstream.cc
+       $(CXXCOMPILE) -I$(GLIBCXX_INCLUDE_DIR)/backward -Wno-deprecated -c $<
++# Use special rules for libstdc++_nonshared.la files, as -prefer-pic
++# doesn't seem to work for some reason.
++sstream-inst-showmanyc.lo: sstream-inst-showmanyc.cc
++      $(LTCXXCOMPILE) -c $< \
++        && cp -f .libs/sstream-inst-showmanyc.o sstream-inst-showmanyc.o
++sstream-inst-showmanyc.o: sstream-inst-showmanyc.cc
++      $(CXXCOMPILE) -fPIC -DPIC -c $<
++
+ # Use special rules for the concept-checking instantiations so that all
+ # the generated template functions are also instantiated.  Force the checks
+ # to be on so that the instantiations are actually seen.
+--- libstdc++-v3/src/Makefile.in.jj    2004-04-20 15:55:47.000000000 +0200
++++ libstdc++-v3/src/Makefile.in       2005-07-22 09:06:15.000000000 +0200
+@@ -221,7 +221,7 @@ WARN_CXXFLAGS = \
+ AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
+ # Cross compiler support.
+-toolexeclib_LTLIBRARIES = libstdc++.la
++toolexeclib_LTLIBRARIES = libstdc++.la libstdc++_nonshared.la
+ # Symbol versioning for shared libraries.
+ @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@version_arg = -Wl,--version-script=libstdc++-symbol.ver
+@@ -308,6 +308,13 @@ libstdc___la_LDFLAGS = \
+       -version-info $(libtool_VERSION) ${version_arg} -lm 
++libstdc___nonshared_la_SOURCES = \
++      sstream-inst-showmanyc.cc
++
++libstdc___nonshared_la_LIBADD = 
++libstdc___nonshared_la_DEPENDENCIES = $(libstdc___nonshared_la_LIBADD)
++libstdc___nonshared_la_LDFLAGS = -static
++
+ # Use special rules for the deprecated source files so that they find
+ # deprecated include files.
+ GLIBCXX_INCLUDE_DIR = $(glibcxx_builddir)/include
+@@ -379,6 +386,8 @@ am__objects_3 = allocator.lo codecvt.lo 
+       $(am__objects_1) $(am__objects_2)
+ am_libstdc___la_OBJECTS = $(am__objects_3)
+ libstdc___la_OBJECTS = $(am_libstdc___la_OBJECTS)
++am_libstdc___nonshared_la_OBJECTS = sstream-inst-showmanyc.lo
++libstdc___nonshared_la_OBJECTS = $(am_libstdc___nonshared_la_OBJECTS)
+ DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
+ depcomp =
+@@ -386,10 +395,10 @@ am__depfiles_maybe =
+ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+       $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+ CXXLD = $(CXX)
+-DIST_SOURCES = $(libstdc___la_SOURCES)
++DIST_SOURCES = $(libstdc___la_SOURCES) $(libstdc___nonshared_la_SOURCES)
+ DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/fragment.am \
+       Makefile.am
+-SOURCES = $(libstdc___la_SOURCES)
++SOURCES = $(libstdc___la_SOURCES) $(libstdc___nonshared_la_SOURCES)
+ all: all-am
+@@ -430,6 +439,8 @@ clean-toolexeclibLTLIBRARIES:
+       done
+ libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES) 
+       $(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___la_LDFLAGS) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS)
++libstdc++_nonshared.la: $(libstdc___nonshared_la_OBJECTS) $(libstdc___nonshared_la_DEPENDENCIES) 
++      $(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___nonshared_la_LDFLAGS) $(libstdc___nonshared_la_OBJECTS) $(libstdc___nonshared_la_LIBADD) $(LIBS)
+ mostlyclean-compile:
+       -rm -f *.$(OBJEXT) core *.core
+@@ -674,6 +685,14 @@ strstream.lo: strstream.cc
+ strstream.o: strstream.cc
+       $(CXXCOMPILE) -I$(GLIBCXX_INCLUDE_DIR)/backward -Wno-deprecated -c $<
++# Use special rules for libstdc++_nonshared.la files, as -prefer-pic
++# doesn't seem to work for some reason.
++sstream-inst-showmanyc.lo: sstream-inst-showmanyc.cc
++      $(LTCXXCOMPILE) -c $< \
++        && cp -f .libs/sstream-inst-showmanyc.o sstream-inst-showmanyc.o
++sstream-inst-showmanyc.o: sstream-inst-showmanyc.cc
++      $(CXXCOMPILE) -fPIC -DPIC -c $<
++
+ # Use special rules for the concept-checking instantiations so that all
+ # the generated template functions are also instantiated.  Force the checks
+ # to be on so that the instantiations are actually seen.
+--- libstdc++-v3/include/std/std_sstream.h.jj  2004-10-04 14:58:25.000000000 +0200
++++ libstdc++-v3/include/std/std_sstream.h     2005-07-21 17:17:16.000000000 +0200
+@@ -185,6 +185,18 @@ namespace std
+       _M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
+       }
++      virtual streamsize
++      showmanyc()
++      {
++      streamsize __ret = -1;
++      if (_M_mode & ios_base::in)
++        {
++          _M_update_egptr();
++          __ret = this->egptr() - this->gptr();
++        }
++      return __ret;
++      }
++
+       // [documentation is inherited]
+       virtual int_type
+       underflow();
+--- libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc.jj      2003-10-01 12:12:11.000000000 +0200
++++ libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc 2005-07-22 01:22:15.000000000 +0200
+@@ -45,7 +45,7 @@ void test03() 
+   std::streamsize d1 = strb_01.in_avail();
+   std::streamsize d2 = strb_03.in_avail();
+   VERIFY( d1 ); // non-zero
+-  VERIFY( !d2 ); // zero, cuz ios_base::out
++  VERIFY( d2 == -1 ); // -1, cuz ios_base::out
+   VERIFY( d1 != d2 ); //these should be the same
+   VERIFY( static_cast<std::streamsize>(str_01.length()) == d1 );  
+   VERIFY( strb_01.str() == strb_03.str() ); //ditto
+--- libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc.jj 2003-10-01 12:12:10.000000000 +0200
++++ libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc    2005-07-22 01:22:04.000000000 +0200
+@@ -49,8 +49,8 @@ void test04() 
+   VERIFY( strmof_1 == static_cast<std::streamoff>(str_01.length()) );
+   VERIFY( strmof_2 == static_cast<std::streamoff>(str_02.length()) );
+   strmof_1 = strb_03.in_avail(); 
+-  // zero cuz write-only, or eof()? zero, from showmany
+-  VERIFY( strmof_1 == 0 ); 
++  // zero cuz write-only, or eof() to match basic_filebuf
++  VERIFY( strmof_1 == -1 ); 
+ }
+ int main()
+--- libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc.jj     2005-07-22 01:22:04.000000000 +0200
++++ libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc        2005-07-22 01:22:04.000000000 +0200
+@@ -0,0 +1,54 @@
++// 2005-06-07 Benjamin Kosnik
++
++// Copyright (C) 2005
++// Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 2, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++#include <sstream>
++#include <testsuite_hooks.h>
++#include <stdexcept>
++
++double  
++test_stringstream()
++{
++  double result;
++  char* source = "1918"; 
++  std::stringstream s;
++  s << source;
++
++  std::string tmp = s.str();
++  std::streambuf* sb = s.rdbuf();
++  int i = sb->in_avail();
++
++  if (i)
++    {
++      s >> result;
++    }
++  else
++    {
++      throw std::runtime_error("conversion failed");
++    }
++  return result;
++}
++
++
++int main ()
++{
++  test_stringstream();
++  return 0;
++}
+--- libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc.jj 2005-07-22 01:21:41.000000000 +0200
++++ libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc    2005-07-22 01:21:41.000000000 +0200
+@@ -0,0 +1,54 @@
++// 2005-06-07 Benjamin Kosnik  <bkoz@redhat.com>
++
++// Copyright (C) 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 2, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// 27.8.1.4 Overridden virtual functions
++
++#include <fstream>
++#include <testsuite_hooks.h>
++
++typedef std::basic_streambuf<char>    streambuf_type;
++
++struct testbuf : streambuf_type
++{
++  testbuf() { }
++};
++
++void test05() 
++{
++  typedef streambuf_type::int_type    int_type;
++  typedef streambuf_type::traits_type         traits_type;
++  typedef streambuf_type::pos_type    pos_type;
++  typedef streambuf_type::off_type    off_type;
++  typedef size_t                      size_type;
++
++  bool test __attribute__((unused)) = true;
++  std::streamoff                      strmof_1, strmof_2;
++  testbuf     sb01;
++
++  // int in_avail()
++  strmof_1 = sb01.in_avail();
++  VERIFY( strmof_1  == 0 ); 
++}
++
++int main() 
++{
++  test05();
++  return 0;
++}
+--- libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc.jj      2005-07-22 01:21:41.000000000 +0200
++++ libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc 2005-07-22 01:21:41.000000000 +0200
+@@ -0,0 +1,54 @@
++// 2005-06-07 Benjamin Kosnik  <bkoz@redhat.com>
++
++// Copyright (C) 2005 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 2, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
++// USA.
++
++// 27.8.1.4 Overridden virtual functions
++
++#include <fstream>
++#include <testsuite_hooks.h>
++
++typedef std::basic_streambuf<wchar_t>         streambuf_type;
++
++struct testbuf : streambuf_type
++{
++  testbuf() { }
++};
++
++void test05() 
++{
++  typedef streambuf_type::int_type    int_type;
++  typedef streambuf_type::traits_type         traits_type;
++  typedef streambuf_type::pos_type    pos_type;
++  typedef streambuf_type::off_type    off_type;
++  typedef size_t                      size_type;
++
++  bool test __attribute__((unused)) = true;
++  std::streamoff                      strmof_1, strmof_2;
++  testbuf     sb01;
++
++  // int in_avail()
++  strmof_1 = sb01.in_avail();
++  VERIFY( strmof_1  == 0 ); 
++}
++
++int main() 
++{
++  test05();
++  return 0;
++}
+--- libstdc++-v3/libsupc++/eh_globals.cc.jj    2005-11-21 14:43:32.000000000 +0100
++++ libstdc++-v3/libsupc++/eh_globals.cc       2006-04-21 15:38:55.000000000 +0200
+@@ -36,6 +36,26 @@
+ using namespace __cxxabiv1;
++#if 1
++namespace __gnu_internal
++{
++  __cxxabiv1::__cxa_eh_globals*
++  get_global() throw()
++  {
++    static __thread __cxxabiv1::__cxa_eh_globals global __attribute__((tls_model ("initial-exec")));
++    return &global;
++  }
++}
++
++extern "C" __cxa_eh_globals*
++__cxxabiv1::__cxa_get_globals_fast() throw()
++{ return __gnu_internal::get_global(); }
++
++extern "C" __cxa_eh_globals*
++__cxxabiv1::__cxa_get_globals() throw()
++{ return __gnu_internal::get_global(); }
++
++#else
+ // Single-threaded fallback buffer.
+ static __cxa_eh_globals globals_static;
+@@ -125,3 +145,4 @@ __cxa_get_globals () throw()
+   return &globals_static;
+ #endif
+ }
++#endif
+2005-11-23  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/24975 (basic_string)
+       * include/bits/basic_string.h (_Rep::_S_empty_rep): Avoid
+       strict-aliasing warnings.
+
+2005-11-22  Paolo Carlini  <pcarlini@suse.de>
+
+       PR libstdc++/24975
+       * include/bits/stl_set.h (insert(iterator, const value_type&),
+       erase(iterator), erase(iterator, iterator)): Don't break aliasing
+       rules casting to _Rep_iterator&, forward to _Rb_tree facilities.
+       * include/bits/stl_multiset.h (insert(iterator, const value_type&),
+       erase(iterator), erase(iterator, iterator)): Likewise.
+       * include/bits/stl_tree.h (_Rb_tree<>::_M_insert(_Const_Base_ptr,
+       _Const_Base_ptr, const value_type&), insert_unique(const_iterator,
+       const value_type&), insert_equal(const_iterator, const value_type&),
+       erase(const_iterator), erase(const_iterator, const_iterator)): New,
+       _Rb_tree<>::const_iterator counterparts of existing facilities.
+
+--- libstdc++-v3/include/bits/basic_string.h.jj        2007-02-23 21:29:15.000000000 +0100
++++ libstdc++-v3/include/bits/basic_string.h   2007-07-19 12:11:40.000000000 +0200
+@@ -175,7 +175,16 @@ namespace std
+         static _Rep&
+         _S_empty_rep()
+-        { return *reinterpret_cast<_Rep*>(&_S_empty_rep_storage); }
++        {
++#if __GNUC__ >= 4
++        // Work around type-punning warning in g++4.  _S_empty_rep_storage
++        // is never modified, so type-punning is ok.
++        void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage);
++        return *reinterpret_cast<_Rep*>(__p);
++#else
++        return *reinterpret_cast<_Rep*>(&_S_empty_rep_storage);
++#endif
++        }
+         bool
+       _M_is_leaked() const
+--- libstdc++-v3/include/bits/stl_tree.h.jj    2007-02-23 21:29:15.000000000 +0100
++++ libstdc++-v3/include/bits/stl_tree.h       2007-07-19 13:18:28.000000000 +0200
+@@ -532,6 +532,12 @@ namespace std
+       iterator
+       _M_insert(_Base_ptr __x, _Base_ptr __y, const value_type& __v);
++#if __GNUC__ >= 4
++      const_iterator
++      _M_insert(_Const_Base_ptr __x, _Const_Base_ptr __y,
++              const value_type& __v);
++#endif
++
+       _Link_type
+       _M_copy(_Const_Link_type __x, _Link_type __p);
+@@ -631,9 +637,19 @@ namespace std
+       iterator
+       insert_unique(iterator __position, const value_type& __x);
++#if __GNUC__ >= 4
++      const_iterator
++      insert_unique(const_iterator __position, const value_type& __x);
++#endif
++
+       iterator
+       insert_equal(iterator __position, const value_type& __x);
++#if __GNUC__ >= 4
++      const_iterator
++      insert_equal(const_iterator __position, const value_type& __x);
++#endif
++
+       template<typename _InputIterator>
+       void
+       insert_unique(_InputIterator __first, _InputIterator __last);
+@@ -645,12 +661,22 @@ namespace std
+       void
+       erase(iterator __position);
++#if __GNUC__ >= 4
++      void
++      erase(const_iterator __position);
++#endif
++
+       size_type
+       erase(const key_type& __x);
+       void
+       erase(iterator __first, iterator __last);
++#if __GNUC__ >= 4
++      void
++      erase(const_iterator __first, const_iterator __last);
++#endif
++
+       void
+       erase(const key_type* __first, const key_type* __last);
+@@ -793,6 +819,28 @@ namespace std
+       return iterator(__z);
+     }
++#if __GNUC__ >= 4
++  template<typename _Key, typename _Val, typename _KeyOfValue,
++           typename _Compare, typename _Alloc>
++    typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::const_iterator
++    _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::
++    _M_insert(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v)
++    {
++      _Link_type __z = _M_create_node(__v);
++      bool __insert_left;
++
++      __insert_left = __x != 0 || __p == _M_end()
++                    || _M_impl._M_key_compare(_KeyOfValue()(__v), 
++                                              _S_key(__p));
++
++      _Rb_tree_insert_and_rebalance(__insert_left, __z,
++                                  const_cast<_Base_ptr>(__p),  
++                                  this->_M_impl._M_header);
++      ++_M_impl._M_node_count;
++      return const_iterator(__z);
++    }
++#endif
++
+   template<typename _Key, typename _Val, typename _KeyOfValue,
+            typename _Compare, typename _Alloc>
+     typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator
+@@ -928,6 +976,54 @@ namespace std
+       }
+     }
++#if __GNUC__ >= 4
++  template<typename _Key, typename _Val, typename _KeyOfValue,
++           typename _Compare, typename _Alloc>
++    typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator
++    _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
++    insert_unique(const_iterator __position, const _Val& __v)
++    {
++      if (__position._M_node == _M_leftmost())
++      {
++        // begin()
++        if (size() > 0
++            && _M_impl._M_key_compare(_KeyOfValue()(__v), 
++                                      _S_key(__position._M_node)))
++          return _M_insert(__position._M_node, __position._M_node, __v);
++        // First argument just needs to be non-null.
++        else
++          return const_iterator(insert_unique(__v).first);
++      }
++      else if (__position._M_node == _M_end())
++      {
++        // end()
++        if (_M_impl._M_key_compare(_S_key(_M_rightmost()), 
++                                   _KeyOfValue()(__v)))
++          return _M_insert(0, _M_rightmost(), __v);
++        else
++          return const_iterator(insert_unique(__v).first);
++      }
++      else
++      {
++        const_iterator __before = __position;
++        --__before;
++        if (_M_impl._M_key_compare(_S_key(__before._M_node), 
++                                   _KeyOfValue()(__v))
++            && _M_impl._M_key_compare(_KeyOfValue()(__v),
++                                      _S_key(__position._M_node)))
++          {
++            if (_S_right(__before._M_node) == 0)
++              return _M_insert(0, __before._M_node, __v);
++            else
++              return _M_insert(__position._M_node, __position._M_node, __v);
++            // First argument just needs to be non-null.
++          }
++        else
++          return const_iterator(insert_unique(__v).first);
++      }
++    }
++#endif
++
+   template<typename _Key, typename _Val, typename _KeyOfValue,
+            typename _Compare, typename _Alloc>
+     typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator
+@@ -974,6 +1070,54 @@ namespace std
+       }
+     }
++#if __GNUC__ >= 4
++  template<typename _Key, typename _Val, typename _KeyOfValue,
++           typename _Compare, typename _Alloc>
++    typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::const_iterator
++    _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::
++    insert_equal(const_iterator __position, const _Val& __v)
++    {
++      if (__position._M_node == _M_leftmost())
++      {
++        // begin()
++        if (size() > 0
++            && !_M_impl._M_key_compare(_S_key(__position._M_node),
++                                       _KeyOfValue()(__v)))
++          return _M_insert(__position._M_node, __position._M_node, __v);
++        // first argument just needs to be non-null
++        else
++          return const_iterator(insert_equal(__v));
++      }
++      else if (__position._M_node == _M_end())
++      {
++        // end()
++        if (!_M_impl._M_key_compare(_KeyOfValue()(__v), 
++                                    _S_key(_M_rightmost())))
++          return _M_insert(0, _M_rightmost(), __v);
++        else
++          return const_iterator(insert_equal(__v));
++      }
++      else
++      {
++        const_iterator __before = __position;
++        --__before;
++        if (!_M_impl._M_key_compare(_KeyOfValue()(__v), 
++                                    _S_key(__before._M_node))
++            && !_M_impl._M_key_compare(_S_key(__position._M_node),
++                                       _KeyOfValue()(__v)))
++          {
++            if (_S_right(__before._M_node) == 0)
++              return _M_insert(0, __before._M_node, __v);
++            else
++              return _M_insert(__position._M_node, __position._M_node, __v);
++            // First argument just needs to be non-null.
++          }
++        else
++          return const_iterator(insert_equal(__v));
++      }
++    }
++#endif
++
+   template<typename _Key, typename _Val, typename _KoV,
+            typename _Cmp, typename _Alloc>
+     template<class _II>
+@@ -1008,6 +1152,20 @@ namespace std
+       --_M_impl._M_node_count;
+     }
++#if __GNUC__ >= 4
++  template<typename _Key, typename _Val, typename _KeyOfValue,
++           typename _Compare, typename _Alloc>
++    inline void
++    _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::erase(const_iterator __position)
++    {
++      _Link_type __y =
++      static_cast<_Link_type>(_Rb_tree_rebalance_for_erase(const_cast<_Base_ptr>(__position._M_node),
++                                                           this->_M_impl._M_header));
++      destroy_node(__y);
++      --_M_impl._M_node_count;
++    }
++#endif
++
+   template<typename _Key, typename _Val, typename _KeyOfValue,
+            typename _Compare, typename _Alloc>
+     typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::size_type
+@@ -1082,6 +1240,20 @@ namespace std
+       while (__first != __last) erase(__first++);
+     }
++#if __GNUC__ >= 4
++  template<typename _Key, typename _Val, typename _KeyOfValue,
++           typename _Compare, typename _Alloc>
++    void
++    _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::
++    erase(const_iterator __first, const_iterator __last)
++    {
++      if (__first == begin() && __last == end())
++      clear();
++      else
++      while (__first != __last) erase(__first++);
++    }
++#endif
++
+   template<typename _Key, typename _Val, typename _KeyOfValue,
+            typename _Compare, typename _Alloc>
+     void
+--- libstdc++-v3/include/bits/stl_multiset.h.jj        2007-02-23 21:29:15.000000000 +0100
++++ libstdc++-v3/include/bits/stl_multiset.h   2007-07-19 12:30:47.000000000 +0200
+@@ -328,8 +328,12 @@ namespace _GLIBCXX_STD
+       iterator
+       insert(iterator __position, const value_type& __x)
+       {
++#if __GNUC__ >= 4
++      return _M_t.insert_equal(__position, __x);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       return _M_t.insert_equal((_Rep_iterator&)__position, __x);
++#endif
+       }
+       /**
+@@ -358,8 +362,12 @@ namespace _GLIBCXX_STD
+       void
+       erase(iterator __position)
+       {
++#if __GNUC__ >= 4
++      _M_t.erase(__position);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       _M_t.erase((_Rep_iterator&)__position);
++#endif
+       }
+       /**
+@@ -391,8 +399,12 @@ namespace _GLIBCXX_STD
+       void
+       erase(iterator __first, iterator __last)
+       {
++#if __GNUC__ >= 4
++      _M_t.erase(__first, __last);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last);
++#endif
+       }
+       /**
+--- libstdc++-v3/include/bits/stl_set.h.jj     2007-02-23 21:29:15.000000000 +0100
++++ libstdc++-v3/include/bits/stl_set.h        2007-07-19 12:23:57.000000000 +0200
+@@ -337,8 +337,12 @@ namespace _GLIBCXX_STD
+       iterator
+       insert(iterator __position, const value_type& __x)
+       {
++#if __GNUC__ >= 4
++      return _M_t.insert_unique(__position, __x);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       return _M_t.insert_unique((_Rep_iterator&)__position, __x);
++#endif
+       }
+       /**
+@@ -366,8 +370,12 @@ namespace _GLIBCXX_STD
+       void
+       erase(iterator __position)
+       {
++#if __GNUC__ >= 4
++      _M_t.erase(__position);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       _M_t.erase((_Rep_iterator&)__position);
++#endif
+       }
+       /**
+@@ -398,8 +406,12 @@ namespace _GLIBCXX_STD
+       void
+       erase(iterator __first, iterator __last)
+       {
++#if __GNUC__ >= 4
++      _M_t.erase(__first, __last);
++#else
+       typedef typename _Rep_type::iterator _Rep_iterator;
+       _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last);
++#endif
+       }
+       /**
+2006-02-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR other/26208
+       * unwind-dw2.c (struct _Unwind_Context): Add signal_frame field.
+       (_Unwind_FrameState): Add signal_frame field.
+       (extract_cie_info): Handle S flag in augmentation string.
+       (execute_cfa_program): If context->signal_frame, execute also
+       fs->pc == context->ra instructions.
+       (uw_frame_state_for): If context->signal_frame, don't subtract one
+       from context->ra to find FDE.
+       (uw_update_context_1): Set context->signal_frame to
+       fs->signal_frame.
+       (_Unwind_GetIPInfo): New function.
+       * unwind-c.c (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
+       of _Unwind_GetIP.
+       * unwind-sjlj.c (_Unwind_GetIPInfo): New function.
+       * unwind.h (_Unwind_GetIPInfo): New prototype.
+       * unwind-compat.c (_Unwind_GetIPInfo): New function.
+       * libgcc-std.ver (_Unwind_GetIPInfo): Export @@GCC_4.2.0.
+       * config/ia64/unwind-ia64.c (_Unwind_GetIPInfo): New function.
+       * config/i386/linux.h (MD_FALLBACK_FRAME_STATE_FOR): Set
+       (FS)->signal_frame.
+       * config/i386/linux64.h (MD_FALLBACK_FRAME_STATE_FOR): Likewise.
+       * config/rs6000/linux-unwind.h (MD_FALLBACK_FRAME_STATE_FOR): Likewise.
+       * config/s390/linux.h (MD_FALLBACK_FRAME_STATE_FOR): Likewise.
+
+       * libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Use
+       _Unwind_GetIPInfo instead of _Unwind_GetIP.
+
+       * exception.cc (PERSONALITY_FUNCTION): Use _Unwind_GetIPInfo instead
+       of _Unwind_GetIP.
+       * include/i386-signal.h (MAKE_THROW_FRAME): Change into empty macro.
+       (HANDLE_DIVIDE_OVERFLOW): Don't adjust _res->eip if falling through
+       to throw.
+       * include/x86_64-signal.h (MAKE_THROW_FRAME): Change into empty
+       macro.
+       * include/powerpc-signal.h (MAKE_THROW_FRAME): Change into empty
+       macro.
+
+--- libjava/exception.cc.jj    2005-11-21 14:47:25.000000000 +0100
++++ libjava/exception.cc       2006-04-21 14:00:19.000000000 +0200
+@@ -199,6 +199,7 @@ PERSONALITY_FUNCTION (int version,
+   int handler_switch_value;
+   bool saw_cleanup;
+   bool saw_handler;
++  int ip_before_insn = 0;
+   // Interface version check.
+@@ -214,10 +215,10 @@ PERSONALITY_FUNCTION (int version,
+       goto install_context;
+     }
+-  // FIXME: In Phase 1, record _Unwind_GetIP in xh->obj as a part of
++  // FIXME: In Phase 1, record _Unwind_GetIPInfo in xh->obj as a part of
+   // the stack trace for this exception.  This will only collect Java
+   // frames, but perhaps that is acceptable.
+-  // FIXME2: _Unwind_GetIP is nonsensical for SJLJ, being a call-site
++  // FIXME2: _Unwind_GetIPInfo is nonsensical for SJLJ, being a call-site
+   // index instead of a PC value.  We could perhaps arrange for
+   // _Unwind_GetRegionStart to return context->fc->jbuf[1], which
+   // is the address of the handler label for __builtin_longjmp, but
+@@ -232,7 +233,9 @@ PERSONALITY_FUNCTION (int version,
+   // Parse the LSDA header.
+   p = parse_lsda_header (context, language_specific_data, &info);
+-  ip = _Unwind_GetIP (context) - 1;
++  ip = _Unwind_GetIPInfo (context, &ip_before_insn);
++  if (! ip_before_insn)
++    --ip;
+   landing_pad = 0;
+   action_record = 0;
+   handler_switch_value = 0;
+--- libjava/include/i386-signal.h.jj   2005-11-21 14:47:15.000000000 +0100
++++ libjava/include/i386-signal.h      2006-04-21 14:57:55.000000000 +0200
+@@ -22,19 +22,7 @@ details.  */
+ #define SIGNAL_HANDLER(_name) \
+ static void _name (int _dummy)
+-#define MAKE_THROW_FRAME(_exception)                                  \
+-do                                                                    \
+-{                                                                     \
+-  void **_p = (void **)&_dummy;                                               \
+-  struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \
+-                                                                      \
+-  /* Advance the program counter so that it is after the start of the \
+-     instruction:  the x86 exception handler expects                  \
+-     the PC to point to the instruction after a call. */              \
+-  _regs->eip += 2;                                                    \
+-                                                                      \
+-}                                                                     \
+-while (0)
++#define MAKE_THROW_FRAME(_exception)
+ #define HANDLE_DIVIDE_OVERFLOW                                                \
+ do                                                                    \
+@@ -84,14 +72,6 @@ do                                                                  \
+         _regs->eip = (unsigned long)_eip;                             \
+         return;                                                       \
+       }                                                               \
+-      else                                                            \
+-      {                                                               \
+-        /* Advance the program counter so that it is after the start  \
+-           of the instruction: this is because the x86 exception      \
+-           handler expects the PC to point to the instruction after a \
+-           call. */                                                   \
+-        _regs->eip += 2;                                              \
+-      }                                                               \
+     }                                                                 \
+ }                                                                     \
+ while (0)
+--- libjava/include/x86_64-signal.h.jj 2006-04-20 17:02:27.000000000 +0200
++++ libjava/include/x86_64-signal.h    2006-04-21 14:00:19.000000000 +0200
+@@ -34,17 +34,7 @@ extern "C" 
+   };
+ }
+-#define MAKE_THROW_FRAME(_exception)                                       \
+-do                                                                         \
+-{                                                                          \
+-  /* Advance the program counter so that it is after the start of the      \
+-     instruction:  the x86_64 exception handler expects                            \
+-     the PC to point to the instruction after a call. */                   \
+-  struct ucontext *_uc = (struct ucontext *)_p;                                    \
+-  volatile struct sigcontext *_sc = (struct sigcontext *) &_uc->uc_mcontext; \
+-  _sc->rip += 2;                                                           \
+-}                                                                          \
+-while (0)
++#define MAKE_THROW_FRAME(_exception)
+ #define RESTORE(name, syscall) RESTORE2 (name, syscall)
+ #define RESTORE2(name, syscall)                       \
+--- libjava/include/powerpc-signal.h.jj        2005-11-21 14:47:15.000000000 +0100
++++ libjava/include/powerpc-signal.h   2006-04-21 14:00:19.000000000 +0200
+@@ -22,18 +22,12 @@ details.  */
+ #define SIGNAL_HANDLER(_name)                                         \
+   static void _name (int /* _signal */, struct sigcontext *_sc)
+-/* PPC either leaves PC pointing at a faulting instruction or the
+-   following instruction, depending on the signal.  SEGV always does
+-   the former, so we adjust the saved PC to point to the following
+-   instruction. This is what the handler in libgcc expects.  */
++/* MD_FALBACK_FRAME_STATE_FOR takes care of special casing PC
++   before the faulting instruction, so we don't need to do anything
++   here.  */
++
++#define MAKE_THROW_FRAME(_exception)
+-#define MAKE_THROW_FRAME(_exception)                                  \
+-do                                                                    \
+-  {                                                                   \
+-    _sc->regs->nip += 4;                                              \
+-  }                                                                   \
+-while (0)
+-  
+ /* For an explanation why we cannot simply use sigaction to
+    install the handlers, see i386-signal.h.  */
+--- libstdc++-v3/libsupc++/eh_personality.cc.jj        2005-11-21 14:43:32.000000000 +0100
++++ libstdc++-v3/libsupc++/eh_personality.cc   2006-04-21 14:24:34.000000000 +0200
+@@ -201,6 +201,7 @@ PERSONALITY_FUNCTION (int version,
+   _Unwind_Ptr landing_pad, ip;
+   int handler_switch_value;
+   void *thrown_ptr = xh + 1;
++  int ip_before_insn = 0;
+   // Interface version check.
+   if (version != 1)
+@@ -227,7 +228,9 @@ PERSONALITY_FUNCTION (int version,
+   // Parse the LSDA header.
+   p = parse_lsda_header (context, language_specific_data, &info);
+   info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
+-  ip = _Unwind_GetIP (context) - 1;
++  ip = _Unwind_GetIPInfo (context, &ip_before_insn);
++  if (! ip_before_insn)
++    --ip;
+   landing_pad = 0;
+   action_record = 0;
+   handler_switch_value = 0;
+--- gcc/libgcc-std.ver.jj      2005-11-21 14:43:21.000000000 +0100
++++ gcc/libgcc-std.ver 2006-04-21 14:02:13.000000000 +0200
+@@ -234,3 +234,8 @@ GCC_3.4.4 {
+   __negvti2
+   __subvti3
+ }
++
++%inherit GCC_4.2.0 GCC_3.4.4
++GCC_4.2.0 {
++  _Unwind_GetIPInfo
++}
+--- gcc/unwind-c.c.jj  2005-11-21 14:43:20.000000000 +0100
++++ gcc/unwind-c.c     2006-04-21 14:00:08.000000000 +0200
+@@ -102,6 +102,7 @@ PERSONALITY_FUNCTION (int version,
+   lsda_header_info info;
+   const unsigned char *language_specific_data, *p, *action_record;
+   _Unwind_Ptr landing_pad, ip;
++  int ip_before_insn = 0;
+   if (version != 1)
+     return _URC_FATAL_PHASE1_ERROR;
+@@ -119,7 +120,9 @@ PERSONALITY_FUNCTION (int version,
+   /* Parse the LSDA header.  */
+   p = parse_lsda_header (context, language_specific_data, &info);
+-  ip = _Unwind_GetIP (context) - 1;
++  ip = _Unwind_GetIPInfo (context, &ip_before_insn);
++  if (! ip_before_insn)
++    --ip;
+   landing_pad = 0;
+ #ifdef __USING_SJLJ_EXCEPTIONS__
+--- gcc/config/s390/linux.h.jj 2005-11-21 14:40:55.000000000 +0100
++++ gcc/config/s390/linux.h    2006-04-21 14:15:46.000000000 +0200
+@@ -113,6 +113,7 @@ Software Foundation, 59 Temple Place - S
+       } __attribute__ ((__aligned__ (8))) sigregs_;                   \
+                                                                       \
+     sigregs_ *regs_;                                                  \
++    int *signo_ = NULL;                                                       \
+                                                                       \
+     /* svc $__NR_sigreturn or svc $__NR_rt_sigreturn  */              \
+     if (pc_[0] != 0x0a || (pc_[1] != 119 && pc_[1] != 173))           \
+@@ -133,6 +134,7 @@ Software Foundation, 59 Temple Place - S
+         } *uc_ = (CONTEXT)->cfa + 8 + 128;                            \
+                                                                       \
+       regs_ = &uc_->uc_mcontext;                                      \
++      signo_ = (CONTEXT)->cfa + sizeof(long);                         \
+       }                                                                       \
+                                                                       \
+     /* Old-style RT frame and all non-RT frames:                      \
+@@ -141,6 +143,11 @@ Software Foundation, 59 Temple Place - S
+     else                                                              \
+       {                                                                       \
+       regs_ = *(sigregs_ **)((CONTEXT)->cfa + 8);                     \
++      /* Recent kernels store the signal number immediately after     \
++         the sigregs; old kernels have the return trampoline at       \
++         this location.  */                                           \
++      if ((void *)(regs_ + 1) != (CONTEXT)->ra)                       \
++        signo_ = (int *)(regs_ + 1);                                  \
+       }                                                                       \
+                                                                               \
+     new_cfa_ = regs_->gprs[15] + 16*sizeof(long) + 32;                        \
+@@ -167,6 +174,12 @@ Software Foundation, 59 Temple Place - S
+     (FS)->regs.reg[32].loc.offset = (long)&regs_->psw_addr - new_cfa_;        \
+     (FS)->retaddr_column = 32;                                                \
+                                                                       \
++    /* SIGILL, SIGFPE and SIGTRAP are delivered with psw_addr         \
++       after the faulting instruction rather than before it.          \
++       Don't set FS->signal_frame in that case.  */                   \
++    if (!signo_ || (*signo_ != 4 && *signo_ != 5 && *signo_ != 8))    \
++      (FS)->signal_frame = 1;                                         \
++                                                                      \
+     goto SUCCESS;                                                     \
+   } while (0)
+--- gcc/config/i386/linux.h.jj 2005-11-21 14:41:07.000000000 +0100
++++ gcc/config/i386/linux.h    2006-04-21 14:18:05.000000000 +0200
+@@ -268,6 +268,7 @@ Boston, MA 02111-1307, USA.  */
+     (FS)->regs.reg[8].how = REG_SAVED_OFFSET;                         \
+     (FS)->regs.reg[8].loc.offset = (long)&sc_->eip - new_cfa_;                \
+     (FS)->retaddr_column = 8;                                         \
++    (FS)->signal_frame = 1;                                           \
+     goto SUCCESS;                                                     \
+   } while (0)
+ #endif /* not USE_GNULIBC_1 */
+--- gcc/config/i386/linux64.h.jj       2005-11-21 14:41:07.000000000 +0100
++++ gcc/config/i386/linux64.h  2006-04-21 14:18:45.000000000 +0200
+@@ -136,6 +136,7 @@ Boston, MA 02111-1307, USA.  */
+     (FS)->regs.reg[16].how = REG_SAVED_OFFSET;                                \
+     (FS)->regs.reg[16].loc.offset = (long)&sc_->rip - new_cfa_;               \
+     (FS)->retaddr_column = 16;                                                \
++    (FS)->signal_frame = 1;                                           \
+     goto SUCCESS;                                                     \
+   } while (0)
+ #else /* ifdef __x86_64__  */
+@@ -190,6 +191,7 @@ Boston, MA 02111-1307, USA.  */
+     (FS)->regs.reg[8].how = REG_SAVED_OFFSET;                         \
+     (FS)->regs.reg[8].loc.offset = (long)&sc_->eip - new_cfa_;                \
+     (FS)->retaddr_column = 8;                                         \
++    (FS)->signal_frame = 1;                                           \
+     goto SUCCESS;                                                     \
+   } while (0)
+ #endif /* ifdef __x86_64__  */
+--- gcc/config/ia64/unwind-ia64.c.jj   2005-11-21 14:40:57.000000000 +0100
++++ gcc/config/ia64/unwind-ia64.c      2006-04-21 14:00:11.000000000 +0200
+@@ -1748,6 +1748,13 @@ _Unwind_GetIP (struct _Unwind_Context *c
+   return context->rp;
+ }
++inline _Unwind_Ptr
++_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
++{
++  *ip_before_insn = 0;
++  return context->rp;
++}
++
+ /* Overwrite the return address for CONTEXT with VAL.  */
+ inline void
+--- gcc/unwind-compat.c.jj     2005-11-21 14:43:20.000000000 +0100
++++ gcc/unwind-compat.c        2006-04-21 13:59:59.000000000 +0200
+@@ -134,6 +134,13 @@ _Unwind_GetIP (struct _Unwind_Context *c
+ }
+ symver (_Unwind_GetIP, GCC_3.0);
++_Unwind_Ptr
++_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
++{
++  *ip_before_insn = 0;
++  return __libunwind_Unwind_GetIP (context);
++}
++
+ extern void *__libunwind_Unwind_GetLanguageSpecificData
+   (struct _Unwind_Context *);
+--- gcc/unwind-sjlj.c.jj       2005-11-21 14:43:21.000000000 +0100
++++ gcc/unwind-sjlj.c  2006-04-21 14:00:08.000000000 +0200
+@@ -202,6 +202,13 @@ _Unwind_GetIP (struct _Unwind_Context *c
+   return context->fc->call_site + 1;
+ }
++_Unwind_Ptr
++_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
++{
++  *ip_before_insn = 0;
++  return context->fc->call_site + 1;
++}
++
+ /* Set the return landing pad index in CONTEXT.  */
+ void
+--- gcc/unwind.h.jj    2005-11-21 14:43:20.000000000 +0100
++++ gcc/unwind.h       2006-04-21 14:08:51.000000000 +0200
+@@ -151,6 +151,7 @@ extern _Unwind_Word _Unwind_GetGR (struc
+ extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word);
+ extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
++extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
+ extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
+ /* @@@ Retrieve the CFA of the given context.  */
+--- gcc/unwind-dw2.c.jj        2005-11-21 14:43:21.000000000 +0100
++++ gcc/unwind-dw2.c   2006-04-21 14:05:32.000000000 +0200
+@@ -82,6 +82,7 @@ struct _Unwind_Context
+   void *lsda;
+   struct dwarf_eh_bases bases;
+   _Unwind_Word args_size;
++  char signal_frame;
+ };
+ /* Byte size of every register managed by these routines.  */
+@@ -137,6 +138,7 @@ typedef struct
+   unsigned char fde_encoding;
+   unsigned char lsda_encoding;
+   unsigned char saw_z;
++  unsigned char signal_frame;
+   void *eh_ptr;
+ } _Unwind_FrameState;
\f
+@@ -271,6 +273,16 @@ _Unwind_GetIP (struct _Unwind_Context *c
+   return (_Unwind_Ptr) context->ra;
+ }
++/* Retrieve the return address and flag whether that IP is before
++   or after first not yet fully executed instruction.  */
++
++inline _Unwind_Ptr
++_Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
++{
++  *ip_before_insn = context->signal_frame != 0;
++  return (_Unwind_Ptr) context->ra;
++}
++
+ /* Overwrite the return address for CONTEXT with VAL.  */
+ inline void
+@@ -382,6 +394,13 @@ extract_cie_info (const struct dwarf_cie
+         aug += 1;
+       }
++      /* "S" indicates a signal frame.  */
++      else if (aug[0] == 'S')
++      {
++        fs->signal_frame = 1;
++        aug += 1;
++      }
++
+       /* Otherwise we have an unknown augmentation string.
+        Bail unless we saw a 'z' prefix.  */
+       else
+@@ -818,8 +837,10 @@ execute_cfa_program (const unsigned char
+      a different stack configuration that we are not interested in.  We
+      assume that the call itself is unwind info-neutral; if not, or if
+      there are delay instructions that adjust the stack, these must be
+-     reflected at the point immediately before the call insn.  */
+-  while (insn_ptr < insn_end && fs->pc < context->ra)
++     reflected at the point immediately before the call insn.
++     In signal frames, return address is after last completed instruction,
++     so we add 1 to return address to make the comparison <=.  */
++  while (insn_ptr < insn_end && fs->pc < context->ra + context->signal_frame)
+     {
+       unsigned char insn = *insn_ptr++;
+       _Unwind_Word reg, utmp;
+@@ -1021,7 +1042,8 @@ uw_frame_state_for (struct _Unwind_Conte
+   if (context->ra == 0)
+     return _URC_END_OF_STACK;
+-  fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
++  fde = _Unwind_Find_FDE (context->ra + context->signal_frame - 1,
++                        &context->bases);
+   if (fde == NULL)
+     {
+       /* Couldn't find frame unwind info for this function.  Try a
+@@ -1376,6 +1398,8 @@ uw_update_context_1 (struct _Unwind_Cont
+       break;
+       }
++  context->signal_frame = fs->signal_frame;
++
+   MD_FROB_UPDATE_CONTEXT (context, fs);
+ }
+--- gcc/unwind-dw2.c.jj        2006-05-22 13:39:48.000000000 -0400
++++ gcc/unwind-dw2.c   2006-05-22 13:48:20.000000000 -0400
+@@ -40,6 +40,7 @@
+ #include "unwind-pe.h"
+ #include "unwind-dw2-fde.h"
+ #include "gthr.h"
++#include <endian.h>
+ #ifndef __USING_SJLJ_EXCEPTIONS__
+@@ -81,8 +82,15 @@ struct _Unwind_Context
+   void *ra;
+   void *lsda;
+   struct dwarf_eh_bases bases;
+-  _Unwind_Word args_size;
+-  char signal_frame;
++#if __BYTE_ORDER == __BIG_ENDIAN
++  _Unwind_Word signal_frame : 1;
++  _Unwind_Word args_size : sizeof (_Unwind_Word) * 8 - 1;
++#elif __BYTE_ORDER == __LITTLE_ENDIAN
++  _Unwind_Word args_size : sizeof (_Unwind_Word) * 8 - 1;
++  _Unwind_Word signal_frame : 1;
++#else
++#error Unknown endianity
++#endif
+ };
+ /* Byte size of every register managed by these routines.  */
+@@ -1003,7 +1011,13 @@ execute_cfa_program (const unsigned char
+         break;
+       case DW_CFA_GNU_args_size:
+-        insn_ptr = read_uleb128 (insn_ptr, &context->args_size);
++        {
++          _Unwind_Word args_size;
++          insn_ptr = read_uleb128 (insn_ptr, &args_size);
++          context->args_size = args_size;
++          if (context->args_size != args_size)
++            abort ();
++        }
+         break;
+       case DW_CFA_GNU_negative_offset_extended:
+--- libjava/exception.cc.jj    2006-05-22 13:39:48.000000000 -0400
++++ libjava/exception.cc       2006-05-22 14:48:30.000000000 -0400
+@@ -31,6 +31,153 @@ namespace std
+ }
+ #include "unwind.h"
++#if defined PIC && !defined __ia64__
++
++#include <dlfcn.h>
++
++extern "C" {
++
++static void *libgcc_s_handle;
++
++_Unwind_Reason_Code __attribute__((visibility ("hidden")))
++_Unwind_RaiseException (struct _Unwind_Exception *exc)
++{
++  static _Unwind_Reason_Code (*RaiseException) (struct _Unwind_Exception *);
++
++  if (RaiseException == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      RaiseException = (__typeof (RaiseException))
++      dlsym (libgcc_s_handle, "_Unwind_RaiseException");
++    }
++  return RaiseException (exc);
++}
++
++void __attribute__((visibility ("hidden")))
++_Unwind_Resume (struct _Unwind_Exception *exc)
++{
++  static void (*Resume) (struct _Unwind_Exception *);
++
++  if (Resume == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      Resume = (__typeof (Resume))
++      dlsym (libgcc_s_handle, "_Unwind_Resume");
++    }
++  Resume (exc);
++}
++
++__attribute__((visibility ("hidden"))) void * 
++_Unwind_GetLanguageSpecificData (struct _Unwind_Context *ctx)
++{
++  static void * (*GetLanguageSpecificData) (struct _Unwind_Context *);
++
++  if (GetLanguageSpecificData == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      GetLanguageSpecificData = (__typeof (GetLanguageSpecificData))
++      dlsym (libgcc_s_handle, "_Unwind_GetLanguageSpecificData");
++    }
++  return GetLanguageSpecificData (ctx);
++}
++
++_Unwind_Ptr __attribute__((visibility ("hidden")))
++_Unwind_GetRegionStart (struct _Unwind_Context *ctx)
++{
++  static _Unwind_Ptr (*GetRegionStart) (struct _Unwind_Context *);
++
++  if (GetRegionStart == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      GetRegionStart = (__typeof (GetRegionStart))
++      dlsym (libgcc_s_handle, "_Unwind_GetRegionStart");
++    }
++  return GetRegionStart (ctx);
++}
++
++_Unwind_Ptr __attribute__((visibility ("hidden")))
++_Unwind_GetDataRelBase (struct _Unwind_Context *ctx)
++{
++  static _Unwind_Ptr (*GetDataRelBase) (struct _Unwind_Context *);
++
++  if (GetDataRelBase == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      GetDataRelBase = (__typeof (GetDataRelBase))
++      dlsym (libgcc_s_handle, "_Unwind_GetDataRelBase");
++    }
++  return GetDataRelBase (ctx);
++}
++
++_Unwind_Ptr __attribute__((visibility ("hidden")))
++_Unwind_GetTextRelBase (struct _Unwind_Context *ctx)
++{
++  static _Unwind_Ptr (*GetTextRelBase) (struct _Unwind_Context *);
++
++  if (GetTextRelBase == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      GetTextRelBase = (__typeof (GetTextRelBase))
++      dlsym (libgcc_s_handle, "_Unwind_GetTextRelBase");
++    }
++  return GetTextRelBase (ctx);
++}
++
++_Unwind_Ptr __attribute__((visibility ("hidden")))
++_Unwind_GetIPInfo (struct _Unwind_Context *ctx, int *ip)
++{
++  static _Unwind_Ptr (*GetIPInfo) (struct _Unwind_Context *, int *ip);
++
++  if (GetIPInfo == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      GetIPInfo = (__typeof (GetIPInfo))
++      dlsym (libgcc_s_handle, "_Unwind_GetIPInfo");
++    }
++  return GetIPInfo (ctx, ip);
++}
++
++void __attribute__((visibility ("hidden")))
++_Unwind_SetIP (struct _Unwind_Context *ctx, _Unwind_Ptr ip)
++{
++  static void (*SetIP) (struct _Unwind_Context *, _Unwind_Ptr ip);
++
++  if (SetIP == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      SetIP = (__typeof (SetIP))
++      dlsym (libgcc_s_handle, "_Unwind_SetIP");
++    }
++  SetIP (ctx, ip);
++}
++
++void __attribute__((visibility ("hidden")))
++_Unwind_SetGR (struct _Unwind_Context *ctx, int num, _Unwind_Ptr gr)
++{
++  static void (*SetGR) (struct _Unwind_Context *, int num, _Unwind_Ptr gr);
++
++  if (SetGR == NULL)
++    {
++      if (libgcc_s_handle == NULL)
++      libgcc_s_handle = dlopen ("libgcc_s.so.1", RTLD_LAZY);
++      SetGR = (__typeof (SetGR))
++      dlsym (libgcc_s_handle, "_Unwind_SetGR");
++    }
++  SetGR (ctx, num, gr);
++}
++
++}
++
++#endif
++
+ struct alignment_test_struct
+ {
+   char space;
+2005-05-08  Roger Sayle  <roger@eyesopen.com>
+
+       PR inline-asm/8788
+       * stmt.c (expand_asm_operands): Avoid calling force_reg on BLKmode
+       operands.
+
+       * gcc.dg/pr8788-1.c: New testcase.
+
+--- gcc/stmt.c (revision 99421)
++++ gcc/stmt.c (revision 99422)
+@@ -877,7 +877,7 @@ expand_asm_operands (tree string, tree o
+       if (asm_operand_ok (op, constraint) <= 0)
+       {
+-        if (allows_reg)
++        if (allows_reg && TYPE_MODE (type) != BLKmode)
+           op = force_reg (TYPE_MODE (type), op);
+         else if (!allows_mem)
+           warning (0, "asm operand %d probably doesn%'t match constraints",
+--- gcc/testsuite/gcc.dg/pr8788-1.c    (revision 0)
++++ gcc/testsuite/gcc.dg/pr8788-1.c    (revision 99422)
+@@ -0,0 +1,20 @@
++/* PR inline-asm/8788 */
++/* { dg-do compile } */
++/* { dg-options "-O2" } */
++
++typedef struct {
++    long x[6];
++} myjmp_buf;
++
++typedef struct {
++    myjmp_buf regs;
++} my_stack;
++
++void switch_to_stack (my_stack *stack){
++    asm (  /* { dg-error "impossible constraint" } */
++/* { dg-warning "asm operand 1" "asm operand 1" { target *-*-* } 14 } */
++        "\n"
++        : "+r" (stack->regs)
++    );
++}
++
+2005-11-30  Alexandre Oliva  <aoliva@redhat.com>
+
+       * gcc.c (find_a_file): Use update_path before access tests.
+       Mostly from Thomas Walker <thomas.walker@morganstanley.com>
+       * prefix.c (update_path): Move dir/../-stripping code to...
+       (maybe_strip_dotdots): New function.  Reorganize.
+
+--- gcc/gcc.c.orig     2005-12-01 18:38:38.000000000 -0200
++++ gcc/gcc.c  2005-12-01 18:41:01.000000000 -0200
+@@ -2371,7 +2371,7 @@
+ find_a_file (struct path_prefix *pprefix, const char *name, int mode,
+            int multilib)
+ {
+-  char *temp;
++  char *temp, *temp2;
+   const char *const file_suffix =
+     ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : "");
+   struct prefix_list *pl;
+@@ -2407,19 +2407,18 @@
+                                   NULL));
+     }
+-  temp = xmalloc (len);
+-
+   /* Determine the filename to execute (special case for absolute paths).  */
+   if (IS_ABSOLUTE_PATH (name))
+     {
+-      if (access (name, mode) == 0)
+-      {
+-        strcpy (temp, name);
+-        return temp;
+-      }
++      /* IS_ABSOLUTE_PATHNAME lets anything through that starts with '/'  */
++      temp = update_path (name, NULL);
++      if (access (temp, mode) == 0)
++      return temp;
+     }
+   else
++  {
++    temp = xmalloc (len);
+     for (pl = pprefix->plist; pl; pl = pl->next)
+       {
+       const char *this_name
+@@ -2435,24 +2434,30 @@
+               strcat (temp, machine_suffix);
+               strcat (temp, multilib_name);
+               strcat (temp, file_suffix);
+-              if (access_check (temp, mode) == 0)
++              temp2 = update_path (temp, NULL);
++              if (access_check (temp2, mode) == 0)
+                 {
+                   if (pl->used_flag_ptr != 0)
+                     *pl->used_flag_ptr = 1;
+-                  return temp;
++                  free (temp);
++                  return temp2;
+                 }
++              free (temp2);
+             }
+           /* Now try just the multilib_name.  */
+           strcpy (temp, pl->prefix);
+           strcat (temp, machine_suffix);
+           strcat (temp, multilib_name);
+-          if (access_check (temp, mode) == 0)
++          temp2 = update_path (temp, NULL);
++          if (access_check (temp2, mode) == 0)
+             {
+               if (pl->used_flag_ptr != 0)
+                 *pl->used_flag_ptr = 1;
+-              return temp;
++              free (temp);
++              return temp2;
+             }
++          free (temp2);
+         }
+       /* Certain prefixes are tried with just the machine type,
+@@ -2467,23 +2472,29 @@
+               strcat (temp, just_machine_suffix);
+               strcat (temp, multilib_name);
+               strcat (temp, file_suffix);
+-              if (access_check (temp, mode) == 0)
++              temp2 = update_path (temp, NULL);
++              if (access_check (temp2, mode) == 0)
+                 {
+                   if (pl->used_flag_ptr != 0)
+                     *pl->used_flag_ptr = 1;
+-                  return temp;
++                  free (temp);
++                  return temp2;
+                 }
++              free (temp2);
+             }
+           strcpy (temp, pl->prefix);
+           strcat (temp, just_machine_suffix);
+           strcat (temp, multilib_name);
+-          if (access_check (temp, mode) == 0)
++          temp2 = update_path (temp, NULL);
++          if (access_check (temp2, mode) == 0)
+             {
+               if (pl->used_flag_ptr != 0)
+                 *pl->used_flag_ptr = 1;
+-              return temp;
++              free (temp);
++              return temp2;
+             }
++          free (temp2);
+         }
+       /* Certain prefixes can't be used without the machine suffix
+@@ -2497,24 +2508,31 @@
+               strcpy (temp, pl->prefix);
+               strcat (temp, this_name);
+               strcat (temp, file_suffix);
+-              if (access_check (temp, mode) == 0)
++              temp2 = update_path (temp, NULL);
++              if (access_check (temp2, mode) == 0)
+                 {
+                   if (pl->used_flag_ptr != 0)
+                     *pl->used_flag_ptr = 1;
+-                  return temp;
++                  free (temp);
++                  return temp2;
+                 }
++              free (temp2);
+             }
+           strcpy (temp, pl->prefix);
+           strcat (temp, this_name);
+-          if (access_check (temp, mode) == 0)
++          temp2 = update_path (temp, NULL);
++          if (access_check (temp2, mode) == 0)
+             {
+               if (pl->used_flag_ptr != 0)
+                 *pl->used_flag_ptr = 1;
+-              return temp;
++              free (temp);
++              return temp2;
+             }
++          free (temp2);
+         }
+       }
++  }
+   free (temp);
+   return 0;
+--- gcc/prefix.c.orig  2005-12-01 18:38:38.000000000 -0200
++++ gcc/prefix.c       2005-12-01 18:46:37.000000000 -0200
+@@ -238,6 +238,105 @@
+   while (*string++);
+ }
++/* Strip dir/.. from a pathname when it makes sense, e.g., when this
++   would turn an inaccessible pathname into an accessible one.
++
++   We short-circuit dir/.. when dir does not exist, and when
++   some/dir/../thing does not exist but some/thing does.  In case
++   there are multiple possible dir/../ stripping possibilities that
++   would turn an inaccessible pathname into an accessible one, the one
++   closer to the end of the pathname is preferred.
++
++   RESULT is the pathname that might contain such dotdot sequences to
++   be stripped.  P points into RESULT, and indicates the location
++   where we should start looking for ../ sequences.
++
++   Even though RESULT is const, P is not, and that's because
++   characters in it may be temporarily overwritten, so RESULT must not
++   be in read-only storage.
++
++   The returned value is either a newly-allocated memory area, holding
++   a string that is the result of dotdot-stripping from the original
++   input strip, or RESULT itself, in which case any modifications made
++   to the string will have been undone.  */
++
++static const char *
++maybe_strip_dotdots (const char *result, char *p)
++{
++  char *temp;
++  const char *path, *before, *after;
++  size_t len;
++
++  while (1)
++    {
++      p = strchr (p, '.');
++      if (p == NULL)
++      return result;
++      /* Look for `/../'  */
++      if (p[1] == '.'
++        && IS_DIR_SEPARATOR (p[2])
++        && (p != result && IS_DIR_SEPARATOR (p[-1])))
++      break;
++      else
++      ++p;
++    }
++
++  *p = 0;
++  if (access (result, X_OK) == 0)
++    {
++      *p = '.';
++
++      path = maybe_strip_dotdots (result, p + 3);
++      if (access (path, F_OK) == 0)
++      return path;
++      if (path != result)
++      free ((char *) path);
++    }
++  else
++    *p = '.';
++
++  /* If we couldn't access the dir, or if recursion resulted in a
++     non-accessible pathname, we try stripping out dir/../.  If `dir'
++     turns out to be `.', strip one more path component.  */
++  before = p;
++  do
++    {
++      --before;
++      while (before != result && IS_DIR_SEPARATOR (*before))
++      --before;
++      while (before != result && !IS_DIR_SEPARATOR (before[-1]))
++      --before;
++    }
++  while (before != result && *before == '.'
++       && IS_DIR_SEPARATOR (*(before + 1)));
++  /* If we have something like `./..' or `/..', don't
++     strip anything more.  */
++  if (*before == '.' || IS_DIR_SEPARATOR (*before))
++    return result;
++
++  after = p + 3;
++  while (IS_DIR_SEPARATOR (*after))
++    ++after;
++
++  len = (after - result) + strlen (after);
++
++  temp = xmalloc (len + 1 - (after - before));
++  memcpy (temp, result, before - result);
++  memcpy (temp + (before - result), after, len + 1 - (after - result));
++
++  path = maybe_strip_dotdots (temp, temp + (before - result));
++
++  if (path != temp)
++    free (temp);
++
++  if (access (path, F_OK) == 0)
++    result = path;
++  else if (path != result)
++    free ((char *) path);
++
++  return result;
++}
++
+ /* Update PATH using KEY if PATH starts with PREFIX.  The returned
+    string is always malloc-ed, and the caller is responsible for
+    freeing it.  */
+@@ -245,7 +344,7 @@
+ char *
+ update_path (const char *path, const char *key)
+ {
+-  char *result, *p;
++  char *result, *temp;
+   if (! strncmp (path, std_prefix, strlen (std_prefix)) && key != 0)
+     {
+@@ -265,62 +364,11 @@
+   else
+     result = xstrdup (path);
+-#ifndef ALWAYS_STRIP_DOTDOT
+-#define ALWAYS_STRIP_DOTDOT 0
+-#endif
++  temp = result;
++  result = (char *) maybe_strip_dotdots (temp, temp);
+-  p = result;
+-  while (1)
+-    {
+-      char *src, *dest;
+-
+-      p = strchr (p, '.');
+-      if (p == NULL)
+-      break;
+-      /* Look for `/../'  */
+-      if (p[1] == '.'
+-        && IS_DIR_SEPARATOR (p[2])
+-        && (p != result && IS_DIR_SEPARATOR (p[-1])))
+-      {
+-        *p = 0;
+-        if (!ALWAYS_STRIP_DOTDOT && access (result, X_OK) == 0)
+-          {
+-            *p = '.';
+-            break;
+-          }
+-        else
+-          {
+-            /* We can't access the dir, so we won't be able to
+-               access dir/.. either.  Strip out `dir/../'.  If `dir'
+-               turns out to be `.', strip one more path component.  */
+-            dest = p;
+-            do
+-              {
+-                --dest;
+-                while (dest != result && IS_DIR_SEPARATOR (*dest))
+-                  --dest;
+-                while (dest != result && !IS_DIR_SEPARATOR (dest[-1]))
+-                  --dest;
+-              }
+-            while (dest != result && *dest == '.');
+-            /* If we have something like `./..' or `/..', don't
+-               strip anything more.  */
+-            if (*dest == '.' || IS_DIR_SEPARATOR (*dest))
+-              {
+-                *p = '.';
+-                break;
+-              }
+-            src = p + 3;
+-            while (IS_DIR_SEPARATOR (*src))
+-              ++src;
+-            p = dest;
+-            while ((*dest++ = *src++) != 0)
+-              ;
+-          }
+-      }
+-      else
+-      ++p;
+-    }
++  if (result != temp)
++    free (temp);
+ #ifdef UPDATE_PATH_HOST_CANONICALIZE
+   /* Perform host dependent canonicalization when needed.  */
+2005-09-29  Alexandre Oliva  <aoliva@redhat.com>
+
+       * error.c (dump_type) <UNKNOWN_TYPE>: Print reworded message.
+
+       * g++.dg/overload/unknown1.C: New.
+
+--- gcc/cp/error.c.orig        2004-11-07 11:22:11.000000000 -0200
++++ gcc/cp/error.c     2005-09-29 16:13:20.000000000 -0300
+@@ -302,7 +302,7 @@
+   switch (TREE_CODE (t))
+     {
+     case UNKNOWN_TYPE:
+-      pp_identifier (cxx_pp, "<unknown type>");
++      pp_identifier (cxx_pp, "<unresolved overloaded function type>");
+       break;
+     case TREE_LIST:
+--- gcc/testsuite/g++.dg/overload/unknown1.C   1970-01-01 00:00:00.000000000 +0000
++++ gcc/testsuite/g++.dg/overload/unknown1.C   2005-09-29 16:12:49.000000000 -0300
+@@ -0,0 +1,9 @@
++// { dg-do compile }
++
++void foo(void);
++int foo(int);
++template <typename T> void bar(T f);
++
++void baz() {
++  bar(foo); // { dg-error "<unresolved overloaded function type>" }
++}
+2005-12-18  Alexandre Oliva  <aoliva@redhat.com>
+
+       * optabs.c (expand_vector_binop): Do not use a SUBREG to modify
+       a subword in the output if it matches any of the inputs.
+
+2006-04-20  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/execute/20060420-1.c: New test.
+
+--- gcc/optabs.c.orig  2005-11-21 11:43:20.000000000 -0200
++++ gcc/optabs.c       2005-12-18 18:35:14.000000000 -0200
+@@ -1933,16 +1933,19 @@
+       for (i = 0; i < elts; ++i)
+       {
+-        /* If this is part of a register, and not the first item in the
+-           word, we can't store using a SUBREG - that would clobber
+-           previous results.
++        /* If this is part of a register, and not the first item in
++           the word, we can't store using a SUBREG - that would
++           clobber previous results, or even the input operands, if
++           target matches any of them.
+            And storing with a SUBREG is only possible for the least
+            significant part, hence we can't do it for big endian
+            (unless we want to permute the evaluation order.  */
+         if (GET_CODE (target) == REG
+             && (BYTES_BIG_ENDIAN
+                 ? subsize < UNITS_PER_WORD
+-                : ((i * subsize) % UNITS_PER_WORD) != 0))
++                : (((i * subsize) % UNITS_PER_WORD) != 0
++                   || (subsize < UNITS_PER_WORD
++                       && (target == op0 || target == op1)))))
+           t = NULL_RTX;
+         else
+           t = simplify_gen_subreg (submode, target, mode, i * subsize);
+--- gcc/testsuite/gcc.c-torture/execute/20060420-1.c.jj        2006-04-20 18:47:19.000000000 +0200
++++ gcc/testsuite/gcc.c-torture/execute/20060420-1.c   2006-04-20 19:07:20.000000000 +0200
+@@ -0,0 +1,71 @@
++extern void abort (void);
++
++typedef float v4flt __attribute__ ((vector_size (16)));
++
++void __attribute__ ((noinline)) foo (float *dst, float **src, int a, int n)
++{
++  int i, j;
++  int z = sizeof (v4flt) / sizeof (float);
++  unsigned m = sizeof (v4flt) - 1;
++
++  for (j = 0; j < n && (((unsigned long) dst + j) & m); ++j)
++    {
++      float t = src[0][j];
++      for (i = 1; i < a; ++i)
++      t += src[i][j];
++      dst[j] = t;
++    }
++
++  for (; j < (n - (4 * z - 1)); j += 4 * z)
++    {
++      v4flt t0 = *(v4flt *) (src[0] + j + 0 * z);
++      v4flt t1 = *(v4flt *) (src[0] + j + 1 * z);
++      v4flt t2 = *(v4flt *) (src[0] + j + 2 * z);
++      v4flt t3 = *(v4flt *) (src[0] + j + 3 * z);
++      for (i = 1; i < a; ++i)
++      {
++        t0 += *(v4flt *) (src[i] + j + 0 * z);
++        t1 += *(v4flt *) (src[i] + j + 1 * z);
++        t2 += *(v4flt *) (src[i] + j + 2 * z);
++        t3 += *(v4flt *) (src[i] + j + 3 * z);
++      }
++      *(v4flt *) (dst + j + 0 * z) = t0;
++      *(v4flt *) (dst + j + 1 * z) = t1;
++      *(v4flt *) (dst + j + 2 * z) = t2;
++      *(v4flt *) (dst + j + 3 * z) = t3;
++    }
++  for (; j < n; ++j)
++    {
++      float t = src[0][j];
++      for (i = 1; i < a; ++i)
++      t += src[i][j];
++      dst[j] = t;
++    }
++}
++
++float buffer[64];
++
++int
++main (void)
++{
++  int i;
++  float *dst, *src[2];
++
++  dst = buffer;
++  dst += (-(long int) buffer & (16 * sizeof (float) - 1)) / sizeof (float);
++  src[0] = dst + 16;
++  src[1] = dst + 32;
++  for (i = 0; i < 16; ++i)
++    {
++      src[0][i] = (float) i + 11 * (float) i;
++      src[1][i] = (float) i + 12 * (float) i;
++    }
++  foo (dst, src, 2, 16);
++  for (i = 0; i < 16; ++i)
++    {
++      float e = (float) i + 11 * (float) i + (float) i + 12 * (float) i;
++      if (dst[i] != e)
++      abort ();
++    }
++  return 0;
++}
+2006-03-01  Alexandre Oliva  <aoliva@redhat.com>
+
+       * dwarf2out.c (dwarf2out_stack_adjust): Always track the stack
+       pointer, instead of assuming it is possible to derive the
+       correct args size from a call insn.
+
+--- gcc/dwarf2out.c.orig       2006-03-01 05:13:50.000000000 -0300
++++ gcc/dwarf2out.c    2006-03-01 05:41:38.000000000 -0300
+@@ -1069,26 +1069,6 @@ dwarf2out_stack_adjust (rtx insn)
+   if (prologue_epilogue_contains (insn) || sibcall_epilogue_contains (insn))
+     return;
+-  if (!flag_asynchronous_unwind_tables && GET_CODE (insn) == CALL_INSN)
+-    {
+-      /* Extract the size of the args from the CALL rtx itself.  */
+-      insn = PATTERN (insn);
+-      if (GET_CODE (insn) == PARALLEL)
+-      insn = XVECEXP (insn, 0, 0);
+-      if (GET_CODE (insn) == SET)
+-      insn = SET_SRC (insn);
+-      if (GET_CODE (insn) != CALL)
+-      abort ();
+-
+-      dwarf2out_args_size ("", INTVAL (XEXP (insn, 1)));
+-      return;
+-    }
+-
+-  /* If only calls can throw, and we have a frame pointer,
+-     save up adjustments until we see the CALL_INSN.  */
+-  else if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM)
+-    return;
+-
+   if (GET_CODE (insn) == BARRIER)
+     {
+       /* When we see a BARRIER, we know to reset args_size to 0.  Usually
+@@ -1111,9 +1091,20 @@ dwarf2out_stack_adjust (rtx insn)
+       if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
+         offset += stack_adjust_offset (XVECEXP (PATTERN (insn), 0, i));
+     }
++  else if (GET_CODE (insn) == CALL_INSN)
++    offset = 0;
+   else
+     return;
++  /* We handle this separately because we want stack adjustments in a
++     CALL_INSN to be handled.  */;
++  if (GET_CODE (insn) == CALL_INSN)
++    {
++      /* If only calls can throw, adjust args_size only at call sites.  */
++      if (!flag_asynchronous_unwind_tables)
++      dwarf2out_args_size ("", args_size);
++    }
++
+   if (offset == 0)
+     return;
+@@ -1128,6 +1119,16 @@ dwarf2out_stack_adjust (rtx insn)
+   if (args_size < 0)
+     args_size = 0;
++  /* If only calls can throw and we have a frame pointer, we'll save
++     up adjustments until we see the CALL_INSN.  We used to return
++     early and derive args_size from NARGS in the CALL_INSN itself,
++     but that doesn't compute the right value if we have nested call
++     expansions, e.g., stack adjustments for a call have already been
++     emitted, and then we issue another call to compute an argument
++     for the enclosing call (i.e., bar (foo ())).  */
++  if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM)
++    return;
++
+   label = dwarf2out_cfi_label ();
+   def_cfa_1 (label, &cfa);
+   dwarf2out_args_size (label, args_size);
+2006-02-25  Alexandre Oliva  <aoliva@redhat.com>
+
+       * varasm.c (copy_constant): Handle VECTOR_CST.
+
+       * gcc.dg/altivec-23.c: New test.
+
+--- gcc/varasm.c       2006-02-25 03:52:54.000000000 -0300
++++ gcc/varasm.c       2006-02-25 03:54:56.000000000 -0300
+@@ -2464,6 +2464,19 @@ copy_constant (tree exp)
+       return copy;
+       }
++    case VECTOR_CST:
++      {
++      tree copy = copy_node (exp);
++      tree list = copy_list (TREE_VECTOR_CST_ELTS (exp));
++      tree tail;
++
++      TREE_VECTOR_CST_ELTS (copy) = list;
++      for (tail = list; tail; tail = TREE_CHAIN (tail))
++        TREE_VALUE (tail) = copy_constant (TREE_VALUE (tail));
++
++      return copy;
++      }
++
+     default:
+       {
+       tree t;
+--- gcc/testsuite/gcc.dg/altivec-23.c  1970-01-01 00:00:00.000000000 +0000
++++ gcc/testsuite/gcc.dg/altivec-23.c  2006-02-25 04:10:36.000000000 -0300
+@@ -0,0 +1,25 @@
++/* Verify that it is possible to define variables of composite types
++   containing vector types.  We used to crash handling the
++   initializer of automatic ones.  */
++
++/* { dg-do compile { target powerpc*-*-* } } */
++/* { dg-xfail-if "" { "powerpc-ibm-aix*" } { "-maltivec" } { "" } } */
++/* { dg-options "-maltivec -mabi=altivec" } */
++
++#include <altivec.h>
++
++typedef int bt;
++typedef vector bt vt;
++typedef struct { vt x; bt y[sizeof(vt) / sizeof (bt)]; } st;
++#define INIT { 1, 2, 3, 4 }
++
++void f ()
++{
++  vt x = INIT;
++  vt y[1] = { INIT };
++  st s = { INIT, INIT };
++}
++
++vt x = INIT;
++vt y[1] = { INIT };
++st s = { INIT, INIT };
+2006-12-08  Alexandre Oliva  <aoliva@redhat.com>
+
+       * g++.dg/template/array17.C: New test.
+
+2006-10-27  Alexandre Oliva  <aoliva@redhat.com>
+
+       * typeck.c (non_reference): Don't dereference NULL type.
+
+--- gcc/cp/typeck.c.orig       2005-11-21 11:56:03.000000000 -0200
++++ gcc/cp/typeck.c    2006-10-27 03:28:04.000000000 -0300
+@@ -6443,7 +6443,7 @@ casts_away_constness (tree t1, tree t2)
+ tree
+ non_reference (tree t)
+ {
+-  if (TREE_CODE (t) == REFERENCE_TYPE)
++  if (t != NULL_TREE && TREE_CODE (t) == REFERENCE_TYPE)
+     t = TREE_TYPE (t);
+   return t;
+ }
+--- gcc/testsuite/g++.dg/template/array17.C    2006-10-04 16:28:56.502613000 +0200
++++ gcc/testsuite/g++.dg/template/array17.C    2006-12-08 12:38:27.000000000 +0100
+@@ -0,0 +1,23 @@
++// { dg-do compile }
++
++template <typename T>
++struct V {
++  T& operator[](int);
++};
++
++struct S {
++  S operator +(int);
++  template <typename T> T value();
++};
++
++template <typename T>
++void R (T v)
++{
++  v[(S() + 0).template value<int>()][0] = 0;
++}
++
++int
++main ()
++{
++  R(V<V<int> >());
++}
+2006-12-08  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.dg/opt/ifcvt1.C: New test.
+
+2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * ifcvt.c (noce_get_alt_condition): Use prev_nonnote_insn.
+       (noce_try_abs): Negate if the comparison is reversed.
+       Look only one instruction backwards for a REG_EQUAL note.
+
+       * gcc.dg/ifcvt-fabs-1.c: New test.
+
+--- gcc/ifcvt.c.orig   2005-11-21 11:43:21.000000000 -0200
++++ gcc/ifcvt.c        2006-10-26 02:21:07.000000000 -0300
+@@ -1406,7 +1406,7 @@ noce_get_alt_condition (struct noce_if_i
+       rtx prev_insn;
+       /* First, look to see if we put a constant in a register.  */
+-      prev_insn = PREV_INSN (if_info->cond_earliest);
++      prev_insn = prev_nonnote_insn (if_info->cond_earliest);
+       if (prev_insn
+         && INSN_P (prev_insn)
+         && GET_CODE (PATTERN (prev_insn)) == SET)
+@@ -1642,25 +1642,30 @@ noce_try_abs (struct noce_if_info *if_in
+   if (rtx_equal_p (XEXP (cond, 0), b))
+     c = XEXP (cond, 1);
+   else if (rtx_equal_p (XEXP (cond, 1), b))
+-    c = XEXP (cond, 0);
++    {
++      c = XEXP (cond, 0);
++      negate = !negate;
++    }
+   else
+     return FALSE;
+-  /* Verify that C is zero.  Search backward through the block for
+-     a REG_EQUAL note if necessary.  */
++  /* Verify that C is zero.  Search one step backward for a
++     REG_EQUAL note or a simple source if necessary.  */
+   if (REG_P (c))
+     {
+-      rtx insn, note = NULL;
+-      for (insn = earliest;
+-         insn != BB_HEAD (if_info->test_bb);
+-         insn = PREV_INSN (insn))
+-      if (INSN_P (insn)
+-          && ((note = find_reg_note (insn, REG_EQUAL, c))
+-              || (note = find_reg_note (insn, REG_EQUIV, c))))
+-        break;
+-      if (! note)
++      rtx set, insn = prev_nonnote_insn (earliest);
++      if (insn
++        && (set = single_set (insn))
++        && rtx_equal_p (SET_DEST (set), c))
++      {
++        rtx note = find_reg_equal_equiv_note (insn);
++        if (note)
++          c = XEXP (note, 0);
++        else
++          c = SET_SRC (set);
++      }
++      else
+       return FALSE;
+-      c = XEXP (note, 0);
+     }
+   if (GET_CODE (c) == MEM
+       && GET_CODE (XEXP (c, 0)) == SYMBOL_REF
+--- gcc/testsuite/gcc.dg/ifcvt-fabs-1.c        1970-01-01 00:00:00.000000000 +0000
++++ gcc/testsuite/gcc.dg/ifcvt-fabs-1.c        2006-10-26 02:20:24.000000000 -0300
+@@ -0,0 +1,21 @@
++/* { dg-do run } */
++/* { dg-options "-O" } */
++/* { dg-options "-O -march=i686" { target i686-*-* } } */
++
++extern void abort(void);
++
++float foo(float f)
++{
++  if (f < 0.0f)
++    f = -f;
++
++  return f;
++}
++
++int main(void)
++{
++  if (foo (-1.0f) != 1.0f)
++    abort ();
++
++  return 0;
++}
+--- gcc/testsuite/g++.dg/opt/ifcvt1.C  2006-10-04 16:28:56.502613000 +0200
++++ gcc/testsuite/g++.dg/opt/ifcvt1.C  2006-12-08 12:23:23.000000000 +0100
+@@ -0,0 +1,17 @@
++// { dg-do compile }
++// { dg-options "-O2 -fnon-call-exceptions" }
++
++struct S { ~S () throw () {} };
++double bar ();
++
++int
++foo ()
++{
++  S a;
++  int i = 0;
++  double c = bar ();
++  c = c < 0 ? -c : c;
++  if (c <= 1.e-8)
++    i += 24;
++  return i;
++}
+2007-04-02  Jakub Jelinek  <jakub@redhat.com>
+
+       * expr.c (expand_expr_real) <case COMPLEX_EXPR>: Force op1
+       into register if target overlaps with op1.
+
+       * g77.f-torture/execute/20070402.f: New test.
+
+--- gcc/expr.c.jj      2006-10-05 00:37:01.000000000 +0200
++++ gcc/expr.c 2007-04-02 13:28:52.000000000 +0200
+@@ -8949,6 +8949,9 @@ expand_expr_real (tree exp, rtx target, 
+       if (! target)
+         target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
++      else if (GET_CODE (target) == MEM
++               && reg_overlap_mentioned_p (target, op1))
++        op1 = force_reg (mode, op1);
+       start_sequence ();
+--- gcc/testsuite/g77.f-torture/execute/20070402.f.jj  2007-04-02 13:29:51.000000000 +0200
++++ gcc/testsuite/g77.f-torture/execute/20070402.f     2007-04-02 12:11:00.000000000 +0200
+@@ -0,0 +1,21 @@
++      program rh233941
++      implicit none
++      complex*16 z
++      z = dcmplx(1.0, 2.0)
++      call sub(z)
++      stop
++      end program rh233941
++
++      subroutine sub(z)
++      implicit none
++      complex*16 z
++      z = dcmplx(-dimag(z), dreal(z))
++      call sub2(z)
++      return
++      end subroutine sub
++
++      subroutine sub2(z)
++      implicit none
++      complex*16 z
++      if (dreal(z).ne.-2.0.or.dimag(z).ne.1.0) call abort
++      end subroutine sub2
+2007-01-24   Steve LoBasso <slobasso@yahoo.com>
+            Paolo Carlini  <pcarlini@suse.de>
+
+       * include/bits/deque.tcc (deque<>::erase(iterator, iterator)):
+       Fix condition.
+       * testsuite/23_containers/deque/modifiers/erase/3.cc: New.
+
+--- libstdc++-v3/include/bits/deque.tcc        (revision 121146)
++++ libstdc++-v3/include/bits/deque.tcc        (revision 121147)
+@@ -140,7 +140,7 @@ namespace _GLIBCXX_STD
+       {
+         const difference_type __n = __last - __first;
+         const difference_type __elems_before = __first - this->_M_impl._M_start;
+-        if (static_cast<size_type>(__elems_before) < (size() - __n) / 2)
++        if (static_cast<size_type>(__elems_before) <= (size() - __n) / 2)
+           {
+             std::copy_backward(this->_M_impl._M_start, __first, __last);
+             iterator __new_start = this->_M_impl._M_start + __n;
+--- libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/3.cc    (revision 0)
++++ libstdc++-v3/testsuite/23_containers/deque/modifiers/erase/3.cc    (revision 121147)
+@@ -0,0 +1,52 @@
++// Copyright (C) 2007 Free Software Foundation, Inc.
++//
++// This file is part of the GNU ISO C++ Library.  This library is free
++// software; you can redistribute it and/or modify it under the
++// terms of the GNU General Public License as published by the
++// Free Software Foundation; either version 2, or (at your option)
++// any later version.
++
++// This library is distributed in the hope that it will be useful,
++// but WITHOUT ANY WARRANTY; without even the implied warranty of
++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++// GNU General Public License for more details.
++
++// You should have received a copy of the GNU General Public License along
++// with this library; see the file COPYING.  If not, write to the Free
++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
++// USA.
++
++// 23.2.1.3 deque modifiers
++
++#include <deque>
++#include <testsuite_hooks.h>
++
++void erase(size_t num_elm, size_t elm_strt, size_t elm_end)
++{
++  bool test __attribute__((unused)) = true;
++  using __gnu_test::copy_tracker;
++  using __gnu_test::assignment_operator;
++
++  std::deque<copy_tracker> x(num_elm);
++  copy_tracker::reset();
++  
++  x.erase(x.begin() + elm_strt, x.begin() + elm_end);
++  
++  const size_t min_num_cpy = std::min(elm_strt, num_elm - elm_end);
++  VERIFY( assignment_operator::count() == min_num_cpy );
++}
++
++// http://gcc.gnu.org/ml/libstdc++/2007-01/msg00098.html
++void test01()
++{
++  for (size_t num_elm = 0; num_elm <= 10; ++num_elm)
++    for (size_t elm_strt = 0; elm_strt <= num_elm; ++elm_strt)
++      for (size_t elm_end = elm_strt; elm_end <= num_elm; ++elm_end)
++      erase(num_elm, elm_strt, elm_end);
++}
++
++int main()
++{
++  test01();
++  return 0;
++}
+2007-04-12  Jakub Jelinek  <jakub@redhat.com>
+
+       * fr.po: Use %s rather than %S.
+       * rw.po: Comment out translations with bogus format
+       strings.
+
+--- gcc/po/fr.po.jj    2006-10-05 00:33:36.000000000 +0200
++++ gcc/po/fr.po       2007-04-13 00:23:29.000000000 +0200
+@@ -17100,7 +17100,7 @@ msgstr "%s liste d'expressions traitée c
+ #: cp/typeck.c:4490
+ msgid "%s from type `%T' to type `%T' casts away constness"
+-msgstr "%S Ã  partir du Â« %T Â» vers le type Â« %T Â» provoque un transtypage sans constante"
++msgstr "%s Ã  partir du Â« %T Â» vers le type Â« %T Â» provoque un transtypage sans constante"
+ #: cp/typeck.c:4692
+ msgid "invalid static_cast from type `%T' to type `%T'"
+2007-04-21  Alexandre Oliva  <aoliva@redhat.com>
+
+       * gcse.c (store_killed_in_insn): Handle PARALLELs.
+       (store_killed_in_pat): New.
+
+       * gcc.dg/movsi-sm-1.c: New.
+
+--- gcc/gcse.c.jj      2007-02-23 21:29:12.000000000 +0100
++++ gcc/gcse.c 2007-07-18 20:41:08.000000000 +0200
+@@ -7427,6 +7427,40 @@ find_loads (rtx x, rtx store_pattern, in
+   return ret;
+ }
++static inline bool
++store_killed_in_pat (rtx x, rtx pat, int after)
++{
++  if (GET_CODE (pat) == SET)
++    {
++      rtx dest = SET_DEST (pat);
++
++      if (GET_CODE (dest) == SIGN_EXTRACT
++        || GET_CODE (dest) == ZERO_EXTRACT)
++      dest = XEXP (dest, 0);
++
++      /* Check for memory stores to aliased objects.  */
++      if (GET_CODE (dest) == MEM
++        && !expr_equiv_p (dest, x))
++      {
++        if (after)
++          {
++            if (output_dependence (dest, x))
++              return true;
++          }
++        else
++          {
++            if (output_dependence (x, dest))
++              return true;
++          }
++      }
++    }
++
++  if (find_loads (pat, x, after))
++    return true;
++
++  return false;
++}
++
+ /* Check if INSN kills the store pattern X (is aliased with it).
+    AFTER is true if we are checking the case when store X occurs
+    after the insn.  Return true if it it does.  */
+@@ -7434,7 +7468,7 @@ find_loads (rtx x, rtx store_pattern, in
+ static bool
+ store_killed_in_insn (rtx x, rtx x_regs, rtx insn, int after)
+ {
+-  rtx reg, base, note;
++  rtx reg, base, note, pat;
+   if (!INSN_P (insn))
+     return false;
+@@ -7461,33 +7495,20 @@ store_killed_in_insn (rtx x, rtx x_regs,
+       return false;
+     }
+-  if (GET_CODE (PATTERN (insn)) == SET)
++  pat = PATTERN (insn);
++  if (GET_CODE (pat) == SET)
+     {
+-      rtx pat = PATTERN (insn);
+-      rtx dest = SET_DEST (pat);
+-
+-      if (GET_CODE (dest) == SIGN_EXTRACT
+-        || GET_CODE (dest) == ZERO_EXTRACT)
+-      dest = XEXP (dest, 0);
+-
+-      /* Check for memory stores to aliased objects.  */
+-      if (GET_CODE (dest) == MEM
+-        && !expr_equiv_p (dest, x))
+-      {
+-        if (after)
+-          {
+-            if (output_dependence (dest, x))
+-              return true;
+-          }
+-        else
+-          {
+-            if (output_dependence (x, dest))
+-              return true;
+-          }
+-      }
+-      if (find_loads (SET_SRC (pat), x, after))
++      if (store_killed_in_pat (x, pat, after))
+       return true;
+     }
++  else if (GET_CODE (pat) == PARALLEL)
++    {
++      int i;
++
++      for (i = 0; i < XVECLEN (pat, 0); i++)
++      if (store_killed_in_pat (x, XVECEXP (pat, 0, i), after))
++        return true;
++    }
+   else if (find_loads (PATTERN (insn), x, after))
+     return true;
+--- gcc/testsuite/gcc.dg/movsi-sm-1.c.jj       2007-07-18 20:58:08.000000000 +0200
++++ gcc/testsuite/gcc.dg/movsi-sm-1.c  2007-07-18 21:01:52.000000000 +0200
+@@ -0,0 +1,35 @@
++/* { dg-do run } */
++/* { dg-options "-O2" } */
++/* { dg-options "-O2 -mtune=i386" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
++
++int ret = 1;
++char buf[128];
++
++void
++__attribute__((noinline))
++bug (int arg)
++{
++  char str[28];
++
++  __builtin_memcpy (str, "Bugged!", 8);
++
++  if (arg & 0200)
++    {
++      __builtin_memcpy (str, "This is what we should get!", 28);
++      ret = 0;
++    }
++
++  if (arg & 0100)
++    __builtin_memcpy (str, "Broken!", 8);
++
++  __builtin_sprintf (buf, "%s\n", str);
++}
++
++int
++main ()
++{
++  bug (0200);
++  if (ret)
++    return ret;
++  return __builtin_strcmp (buf, "This is what we should get!\n") != 0;
++}
+2007-06-08  Jatin Nansi  <jnansi@redhat.com>
+
+       * config/locale/ieee_1003.1-2001/codecvt_specializations.h: Make sure
+       _M_int_enc and _M_ext_enc are '\0' terminated.
+
+--- libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h.jj   2007-02-23 21:29:34.000000000 +0100
++++ libstdc++-v3/config/locale/ieee_1003.1-2001/codecvt_specializations.h      2007-07-19 14:20:20.000000000 +0200
+@@ -83,8 +83,10 @@
+                         int __ibom = 0, int __ebom = 0)
+     : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(__ebom), _M_int_bom(__ibom)
+     {
+-      strncpy(_M_int_enc, __int, _S_max_size);
+-      strncpy(_M_ext_enc, __ext, _S_max_size);
++      strncpy(_M_int_enc, __int, _S_max_size - 1);
++      strncpy(_M_ext_enc, __ext, _S_max_size - 1);
++      _M_int_enc[_S_max_size - 1] = '\0';
++      _M_ext_enc[_S_max_size - 1] = '\0';
+       _M_init();
+     }
+@@ -98,8 +100,10 @@
+     // information.
+     __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0)
+     {
+-      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size);
+-      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size);
++      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size - 1);
++      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size - 1);
++      _M_int_enc[_S_max_size - 1] = '\0';
++      _M_ext_enc[_S_max_size - 1] = '\0';
+       _M_ext_bom = __obj._M_ext_bom;
+       _M_int_bom = __obj._M_int_bom;
+       _M_destroy();
+@@ -110,8 +114,10 @@
+     __enc_traits&
+     operator=(const __enc_traits& __obj)
+     {
+-      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size);
+-      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size);
++      strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size - 1);
++      strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size - 1);
++      _M_int_enc[_S_max_size - 1] = '\0';
++      _M_ext_enc[_S_max_size - 1] = '\0';
+       _M_ext_bom = __obj._M_ext_bom;
+       _M_int_bom = __obj._M_int_bom;
+       _M_destroy();
diff --git a/gcc3-pr15666.patch b/gcc3-pr15666.patch
new file mode 100644 (file)
index 0000000..376fa9d
--- /dev/null
@@ -0,0 +1,23 @@
+Index: gcc/ChangeLog
+from  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR middle-end/15666
+       * c-decl.c (finish_decl): Use change_decl_assembler_name for the
+       builtin decl as well.
+
+Index: gcc/c-decl.c
+===================================================================
+RCS file: /cvs/gcc/gcc/gcc/c-decl.c,v
+retrieving revision 1.504
+diff -u -p -r1.504 c-decl.c
+--- gcc/c-decl.c 31 May 2004 22:06:27 -0000 1.504
++++ gcc/c-decl.c 1 Jun 2004 04:03:41 -0000
+@@ -2886,7 +2886,7 @@ finish_decl (tree decl, tree init, tree 
+       {
+         tree builtin = built_in_decls [DECL_FUNCTION_CODE (decl)];
+         SET_DECL_RTL (builtin, NULL_RTX);
+-        SET_DECL_ASSEMBLER_NAME (builtin, get_identifier (starred));
++        change_decl_assembler_name (builtin, get_identifier (starred));
+ #ifdef TARGET_MEM_FUNCTIONS
+         if (DECL_FUNCTION_CODE (decl) == BUILT_IN_MEMCPY)
+           init_block_move_fn (starred);
diff --git a/gcc3-ssp.patch b/gcc3-ssp.patch
new file mode 100644 (file)
index 0000000..3aae640
--- /dev/null
@@ -0,0 +1,4202 @@
+diff -uNr gcc-3.4.3.orig/gcc/calls.c gcc-3.4.3/gcc/calls.c
+--- gcc-3.4.3.orig/gcc/calls.c 2004-06-24 09:26:50.000000000 +0200
++++ gcc-3.4.3/gcc/calls.c      2004-11-24 18:35:31.000000000 +0100
+@@ -2321,8 +2321,12 @@
+         {
+           /* For variable-sized objects, we must be called with a target
+              specified.  If we were to allocate space on the stack here,
+-             we would have no way of knowing when to free it.  */
+-          rtx d = assign_temp (TREE_TYPE (exp), 1, 1, 1);
++             we would have no way of knowing when to free it.
++
++             This is the structure of a function return object and it isn't
++             a character array for the stack protection, so it is
++             marked using the assignment of the KEEP argument to 5.  */
++          rtx d = assign_temp (TREE_TYPE (exp), 5, 1, 1);
+           mark_temp_addr_taken (d);
+           structure_value_addr = XEXP (d, 0);
+diff -uNr gcc-3.4.3.orig/gcc/c-cppbuiltin.c gcc-3.4.3/gcc/c-cppbuiltin.c
+--- gcc-3.4.3.orig/gcc/c-cppbuiltin.c  2004-03-04 11:24:54.000000000 +0100
++++ gcc-3.4.3/gcc/c-cppbuiltin.c       2004-11-24 18:35:31.000000000 +0100
+@@ -408,6 +408,12 @@
+   if (c_dialect_objc () && flag_next_runtime)
+     cpp_define (pfile, "__NEXT_RUNTIME__");
++  /* Make the choice of the stack protector runtime visible to source code.  */
++  if (flag_propolice_protection)
++    cpp_define (pfile, "__SSP__=1");
++  if (flag_stack_protection)
++    cpp_define (pfile, "__SSP_ALL__=2");
++
+   /* A straightforward target hook doesn't work, because of problems
+      linking that hook's body when part of non-C front ends.  */
+ # define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
+diff -uNr gcc-3.4.3.orig/gcc/combine.c gcc-3.4.3/gcc/combine.c
+--- gcc-3.4.3.orig/gcc/combine.c       2004-10-13 01:35:29.000000000 +0200
++++ gcc-3.4.3/gcc/combine.c    2004-11-24 18:35:31.000000000 +0100
+@@ -1401,6 +1401,10 @@
+             && ! fixed_regs[REGNO (dest)]
+             && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (dest))))))
+     return 1;
++  /* Never combine loads and stores protecting argument that use set insn
++     with used flag on.  */
++  if (SET_VOLATILE_P (set))
++    return 1;
+   return 0;
+ }
+@@ -3781,7 +3785,20 @@
+         rtx inner_op0 = XEXP (XEXP (x, 0), 1);
+         rtx inner_op1 = XEXP (x, 1);
+         rtx inner;
+-
++        
++#ifndef FRAME_GROWS_DOWNWARD
++        /* For the case where the frame grows upward,
++           the stack protector keeps the offset of the frame pointer
++           positive integer.  */
++        if (flag_propolice_protection
++            && code == PLUS
++            && other == frame_pointer_rtx
++            && GET_CODE (inner_op0) == CONST_INT
++            && GET_CODE (inner_op1) == CONST_INT
++            && INTVAL (inner_op0) > 0
++            && INTVAL (inner_op0) + INTVAL (inner_op1) <= 0)
++          return x;
++#endif
+         /* Make sure we pass the constant operand if any as the second
+            one if this is a commutative operation.  */
+         if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
+@@ -4146,6 +4163,13 @@
+        they are now checked elsewhere.  */
+       if (GET_CODE (XEXP (x, 0)) == PLUS
+         && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
++#ifndef FRAME_GROWS_DOWNWARD
++      /* The stack protector keeps the addressing style of a local variable
++         to be able to change its stack position.  */
++      if (! (flag_propolice_protection
++             && XEXP (XEXP (x, 0), 0) == frame_pointer_rtx
++             && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT))
++#endif
+       return gen_binary (PLUS, mode,
+                          gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
+                                      XEXP (x, 1)),
+@@ -4273,8 +4297,14 @@
+       }
+       /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
+-       integers.  */
+-      if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
++       integers.
++       
++       The stack protector keeps the addressing style of
++       a local variable.  */
++      if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode)
++        && (! (flag_propolice_protection
++               && XEXP (XEXP (x, 1), 0) == frame_pointer_rtx
++               && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT)))
+       return gen_binary (MINUS, mode,
+                          gen_binary (MINUS, mode, XEXP (x, 0),
+                                      XEXP (XEXP (x, 1), 0)),
+diff -uNr gcc-3.4.3.orig/gcc/common.opt gcc-3.4.3/gcc/common.opt
+--- gcc-3.4.3.orig/gcc/common.opt      2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/common.opt   2004-11-24 18:35:31.000000000 +0100
+@@ -152,6 +152,10 @@
+ Common
+ Warn when a variable is unused
++Wstack-protector
++Common
++Warn when not issuing stack smashing protection for some reason
++
+ aux-info
+ Common Separate
+ -aux-info <file>      Emit declaration information into <file>
+@@ -743,6 +747,14 @@
+ Common
+ Put zero initialized data in the bss section
++fstack-protector
++Common
++Enables stack protection
++
++fstack-protector-all
++Common
++Enables stack protection of every function
++
+ g
+ Common JoinedOrMissing
+ Generate debug information in default format
+diff -uNr gcc-3.4.3.orig/gcc/config/arm/arm.md gcc-3.4.3/gcc/config/arm/arm.md
+--- gcc-3.4.3.orig/gcc/config/arm/arm.md       2004-08-25 17:46:19.000000000 +0200
++++ gcc-3.4.3/gcc/config/arm/arm.md    2004-11-24 18:35:31.000000000 +0100
+@@ -3840,7 +3840,13 @@
+       (match_operand:DI 1 "general_operand" ""))]
+   "TARGET_EITHER"
+   "
+-  if (TARGET_THUMB)
++  if (TARGET_ARM)
++    {
++      /* Everything except mem = const or mem = mem can be done easily */
++      if (GET_CODE (operands[0]) == MEM)
++        operands[1] = force_reg (DImode, operands[1]);
++    }
++  else /* TARGET_THUMB.... */
+     {
+       if (!no_new_pseudos)
+         {
+diff -uNr gcc-3.4.3.orig/gcc/config/t-linux gcc-3.4.3/gcc/config/t-linux
+--- gcc-3.4.3.orig/gcc/config/t-linux  2003-09-23 20:55:57.000000000 +0200
++++ gcc-3.4.3/gcc/config/t-linux       2004-11-24 18:35:31.000000000 +0100
+@@ -1,7 +1,7 @@
+ # Compile crtbeginS.o and crtendS.o with pic.
+ CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC
+ # Compile libgcc2.a with pic.
+-TARGET_LIBGCC2_CFLAGS = -fPIC
++TARGET_LIBGCC2_CFLAGS = -fPIC -DHAVE_SYSLOG
+ # Override t-slibgcc-elf-ver to export some libgcc symbols with
+ # the symbol versions that glibc used.
+diff -uNr gcc-3.4.3.orig/gcc/configure gcc-3.4.3/gcc/configure
+--- gcc-3.4.3.orig/gcc/configure       2004-11-05 05:14:05.000000000 +0100
++++ gcc-3.4.3/gcc/configure    2004-11-24 18:44:13.000000000 +0100
+@@ -4809,6 +4809,9 @@
+ fi;
++ENABLESSP=""
++
++
+ # -------------------------
+ # Checks for other programs
+ # -------------------------
+@@ -13036,6 +13039,7 @@
+ s,@TARGET_SYSTEM_ROOT_DEFINE@,$TARGET_SYSTEM_ROOT_DEFINE,;t t
+ s,@CROSS_SYSTEM_HEADER_DIR@,$CROSS_SYSTEM_HEADER_DIR,;t t
+ s,@onestep@,$onestep,;t t
++s,@ENABLESSP@,$ENABLESSP,;t t
+ s,@SET_MAKE@,$SET_MAKE,;t t
+ s,@AWK@,$AWK,;t t
+ s,@LN@,$LN,;t t
+diff -uNr gcc-3.4.3.orig/gcc/configure.ac gcc-3.4.3/gcc/configure.ac
+--- gcc-3.4.3.orig/gcc/configure.ac    2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/configure.ac 2004-11-24 18:46:57.000000000 +0100
+@@ -613,6 +613,9 @@
+ [onestep=""])
+ AC_SUBST(onestep)
++ENABLESSP=""
++AC_SUBST(ENABLESSP)
++
+ # -------------------------
+ # Checks for other programs
+ # -------------------------
+diff -uNr gcc-3.4.3.orig/gcc/cse.c gcc-3.4.3/gcc/cse.c
+--- gcc-3.4.3.orig/gcc/cse.c   2004-10-26 20:05:42.000000000 +0200
++++ gcc-3.4.3/gcc/cse.c        2004-11-24 18:35:31.000000000 +0100
+@@ -4212,7 +4212,14 @@
+             if (new_const == 0)
+               break;
+-
++#ifndef FRAME_GROWS_DOWNWARD
++            if (flag_propolice_protection
++                && GET_CODE (y) == PLUS
++                && XEXP (y, 0) == frame_pointer_rtx
++                && INTVAL (inner_const) > 0
++                && INTVAL (new_const) <= 0)
++              break;
++#endif
+             /* If we are associating shift operations, don't let this
+                produce a shift of the size of the object or larger.
+                This could occur when we follow a sign-extend by a right
+@@ -4744,6 +4751,14 @@
+       if (SET_DEST (x) == pc_rtx
+         && GET_CODE (SET_SRC (x)) == LABEL_REF)
+       ;
++      /* cut the reg propagation of stack-protected argument.  */
++      else if (SET_VOLATILE_P (x)) {
++      rtx x1 = SET_DEST (x);
++      if (GET_CODE (x1) == SUBREG && GET_CODE (SUBREG_REG (x1)) == REG)
++        x1 = SUBREG_REG (x1);
++      if (! REGNO_QTY_VALID_P(REGNO (x1)))
++        make_new_qty (REGNO (x1), GET_MODE (x1));
++      }
+       /* Don't count call-insns, (set (reg 0) (call ...)), as a set.
+        The hard function value register is used only once, to copy to
+diff -uNr gcc-3.4.3.orig/gcc/doc/invoke.texi gcc-3.4.3/gcc/doc/invoke.texi
+--- gcc-3.4.3.orig/gcc/doc/invoke.texi 2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/doc/invoke.texi      2004-11-24 18:35:32.000000000 +0100
+@@ -228,7 +228,7 @@
+ -Wno-multichar  -Wnonnull  -Wpacked  -Wpadded @gol
+ -Wparentheses  -Wpointer-arith  -Wredundant-decls @gol
+ -Wreturn-type  -Wsequence-point  -Wshadow @gol
+--Wsign-compare  -Wstrict-aliasing @gol
++-Wsign-compare  -Wstack-protector  -Wstrict-aliasing @gol
+ -Wswitch  -Wswitch-default  -Wswitch-enum @gol
+ -Wsystem-headers  -Wtrigraphs  -Wundef  -Wuninitialized @gol
+ -Wunknown-pragmas  -Wunreachable-code @gol
+@@ -673,6 +673,7 @@
+ -fshort-double  -fshort-wchar @gol
+ -fverbose-asm  -fpack-struct  -fstack-check @gol
+ -fstack-limit-register=@var{reg}  -fstack-limit-symbol=@var{sym} @gol
++-fstack-protector  -fstack-protector-all @gol
+ -fargument-alias  -fargument-noalias @gol
+ -fargument-noalias-global  -fleading-underscore @gol
+ -ftls-model=@var{model} @gol
+@@ -3006,6 +3007,10 @@
+ complex; GCC will refuse to optimize programs when the optimization
+ itself is likely to take inordinate amounts of time.
++@item -Wstack-protector
++@opindex Wstack-protector
++Warn when not issuing stack smashing protection for some reason.
++
+ @item -Werror
+ @opindex Werror
+ Make all warnings into errors.
+@@ -11202,6 +11207,24 @@
+ @option{-Wl,--defsym,__stack_limit=0x7ffe0000} to enforce a stack limit
+ of 128KB@.  Note that this may only work with the GNU linker.
++@item -fstack-protector
++@item -fstack-protector-all
++@opindex fstack-protector
++@opindex fstack-protector-all
++@opindex fno-stack-protector
++Generate code to protect an application from a stack smashing
++attack. The features are (1) the insertion of random value next to the
++frame pointer to detect the integrity of the stack, (2) the reordering
++of local variables to place buffers after pointers to avoid the
++corruption of pointers that could be used to further corrupt arbitrary
++memory locations, (3) the copying of pointers in function arguments to
++an area preceding local variable buffers to prevent the corruption of
++pointers that could be used to further corrupt arbitrary memory
++locations, and the (4) omission of instrumentation code from some
++functions to decrease the performance overhead.  If the integrity
++would be broken, the program is aborted.  If stack-protector-all is
++specified, instrumentation codes are generated at every functions.
++
+ @cindex aliasing of parameters
+ @cindex parameters, aliased
+ @item -fargument-alias
+diff -uNr gcc-3.4.3.orig/gcc/explow.c gcc-3.4.3/gcc/explow.c
+--- gcc-3.4.3.orig/gcc/explow.c        2004-04-03 01:05:26.000000000 +0200
++++ gcc-3.4.3/gcc/explow.c     2004-11-24 18:35:31.000000000 +0100
+@@ -84,7 +84,8 @@
+   rtx tem;
+   int all_constant = 0;
+-  if (c == 0)
++  if (c == 0
++      && ! (flag_propolice_protection && x == virtual_stack_vars_rtx))
+     return x;
+  restart:
+@@ -185,7 +186,10 @@
+       break;
+     }
+-  if (c != 0)
++  /* For the use of stack protection, keep the frame and offset pattern
++     even if the offset is zero.  */
++  if (c != 0
++      || (flag_propolice_protection && x == virtual_stack_vars_rtx))
+     x = gen_rtx_PLUS (mode, x, GEN_INT (c));
+   if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
+@@ -474,6 +478,26 @@
+       if (memory_address_p (mode, oldx))
+       goto win2;
++      /* The stack protector keeps the addressing style of a local variable.
++       LEGITIMIZE_ADDRESS changes the addressing to the machine-dependent
++       style, so the protector split the frame address to a register using
++       force_reg. */
++      if (flag_propolice_protection)
++      {
++#define FRAMEADDR_P(X) (GET_CODE (X) == PLUS                          \
++                      && XEXP (X, 0) == virtual_stack_vars_rtx        \
++                      && GET_CODE (XEXP (X, 1)) == CONST_INT)
++        rtx y;
++        if (FRAMEADDR_P (x))
++          goto win;
++        for (y = x; y != 0 && GET_CODE (y) == PLUS; y = XEXP (y, 0))
++          {
++            if (FRAMEADDR_P (XEXP (y, 0)))
++              XEXP (y, 0) = force_reg (GET_MODE (XEXP (y, 0)), XEXP (y, 0));
++            if (FRAMEADDR_P (XEXP (y, 1)))
++              XEXP (y, 1) = force_reg (GET_MODE (XEXP (y, 1)), XEXP (y, 1));
++          }
++      }
+       /* Perform machine-dependent transformations on X
+        in certain cases.  This is not necessary since the code
+        below can handle all possible cases, but machine-dependent
+diff -uNr gcc-3.4.3.orig/gcc/expr.c gcc-3.4.3/gcc/expr.c
+--- gcc-3.4.3.orig/gcc/expr.c  2004-05-27 21:35:17.000000000 +0200
++++ gcc-3.4.3/gcc/expr.c       2004-11-24 18:35:31.000000000 +0100
+@@ -48,6 +48,7 @@
+ #include "intl.h"
+ #include "tm_p.h"
+ #include "target.h"
++#include "protector.h"
+ /* Decide whether a function's arguments should be processed
+    from first to last or from last to first.
+@@ -1060,7 +1061,11 @@
+    If ENDP is 0 return to, if ENDP is 1 return memory at the end ala
+    mempcpy, and if ENDP is 2 return memory the end minus one byte ala
+-   stpcpy.  */
++   stpcpy.
++
++   When the stack protector is used at the reverse move, it starts the move
++   instruction from the address within the region of a variable.
++   So it eliminates the first address decrement instruction.  */
+ rtx
+ move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len,
+@@ -1123,6 +1128,8 @@
+       if (USE_LOAD_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_from)
+       {
++        if (flag_propolice_protection)
++          len = len - GET_MODE_SIZE (mode);
+         data.from_addr = copy_addr_to_reg (plus_constant (from_addr, len));
+         data.autinc_from = 1;
+         data.explicit_inc_from = -1;
+@@ -1137,6 +1144,8 @@
+       data.from_addr = copy_addr_to_reg (from_addr);
+       if (USE_STORE_PRE_DECREMENT (mode) && data.reverse && ! data.autinc_to)
+       {
++        if (flag_propolice_protection)
++          len = len - GET_MODE_SIZE (mode);
+         data.to_addr = copy_addr_to_reg (plus_constant (to_addr, len));
+         data.autinc_to = 1;
+         data.explicit_inc_to = -1;
+@@ -1280,11 +1289,15 @@
+       from1 = adjust_address (data->from, mode, data->offset);
+       if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
+-      emit_insn (gen_add2_insn (data->to_addr,
+-                                GEN_INT (-(HOST_WIDE_INT)size)));
++      /* The stack protector skips the first address decrement instruction
++         at the reverse move.  */
++      if (!flag_propolice_protection || data->explicit_inc_to < -1)
++        emit_insn (gen_add2_insn (data->to_addr,
++                                  GEN_INT (-(HOST_WIDE_INT)size)));
+       if (HAVE_PRE_DECREMENT && data->explicit_inc_from < 0)
+-      emit_insn (gen_add2_insn (data->from_addr,
+-                                GEN_INT (-(HOST_WIDE_INT)size)));
++      if (!flag_propolice_protection || data->explicit_inc_from < -1)
++        emit_insn (gen_add2_insn (data->from_addr,
++                                  GEN_INT (-(HOST_WIDE_INT)size)));
+       if (data->to)
+       emit_insn ((*genfun) (to1, from1));
+@@ -2475,7 +2488,12 @@
+       if (USE_STORE_PRE_DECREMENT (mode) && data->reverse && ! data->autinc_to)
+       {
+-        data->to_addr = copy_addr_to_reg (plus_constant (to_addr, data->len));
++        int len = data->len;
++        /* The stack protector starts the store instruction from
++           the address within the region of a variable.  */
++        if (flag_propolice_protection)
++          len -= GET_MODE_SIZE (mode);
++        data->to_addr = copy_addr_to_reg (plus_constant (to_addr, len));
+         data->autinc_to = 1;
+         data->explicit_inc_to = -1;
+       }
+@@ -2544,8 +2562,11 @@
+       to1 = adjust_address (data->to, mode, data->offset);
+       if (HAVE_PRE_DECREMENT && data->explicit_inc_to < 0)
+-      emit_insn (gen_add2_insn (data->to_addr,
+-                                GEN_INT (-(HOST_WIDE_INT) size)));
++      /* The stack protector skips the first address decrement instruction
++         at the reverse store.  */
++      if (!flag_propolice_protection || data->explicit_inc_to < -1)
++        emit_insn (gen_add2_insn (data->to_addr,
++                                  GEN_INT (-(HOST_WIDE_INT) size)));
+       cst = (*data->constfun) (data->constfundata, data->offset, mode);
+       emit_insn ((*genfun) (to1, cst));
+@@ -5701,7 +5722,9 @@
+         && GET_CODE (XEXP (value, 0)) == PLUS
+         && GET_CODE (XEXP (XEXP (value, 0), 0)) == REG
+         && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
+-        && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
++        && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER
++        && (!flag_propolice_protection
++            || XEXP (XEXP (value, 0), 0) != virtual_stack_vars_rtx))
+       {
+         rtx temp = expand_simple_binop (GET_MODE (value), code,
+                                         XEXP (XEXP (value, 0), 0), op2,
+diff -uNr gcc-3.4.3.orig/gcc/flags.h gcc-3.4.3/gcc/flags.h
+--- gcc-3.4.3.orig/gcc/flags.h 2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/flags.h      2004-11-24 18:35:31.492689688 +0100
+@@ -210,6 +210,10 @@
+ extern bool warn_strict_aliasing;
++/* Warn when not issuing stack smashing protection for some reason.  */
++
++extern bool warn_stack_protector;
++
+ /* Nonzero if generating code to do profiling.  */
+ extern int profile_flag;
+@@ -795,4 +799,12 @@
+ #define HONOR_SIGN_DEPENDENT_ROUNDING(MODE) \
+   (MODE_HAS_SIGN_DEPENDENT_ROUNDING (MODE) && flag_rounding_math)
++/* Nonzero means use propolice as a stack protection method.  */
++
++extern int flag_propolice_protection;
++
++/* Nonzero means use a stack protection method for every function.  */
++
++extern int flag_stack_protection;
++
+ #endif /* ! GCC_FLAGS_H */
+diff -uNr gcc-3.4.3.orig/gcc/function.c gcc-3.4.3/gcc/function.c
+--- gcc-3.4.3.orig/gcc/function.c      2004-10-14 01:18:13.000000000 +0200
++++ gcc-3.4.3/gcc/function.c   2004-11-24 18:35:31.542682088 +0100
+@@ -63,6 +63,7 @@
+ #include "integrate.h"
+ #include "langhooks.h"
+ #include "target.h"
++#include "protector.h"
+ #ifndef TRAMPOLINE_ALIGNMENT
+ #define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
+@@ -155,6 +156,10 @@
+ /* Array of INSN_UIDs to hold the INSN_UIDs for each sibcall epilogue
+    in this function.  */
+ static GTY(()) varray_type sibcall_epilogue;
++
++/* Current boundary mark for character arrays.  */
++static int temp_boundary_mark = 0;
++
\f
+ /* In order to evaluate some expressions, such as function calls returning
+    structures in memory, we need to temporarily allocate stack locations.
+@@ -208,6 +213,8 @@
+   /* The size of the slot, including extra space for alignment.  This
+      info is for combine_temp_slots.  */
+   HOST_WIDE_INT full_size;
++  /* Boundary mark of a character array and the others. This info is for propolice.  */
++  int boundary_mark;
+ };
\f
+ /* This structure is used to record MEMs or pseudos used to replace VAR, any
+@@ -638,6 +645,7 @@
+    whose lifetime is controlled by CLEANUP_POINT_EXPRs.  KEEP is 3
+    if we are to allocate something at an inner level to be treated as
+    a variable in the block (e.g., a SAVE_EXPR).
++   KEEP is 5 if we allocate a place to return structure.
+    TYPE is the type that will be used for the stack slot.  */
+@@ -648,6 +656,8 @@
+   unsigned int align;
+   struct temp_slot *p, *best_p = 0;
+   rtx slot;
++  int char_array = (flag_propolice_protection
++                  && keep == 1 && search_string_def (type));
+   /* If SIZE is -1 it means that somebody tried to allocate a temporary
+      of a variable size.  */
+@@ -673,7 +683,8 @@
+       && ! p->in_use
+       && objects_must_conflict_p (p->type, type)
+       && (best_p == 0 || best_p->size > p->size
+-          || (best_p->size == p->size && best_p->align > p->align)))
++          || (best_p->size == p->size && best_p->align > p->align))
++      && (! char_array || p->boundary_mark != 0))
+       {
+       if (p->align == align && p->size == size)
+         {
+@@ -708,6 +719,7 @@
+             p->address = 0;
+             p->rtl_expr = 0;
+             p->type = best_p->type;
++            p->boundary_mark = best_p->boundary_mark;
+             p->next = temp_slots;
+             temp_slots = p;
+@@ -768,6 +780,7 @@
+       p->full_size = frame_offset - frame_offset_old;
+ #endif
+       p->address = 0;
++      p->boundary_mark = char_array ? ++temp_boundary_mark : 0;
+       p->next = temp_slots;
+       temp_slots = p;
+     }
+@@ -932,14 +945,16 @@
+           int delete_q = 0;
+           if (! q->in_use && GET_MODE (q->slot) == BLKmode)
+             {
+-              if (p->base_offset + p->full_size == q->base_offset)
++              if (p->base_offset + p->full_size == q->base_offset &&
++                  p->boundary_mark == q->boundary_mark)
+                 {
+                   /* Q comes after P; combine Q into P.  */
+                   p->size += q->size;
+                   p->full_size += q->full_size;
+                   delete_q = 1;
+                 }
+-              else if (q->base_offset + q->full_size == p->base_offset)
++              else if (q->base_offset + q->full_size == p->base_offset &&
++                       p->boundary_mark == q->boundary_mark)
+                 {
+                   /* P comes after Q; combine P into Q.  */
+                   q->size += p->size;
+@@ -1449,7 +1464,9 @@
+     }
+   if (new == 0)
+-    new = assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode), 0, func);
++    new = function ?
++      assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode), 0, func)
++      :       assign_stack_local_for_pseudo_reg (decl_mode, GET_MODE_SIZE (decl_mode), 0);
+   PUT_CODE (reg, MEM);
+   PUT_MODE (reg, decl_mode);
+@@ -3937,10 +3954,13 @@
+               }
+             /* Otherwise copy the new constant into a register and replace
+-               constant with that register.  */
++               constant with that register.
++               At the use of stack protection, stop to replace the frame
++               offset with a register.  */
+             temp = gen_reg_rtx (Pmode);
+             XEXP (x, 0) = new;
+-            if (validate_change (object, &XEXP (x, 1), temp, 0))
++            if (validate_change (object, &XEXP (x, 1), temp, 0)
++                && !flag_propolice_protection)
+               emit_insn_before (gen_move_insn (temp, new_offset), object);
+             else
+               {
+diff -uNr gcc-3.4.3.orig/gcc/gcse.c gcc-3.4.3/gcc/gcse.c
+--- gcc-3.4.3.orig/gcc/gcse.c  2004-10-30 20:02:53.000000000 +0200
++++ gcc-3.4.3/gcc/gcse.c       2004-11-24 18:35:31.583675856 +0100
+@@ -4176,9 +4176,13 @@
+       continue;
+       /* Find an assignment that sets reg_used and is available
+-       at the start of the block.  */
++       at the start of the block.
++
++         Skip the copy propagation not to eliminate the register that is
++       the duplicated pointer of a function argument. It is used for
++       the function argument protection.  */
+       set = find_avail_set (regno, insn);
+-      if (! set)
++      if (! set || SET_VOLATILE_P (set->expr))
+       continue;
+       pat = set->expr;
+diff -uNr gcc-3.4.3.orig/gcc/integrate.c gcc-3.4.3/gcc/integrate.c
+--- gcc-3.4.3.orig/gcc/integrate.c     2004-01-24 00:36:00.000000000 +0100
++++ gcc-3.4.3/gcc/integrate.c  2004-11-24 18:35:31.603672816 +0100
+@@ -393,6 +393,11 @@
+   /* These args would always appear unused, if not for this.  */
+   TREE_USED (copy) = 1;
++  /* The inlined variable is marked as INLINE not to change the location
++     by stack protector.  */
++  if (flag_propolice_protection && TREE_CODE (copy) == VAR_DECL)
++    DECL_COPIED (copy) = 1;
++
+   /* Set the context for the new declaration.  */
+   if (!DECL_CONTEXT (decl))
+     /* Globals stay global.  */
+@@ -1970,6 +1975,12 @@
+             seq = get_insns ();
+             end_sequence ();
++#ifdef ARGS_GROWS_DOWNWARD
++            /* Mark this pointer as the top of the argument
++               block. The pointer minus one is in the block.  */
++            if (flag_propolice_protection && GET_CODE (seq) == SET)
++              RTX_INTEGRATED_P (SET_SRC (seq)) = 1;
++#endif
+             emit_insn_after (seq, map->insns_at_start);
+             return temp;
+           }
+diff -uNr gcc-3.4.3.orig/gcc/libgcc2.c gcc-3.4.3/gcc/libgcc2.c
+--- gcc-3.4.3.orig/gcc/libgcc2.c       2004-09-26 22:47:14.000000000 +0200
++++ gcc-3.4.3/gcc/libgcc2.c    2004-11-24 18:35:31.627669168 +0100
+@@ -1678,3 +1678,124 @@
+ #endif /* no INIT_SECTION_ASM_OP and not CTOR_LISTS_DEFINED_EXTERNALLY */
+ #endif /* L_ctors */
++\f
++#ifdef L_stack_smash_handler
++#ifndef _LIBC_PROVIDES_SSP_
++#include <stdio.h>
++#include <string.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++#ifdef _POSIX_SOURCE
++#include <signal.h>
++#endif
++
++#if defined(HAVE_SYSLOG)
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++
++#include <sys/syslog.h>
++#ifndef _PATH_LOG
++#define _PATH_LOG "/dev/log"
++#endif
++#endif
++
++long __guard[8] = {0, 0, 0, 0, 0, 0, 0, 0};
++static void __guard_setup (void) __attribute__ ((constructor));
++
++static void
++__guard_setup (void)
++{
++  int fd;
++  if (__guard[0] != 0)
++    return;
++  fd = open ("/dev/urandom", 0);
++  if (fd != -1) {
++    ssize_t size = read (fd, (char*)&__guard, sizeof(__guard));
++    close (fd) ;
++    if (size == sizeof(__guard))
++      return;
++  }
++  /* If a random generator can't be used, the protector switches the guard
++     to the "terminator canary".  */
++  ((char*)__guard)[0] = 0;
++  ((char*)__guard)[1] = 0;
++  ((char*)__guard)[2] = '\n';
++  ((char*)__guard)[3] = 255;
++}
++
++extern void __stack_smash_handler (char func[], ATTRIBUTE_UNUSED int damaged);
++void
++__stack_smash_handler (char func[], ATTRIBUTE_UNUSED int damaged)
++{
++#if defined (__GNU_LIBRARY__)
++  extern char * __progname;
++#endif
++  const char message[] = ": stack smashing attack in function ";
++  int bufsz = 256, len;
++  char buf[bufsz];
++#if defined(HAVE_SYSLOG)
++  int log_file;
++  struct sockaddr_un sys_log_addr;  /* AF_UNIX address of local logger.  */
++#endif
++#ifdef _POSIX_SOURCE
++  {
++    sigset_t mask;
++    sigfillset (&mask);
++    /* Block all signal handlers except SIGABRT.  */
++    sigdelset (&mask, SIGABRT);
++    sigprocmask (SIG_BLOCK, &mask, NULL);
++  }
++#endif
++
++  /* send LOG_CRIT.  */
++  strcpy (buf, "<2>"); len=3;
++#if defined (__GNU_LIBRARY__)
++  strncat (buf, __progname, bufsz - len - 1);
++  len = strlen (buf);
++#endif
++  if (bufsz > len)
++    {
++      strncat (buf, message, bufsz - len - 1);
++      len = strlen (buf);
++    }
++  if (bufsz > len)
++    {
++      strncat (buf, func, bufsz - len - 1);
++      len = strlen (buf);
++    }
++
++  /* Print error message.  */
++  write (STDERR_FILENO, buf + 3, len - 3);
++#if defined(HAVE_SYSLOG)
++  if ((log_file = socket (AF_UNIX, SOCK_DGRAM, 0)) != -1)
++    {
++
++    /* Send "found" message to the "/dev/log" path.  */
++    sys_log_addr.sun_family = AF_UNIX;
++    (void)strncpy (sys_log_addr.sun_path, _PATH_LOG,
++                 sizeof (sys_log_addr.sun_path) - 1);
++    sys_log_addr.sun_path[sizeof (sys_log_addr.sun_path) - 1] = '\0';
++    sendto(log_file, buf, len, 0, (struct sockaddr *)&sys_log_addr,
++         sizeof (sys_log_addr));
++  }
++#endif
++
++#ifdef _POSIX_SOURCE
++  {
++    /* Make sure the default handler is associated with SIGABRT.  */
++    struct sigaction sa;
++    
++    memset (&sa, 0, sizeof(struct sigaction));
++    sigfillset (&sa.sa_mask); /* Block all signals.  */
++    sa.sa_flags = 0;
++    sa.sa_handler = SIG_DFL;
++    sigaction (SIGABRT, &sa, NULL);
++    (void)kill (getpid(), SIGABRT);
++  }
++#endif
++  _exit (127);
++}
++#endif /* _LIBC_PROVIDES_SSP_ */
++#endif /* L_stack_smash_handler */
+diff -uNr gcc-3.4.3.orig/gcc/libgcc-std.ver gcc-3.4.3/gcc/libgcc-std.ver
+--- gcc-3.4.3.orig/gcc/libgcc-std.ver  2004-09-01 21:14:33.000000000 +0200
++++ gcc-3.4.3/gcc/libgcc-std.ver       2004-11-24 18:35:31.620670232 +0100
+@@ -174,6 +174,12 @@
+   _Unwind_SjLj_RaiseException
+   _Unwind_SjLj_ForcedUnwind
+   _Unwind_SjLj_Resume
++
++%if !defined(_LIBC_PROVIDES_SSP_)
++  # stack smash handler symbols
++  __guard
++  __stack_smash_handler
++%endif
+ }
+ %inherit GCC_3.3 GCC_3.0
+diff -uNr gcc-3.4.3.orig/gcc/loop.c gcc-3.4.3/gcc/loop.c
+--- gcc-3.4.3.orig/gcc/loop.c  2004-07-13 17:29:08.000000000 +0200
++++ gcc-3.4.3/gcc/loop.c       2004-11-24 18:35:31.680661112 +0100
+@@ -6514,6 +6514,14 @@
+   if (GET_CODE (*mult_val) == USE)
+     *mult_val = XEXP (*mult_val, 0);
++#ifndef FRAME_GROWS_DOWNWARD
++  if (flag_propolice_protection
++      && GET_CODE (*add_val) == PLUS
++      && (XEXP (*add_val, 0) == frame_pointer_rtx
++        || XEXP (*add_val, 1) == frame_pointer_rtx))
++    return 0;
++#endif
++
+   if (is_addr)
+     *pbenefit += address_cost (orig_x, addr_mode) - reg_address_cost;
+   else
+diff -uNr gcc-3.4.3.orig/gcc/Makefile.in gcc-3.4.3/gcc/Makefile.in
+--- gcc-3.4.3.orig/gcc/Makefile.in     2004-11-24 18:04:18.000000000 +0100
++++ gcc-3.4.3/gcc/Makefile.in  2004-11-24 18:35:31.038758696 +0100
+@@ -867,7 +867,7 @@
+  sibcall.o simplify-rtx.o sreal.o stmt.o stor-layout.o stringpool.o      \
+  targhooks.o timevar.o toplev.o tracer.o tree.o tree-dump.o unroll.o     \
+  varasm.o varray.o version.o vmsdbgout.o xcoffout.o alloc-pool.o         \
+- et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o
++ et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o protector.o
+ OBJS-md = $(out_object_file)
+ OBJS-archive = $(EXTRA_OBJS) $(host_hook_obj) hashtable.o tree-inline.o          \
+@@ -1549,7 +1549,7 @@
+    langhooks.h insn-flags.h cfglayout.h real.h cfgloop.h \
+    hosthooks.h $(LANGHOOKS_DEF_H) cgraph.h $(COVERAGE_H) alloc-pool.h
+       $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+-        -DTARGET_NAME=\"$(target_noncanonical)\" \
++        -DTARGET_NAME=\"$(target_noncanonical)\" @ENABLESSP@ \
+         -c $(srcdir)/toplev.c $(OUTPUT_OPTION)
+ main.o : main.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h
+@@ -1852,6 +1852,10 @@
+ params.o : params.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(PARAMS_H) toplev.h
+ hooks.o: hooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(HOOKS_H)
+ pretty-print.o: $(CONFIG_H) $(SYSTEM_H) pretty-print.c $(PRETTY_PRINT_H)
++protector.o : protector.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(TREE_H) \
++   flags.h function.h $(EXPR_H) $(OPTABS_H) $(REGS_H) toplev.h hard-reg-set.h \
++   insn-config.h insn-flags.h $(RECOG_H) output.h toplev.h except.h reload.h \
++   $(TM_P_H) conditions.h $(INSN_ATTR_H) real.h protector.h
+ $(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) $(GGC_H) \
+    $(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \
+diff -uNr gcc-3.4.3.orig/gcc/mklibgcc.in gcc-3.4.3/gcc/mklibgcc.in
+--- gcc-3.4.3.orig/gcc/mklibgcc.in     2004-10-18 18:00:43.000000000 +0200
++++ gcc-3.4.3/gcc/mklibgcc.in  2004-11-24 18:35:31.699658224 +0100
+@@ -57,7 +57,7 @@
+       _enable_execute_stack _trampoline __main _absvsi2 _absvdi2 _addvsi3
+       _addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 _negvsi2 _negvdi2 _ctors
+       _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 _ctzsi2 _ctzdi2 _popcount_tab
+-      _popcountsi2 _popcountdi2 _paritysi2 _paritydi2'
++      _popcountsi2 _popcountdi2 _paritysi2 _paritydi2 _stack_smash_handler'
+ # Disable SHLIB_LINK if shared libgcc not enabled.
+ if [ "@enable_shared@" = "no" ]; then
+diff -uNr gcc-3.4.3.orig/gcc/optabs.c gcc-3.4.3/gcc/optabs.c
+--- gcc-3.4.3.orig/gcc/optabs.c        2004-03-03 01:45:01.000000000 +0100
++++ gcc-3.4.3/gcc/optabs.c     2004-11-24 18:35:31.739652144 +0100
+@@ -678,6 +678,27 @@
+   if (target)
+     target = protect_from_queue (target, 1);
++  /* Keep the frame and offset pattern at the use of stack protection.  */
++  if (flag_propolice_protection
++      && binoptab->code == PLUS
++      && op0 == virtual_stack_vars_rtx
++      && GET_CODE(op1) == CONST_INT)
++    {
++      int icode = (int) binoptab->handlers[(int) mode].insn_code;
++      if (target)
++      temp = target;
++      else
++      temp = gen_reg_rtx (mode);
++
++      if (! (*insn_data[icode].operand[0].predicate) (temp, mode)
++        || GET_CODE (temp) != REG)
++      temp = gen_reg_rtx (mode);
++
++      emit_insn (gen_rtx_SET (VOIDmode, temp,
++                            gen_rtx_PLUS (GET_MODE (op0), op0, op1)));
++      return temp;
++    }
++
+   if (flag_force_mem)
+     {
+       /* Load duplicate non-volatile operands once.  */
+diff -uNr gcc-3.4.3.orig/gcc/opts.c gcc-3.4.3/gcc/opts.c
+--- gcc-3.4.3.orig/gcc/opts.c  2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/opts.c       2004-11-24 18:35:31.762648648 +0100
+@@ -125,6 +125,9 @@
+ bool warn_unused_variable;
+ bool warn_unused_value;
++/* Warn when not issuing stack smashing protection for some reason */
++bool warn_stack_protector;
++
+ /* Hack for cooperation between set_Wunused and set_Wextra.  */
+ static bool maybe_warn_unused_parameter;
+@@ -804,6 +807,10 @@
+       warn_unused_variable = value;
+       break;
++    case OPT_Wstack_protector:
++      warn_stack_protector = value;
++      break;
++
+     case OPT_aux_info:
+     case OPT_aux_info_:
+       aux_info_file_name = arg;
+@@ -1367,6 +1374,14 @@
+       stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
+       break;
++    case OPT_fstack_protector:
++      flag_propolice_protection = value;
++      break;
++
++    case OPT_fstack_protector_all:
++      flag_stack_protection = value;
++      break;
++
+     case OPT_fstrength_reduce:
+       flag_strength_reduce = value;
+       break;
+diff -uNr gcc-3.4.3.orig/gcc/protector.c gcc-3.4.3/gcc/protector.c
+--- gcc-3.4.3.orig/gcc/protector.c     1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/protector.c  2004-09-02 11:36:11.000000000 +0200
+@@ -0,0 +1,2730 @@
++/* RTL buffer overflow protection function for GNU C compiler
++   Copyright (C) 2003 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 2, or (at your option) any later
++version.
++
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING.  If not, write to the Free
++Software Foundation, 59 Temple Place - Suite 330, Boston, MA
++02111-1307, USA.  */
++
++/* This file contains several memory arrangement functions to protect
++   the return address and the frame pointer of the stack
++   from a stack-smashing attack. It also
++   provides the function that protects pointer variables.  */
++
++#include "config.h"
++#include "system.h"
++#include "coretypes.h"
++#include "tm.h"
++#include "machmode.h"
++#include "real.h"
++#include "rtl.h"
++#include "tree.h"
++#include "regs.h"
++#include "flags.h"
++#include "insn-config.h"
++#include "insn-flags.h"
++#include "expr.h"
++#include "output.h"
++#include "recog.h"
++#include "hard-reg-set.h"
++#include "except.h"
++#include "function.h"
++#include "toplev.h"
++#include "tm_p.h"
++#include "conditions.h"
++#include "insn-attr.h"
++#include "optabs.h"
++#include "reload.h"
++#include "protector.h"
++
++
++/* Round a value to the lowest integer less than it that is a multiple of
++   the required alignment.  Avoid using division in case the value is
++   negative.  Assume the alignment is a power of two.  */
++#define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
++
++/* Similar, but round to the next highest integer that meets the
++   alignment.  */
++#define CEIL_ROUND(VALUE,ALIGN)       (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
++
++
++/* Nonzero if function being compiled can define string buffers that may be
++   damaged by the stack-smash attack.  */
++static int current_function_defines_vulnerable_string;
++static int current_function_defines_short_string;
++static int current_function_has_variable_string;
++static int current_function_defines_vsized_array;
++static int current_function_is_inlinable;
++
++/* Nonzero if search_string_def finds the variable which contains an array.  */
++static int is_array;
++
++/* Nonzero if search_string_def finds a byte-pointer variable,
++   which may be assigned to alloca output.  */
++static int may_have_alloca_pointer;
++
++static rtx guard_area, _guard;
++static rtx function_first_insn, prologue_insert_point;
++
++/* Offset to end of sweeped area for gathering character arrays.  */
++static HOST_WIDE_INT sweep_frame_offset;
++
++/* Offset to end of allocated area for instantiating pseudo registers.  */
++static HOST_WIDE_INT push_allocated_offset = 0;
++
++/* Offset to end of assigned area for instantiating pseudo registers.  */
++static HOST_WIDE_INT push_frame_offset = 0;
++
++/* Set to 1 after cse_not_expected becomes nonzero. it is used to identify
++   which stage assign_stack_local_for_pseudo_reg is called from.  */
++static int saved_cse_not_expected = 0;
++
++static int search_string_from_argsandvars (int);
++static int search_string_from_local_vars (tree);
++static int search_pointer_def (tree);
++static int search_func_pointer (tree);
++static int check_used_flag (rtx);
++static void reset_used_flags_for_insns (rtx);
++static void reset_used_flags_for_decls (tree);
++static void reset_used_flags_of_plus (rtx);
++static void rtl_prologue (rtx);
++static void rtl_epilogue (rtx);
++static void arrange_var_order (tree);
++static void copy_args_for_protection (void);
++static void sweep_string_variable (rtx, HOST_WIDE_INT);
++static void sweep_string_in_decls (tree, HOST_WIDE_INT, HOST_WIDE_INT);
++static void sweep_string_in_args (tree, HOST_WIDE_INT, HOST_WIDE_INT);
++static void sweep_string_use_of_insns (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
++static void sweep_string_in_operand (rtx, rtx *, HOST_WIDE_INT, HOST_WIDE_INT);
++static void move_arg_location (rtx, rtx, rtx, HOST_WIDE_INT);
++static void change_arg_use_of_insns (rtx, rtx, rtx *, HOST_WIDE_INT);
++static void change_arg_use_in_operand (rtx, rtx, rtx, rtx *, HOST_WIDE_INT);
++static void validate_insns_of_varrefs (rtx);
++static void validate_operand_of_varrefs (rtx, rtx *);
++
++/* Specify which size of buffers should be protected from a stack smashing
++   attack. Because small buffers are not used in situations which may
++   overflow buffer, the default size sets to the size of 64 bit register.  */
++#ifndef SUSPICIOUS_BUF_SIZE
++#define SUSPICIOUS_BUF_SIZE 8
++#endif
++
++#define AUTO_BASEPTR(X) \
++  (GET_CODE (X) == PLUS ? XEXP (X, 0) : X)
++#define AUTO_OFFSET(X) \
++  (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
++#undef PARM_PASSED_IN_MEMORY
++#define PARM_PASSED_IN_MEMORY(PARM) \
++ (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
++#define TREE_VISITED(NODE) ((NODE)->common.unused_0)
++
++/* Argument values for calling search_string_from_argsandvars.  */
++#define CALL_FROM_PREPARE_STACK_PROTECTION    0
++#define CALL_FROM_PUSH_FRAME                  1
++
++
++/* Prepare several stack protection instruments for the current function
++   if the function has an array as a local variable, which may be vulnerable
++   from a stack smashing attack, and it is not inlinable.
++
++   The overall steps are as follows;
++   (1)search an array,
++   (2)insert guard_area on the stack,
++   (3)duplicate pointer arguments into local variables, and
++   (4)arrange the location of local variables.  */
++void
++prepare_stack_protection (int inlinable)
++{
++  tree blocks = DECL_INITIAL (current_function_decl);
++  current_function_is_inlinable = inlinable && !flag_no_inline;
++  push_frame_offset = push_allocated_offset = 0;
++  saved_cse_not_expected = 0;
++
++  /* Skip the protection if the function has no block
++    or it is an inline function.  */
++  if (current_function_is_inlinable)
++    validate_insns_of_varrefs (get_insns ());
++  if (! blocks || current_function_is_inlinable)
++    return;
++
++  current_function_defines_vulnerable_string
++    = search_string_from_argsandvars (CALL_FROM_PREPARE_STACK_PROTECTION);
++
++  if (current_function_defines_vulnerable_string
++      || flag_stack_protection)
++    {
++      function_first_insn = get_insns ();
++
++      if (current_function_contains_functions)
++      {
++        if (warn_stack_protector)
++          warning ("not protecting function: it contains functions");
++        return;
++      }
++
++      /* Initialize recognition, indicating that volatile is OK.  */
++      init_recog ();
++
++      sweep_frame_offset = 0;
++      
++#ifdef STACK_GROWS_DOWNWARD
++      /* frame_offset: offset to end of allocated area of stack frame.
++       It is defined in the function.c.  */
++
++      /* the location must be before buffers.  */
++      guard_area = assign_stack_local (BLKmode, UNITS_PER_GUARD, -1);
++      PUT_MODE (guard_area, GUARD_m);
++      MEM_VOLATILE_P (guard_area) = 1;
++
++#ifndef FRAME_GROWS_DOWNWARD
++      sweep_frame_offset = frame_offset;
++#endif
++
++      /* For making room for guard value, scan all insns and fix the offset
++       address of the variable that is based on frame pointer.
++       Scan all declarations of variables and fix the offset address
++       of the variable that is based on the frame pointer.  */
++      sweep_string_variable (guard_area, UNITS_PER_GUARD);
++
++      
++      /* the location of guard area moves to the beginning of stack frame.  */
++      if (AUTO_OFFSET(XEXP (guard_area, 0)))
++      XEXP (XEXP (guard_area, 0), 1)
++        = gen_rtx_CONST_INT (VOIDmode, sweep_frame_offset);
++
++
++      /* Insert prologue rtl instructions.  */
++      rtl_prologue (function_first_insn);
++
++      if (! current_function_has_variable_string)
++      {
++        /* Generate argument saving instruction.  */
++        copy_args_for_protection ();
++
++#ifndef FRAME_GROWS_DOWNWARD
++        /* If frame grows upward, character arrays for protecting args
++           may copy to the top of the guard variable.
++           So sweep the guard variable again.  */
++        sweep_frame_offset = CEIL_ROUND (frame_offset,
++                                         BIGGEST_ALIGNMENT / BITS_PER_UNIT);
++        sweep_string_variable (guard_area, UNITS_PER_GUARD);
++#endif
++      }
++      /* Variable can't be protected from the overflow of variable length
++       buffer. But variable reordering is still effective against
++       the overflow of fixed size character arrays.  */
++      else if (warn_stack_protector)
++      warning ("not protecting variables: it has a variable length buffer");
++#endif
++#ifndef FRAME_GROWS_DOWNWARD
++      if (STARTING_FRAME_OFFSET == 0)
++      {
++        /* This part may be only for alpha.  */
++        push_allocated_offset = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
++        assign_stack_local (BLKmode, push_allocated_offset, -1);
++        sweep_frame_offset = frame_offset;
++        sweep_string_variable (const0_rtx, -push_allocated_offset);
++        sweep_frame_offset = AUTO_OFFSET (XEXP (guard_area, 0));
++      }
++#endif
++
++      /* Arrange the order of local variables.  */
++      arrange_var_order (blocks);
++
++#ifdef STACK_GROWS_DOWNWARD
++      /* Insert epilogue rtl instructions.  */
++      rtl_epilogue (get_last_insn ());
++#endif
++      init_recog_no_volatile ();
++    }
++  else if (current_function_defines_short_string
++         && warn_stack_protector)
++    warning ("not protecting function: buffer is less than %d bytes long",
++           SUSPICIOUS_BUF_SIZE);
++}
++
++/*
++  Search string from arguments and local variables.
++   caller: CALL_FROM_PREPARE_STACK_PROTECTION (0)
++         CALL_FROM_PUSH_FRAME (1)
++*/
++static int
++search_string_from_argsandvars (int caller)
++{
++  tree blocks, parms;
++  int string_p;
++
++  /* Saves a latest search result as a cached infomation.  */
++  static tree __latest_search_decl = 0;
++  static int  __latest_search_result = FALSE;
++
++  if (__latest_search_decl == current_function_decl)
++    return __latest_search_result;
++  else
++    if (caller == CALL_FROM_PUSH_FRAME)
++      return FALSE;
++
++  __latest_search_decl = current_function_decl;
++  __latest_search_result = TRUE;
++  
++  current_function_defines_short_string = FALSE;
++  current_function_has_variable_string = FALSE;
++  current_function_defines_vsized_array = FALSE;
++  may_have_alloca_pointer = FALSE;
++
++  /* Search a string variable from local variables.  */
++  blocks = DECL_INITIAL (current_function_decl);
++  string_p = search_string_from_local_vars (blocks);
++
++  if (! current_function_defines_vsized_array
++      && may_have_alloca_pointer
++      && current_function_calls_alloca)
++    {
++      current_function_has_variable_string = TRUE;
++      return TRUE;
++    }
++
++  if (string_p)
++    return TRUE;
++
++#ifdef STACK_GROWS_DOWNWARD
++  /* Search a string variable from arguments.  */
++  parms = DECL_ARGUMENTS (current_function_decl);
++
++  for (; parms; parms = TREE_CHAIN (parms))
++    if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
++      {
++      if (PARM_PASSED_IN_MEMORY (parms))
++        {
++          string_p = search_string_def (TREE_TYPE(parms));
++          if (string_p)
++            return TRUE;
++        }
++      }
++#endif
++
++  __latest_search_result = FALSE;
++  return FALSE;
++}
++
++
++/* Search string from local variables in the specified scope.  */
++static int
++search_string_from_local_vars (tree block)
++{
++  tree types;
++  int found = FALSE;
++
++  while (block && TREE_CODE(block)==BLOCK)
++    {
++      for (types = BLOCK_VARS(block); types; types = TREE_CHAIN(types))
++      {
++        /* Skip the declaration that refers an external variable.  */
++        /* name: types.decl.name.identifier.id                     */
++        if (! DECL_EXTERNAL (types) && ! TREE_STATIC (types)
++            && TREE_CODE (types) == VAR_DECL
++            && ! DECL_ARTIFICIAL (types)
++            && DECL_RTL_SET_P (types)
++            && GET_CODE (DECL_RTL (types)) == MEM
++
++            && search_string_def (TREE_TYPE (types)))
++          {
++            rtx home = DECL_RTL (types);
++
++            if (GET_CODE (home) == MEM
++                && (GET_CODE (XEXP (home, 0)) == MEM
++                    || (GET_CODE (XEXP (home, 0)) == REG
++                        && XEXP (home, 0) != virtual_stack_vars_rtx
++                        && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
++                        && REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
++#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
++                        && REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
++#endif
++                        )))
++              /* If the value is indirect by memory or by a register
++                 that isn't the frame pointer then it means the object is
++                 variable-sized and address through
++                 that register or stack slot.
++                 The protection has no way to hide pointer variables
++                 behind the array, so all we can do is staying
++                 the order of variables and arguments.  */
++              {
++                current_function_has_variable_string = TRUE;
++              }
++          
++            /* Found character array.  */
++            found = TRUE;
++          }
++      }
++
++      if (search_string_from_local_vars (BLOCK_SUBBLOCKS (block)))
++      {
++        found = TRUE;
++      }
++
++      block = BLOCK_CHAIN (block);
++    }
++    
++  return found;
++}
++
++
++/* Search a character array from the specified type tree.  */
++int
++search_string_def (tree type)
++{
++  tree tem;
++    
++  if (! type)
++    return FALSE;
++
++  switch (TREE_CODE (type))
++    {
++    case ARRAY_TYPE:
++      /* Check if the array is a variable-sized array.  */
++      if (TYPE_DOMAIN (type) == 0
++        || (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != 0
++            && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) == NOP_EXPR))
++      current_function_defines_vsized_array = TRUE;
++
++      /* Check if the array is related to char array.  */
++      if (TYPE_MAIN_VARIANT (TREE_TYPE(type)) == char_type_node
++        || TYPE_MAIN_VARIANT (TREE_TYPE(type)) == signed_char_type_node
++        || TYPE_MAIN_VARIANT (TREE_TYPE(type)) == unsigned_char_type_node)
++      {
++        /* Check if the string is a variable string.  */
++        if (TYPE_DOMAIN (type) == 0
++            || (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != 0
++                && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) == NOP_EXPR))
++          return TRUE;
++
++        /* Check if the string size is greater than SUSPICIOUS_BUF_SIZE.  */
++        if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != 0
++            && (TREE_INT_CST_LOW(TYPE_MAX_VALUE(TYPE_DOMAIN(type)))+1
++                >= SUSPICIOUS_BUF_SIZE))
++          return TRUE;
++
++        current_function_defines_short_string = TRUE;
++      }
++      
++      /* to protect every functions, sweep any arrays to the frame top.  */
++      is_array = TRUE;
++
++      return search_string_def(TREE_TYPE(type));
++      
++    case UNION_TYPE:
++    case QUAL_UNION_TYPE:
++    case RECORD_TYPE:
++      /* Check if each field has character arrays.  */
++      for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
++      {
++        /* Omit here local type decls until we know how to support them. */
++        if ((TREE_CODE (tem) == TYPE_DECL)
++            || (TREE_CODE (tem) == VAR_DECL && TREE_STATIC (tem)))
++          continue;
++
++        if (search_string_def(TREE_TYPE(tem)))
++          return TRUE;
++      }
++      break;
++      
++    case POINTER_TYPE:
++      /* Check if pointer variables, which may be a pointer assigned 
++       by alloca function call, are declared.  */
++      if (TYPE_MAIN_VARIANT (TREE_TYPE(type)) == char_type_node
++        || TYPE_MAIN_VARIANT (TREE_TYPE(type)) == signed_char_type_node
++        || TYPE_MAIN_VARIANT (TREE_TYPE(type)) == unsigned_char_type_node)
++      may_have_alloca_pointer = TRUE;
++      break;
++
++    case REFERENCE_TYPE:
++    case OFFSET_TYPE:
++    default:
++      break;
++    }
++
++  return FALSE;
++}
++
++
++/* Examine whether the input contains frame pointer addressing.  */
++int
++contains_fp (rtx op)
++{
++  enum rtx_code code;
++  rtx x;
++  int i, j;
++  const char *fmt;
++
++  x = op;
++  if (x == 0)
++    return FALSE;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case REG:
++    case ADDRESSOF:
++      return FALSE;
++
++    case MEM:
++      /* This case is not generated at the stack protection.
++       see plus_constant_wide and simplify_plus_minus function.  */
++      if (XEXP (x, 0) == virtual_stack_vars_rtx)
++      abort ();
++      
++    case PLUS:
++      if (XEXP (x, 0) == virtual_stack_vars_rtx
++        && GET_CODE (XEXP (x, 1)) == CONST_INT)
++      return TRUE;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      {
++      if (contains_fp (XEXP (x, i)))
++        return TRUE;
++      }
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      if (contains_fp (XVECEXP (x, i, j)))
++        return TRUE;
++
++  return FALSE;
++}
++
++
++/* Examine whether the input contains any pointer.  */
++static int
++search_pointer_def (tree type)
++{
++  tree tem;
++    
++  if (! type)
++    return FALSE;
++
++  switch (TREE_CODE (type))
++    {
++    case UNION_TYPE:
++    case QUAL_UNION_TYPE:
++    case RECORD_TYPE:
++      /* Check if each field has a pointer.  */
++      for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
++      {
++        if ((TREE_CODE (tem) == TYPE_DECL)
++            || (TREE_CODE (tem) == VAR_DECL && TREE_STATIC (tem)))
++          continue;
++
++        if (search_pointer_def (TREE_TYPE(tem)))
++          return TRUE;
++      }
++      break;
++
++    case ARRAY_TYPE:
++      return search_pointer_def (TREE_TYPE(type));
++      
++    case POINTER_TYPE:
++    case REFERENCE_TYPE:
++    case OFFSET_TYPE:
++      if (TYPE_READONLY (TREE_TYPE (type)))
++      {
++        /* If this pointer contains function pointer,
++           it should be protected.  */
++        return search_func_pointer (TREE_TYPE (type));
++      }
++      return TRUE;
++      
++    default:
++      break;
++    }
++
++  return FALSE;
++}
++
++
++/* Examine whether the input contains function pointer.  */
++static int
++search_func_pointer (tree type)
++{
++  tree tem;
++    
++  if (! type)
++    return FALSE;
++
++  switch (TREE_CODE (type))
++    {
++    case UNION_TYPE:
++    case QUAL_UNION_TYPE:
++    case RECORD_TYPE:
++      if (! TREE_VISITED (type))
++        {
++          /* Mark the type as having been visited already.  */
++          TREE_VISITED (type) = 1;
++
++          /* Check if each field has a function pointer.  */
++          for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
++            {
++              if (TREE_CODE (tem) == FIELD_DECL
++                  && search_func_pointer (TREE_TYPE(tem)))
++                {
++                  TREE_VISITED (type) = 0;
++                  return TRUE;
++                }
++            }
++          
++          TREE_VISITED (type) = 0;
++        }
++      break;
++
++    case ARRAY_TYPE:
++      return search_func_pointer (TREE_TYPE(type));
++      
++    case POINTER_TYPE:
++    case REFERENCE_TYPE:
++    case OFFSET_TYPE:
++      if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
++      return TRUE;
++      return search_func_pointer (TREE_TYPE(type));
++      
++    default:
++      break;
++    }
++
++  return FALSE;
++}
++
++
++/* Check whether the specified rtx contains PLUS rtx with used flag.  */
++static int
++check_used_flag (rtx x)
++{
++  register int i, j;
++  register enum rtx_code code;
++  register const char *format_ptr;
++
++  if (x == 0)
++    return FALSE;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case REG:
++    case QUEUED:
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++      return FALSE;
++
++    case PLUS:
++      if (x->used)
++      return TRUE;
++
++    default:
++      break;
++    }
++
++  format_ptr = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++)
++    {
++      switch (*format_ptr++)
++      {
++      case 'e':
++        if (check_used_flag (XEXP (x, i)))
++          return TRUE;
++        break;
++
++      case 'E':
++        for (j = 0; j < XVECLEN (x, i); j++)
++          if (check_used_flag (XVECEXP (x, i, j)))
++            return TRUE;
++        break;
++      }
++    }
++
++  return FALSE;
++}
++
++
++/* Reset used flag of every insns after the spcecified insn.  */
++static void
++reset_used_flags_for_insns (rtx insn)
++{
++  int i, j;
++  enum rtx_code code;
++  const char *format_ptr;
++
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++      || GET_CODE (insn) == CALL_INSN)
++      {
++      code = GET_CODE (insn);
++      insn->used = 0;
++      format_ptr = GET_RTX_FORMAT (code);
++
++      for (i = 0; i < GET_RTX_LENGTH (code); i++)
++        {
++          switch (*format_ptr++)
++            {
++            case 'e':
++              reset_used_flags_of_plus (XEXP (insn, i));
++              break;
++                      
++            case 'E':
++              for (j = 0; j < XVECLEN (insn, i); j++)
++                reset_used_flags_of_plus (XVECEXP (insn, i, j));
++              break;
++            }
++        }
++      }
++}
++
++
++/* Reset used flag of every variables in the specified block.  */
++static void
++reset_used_flags_for_decls (tree block)
++{
++  tree types;
++  rtx home;
++
++  while (block && TREE_CODE(block)==BLOCK)
++    {
++      types = BLOCK_VARS(block);
++      
++      for (types= BLOCK_VARS(block); types; types = TREE_CHAIN(types))
++      {
++        /* Skip the declaration that refers an external variable and
++           also skip an global variable.  */
++        if (! DECL_EXTERNAL (types))
++          {
++            if (! DECL_RTL_SET_P (types))
++              continue;
++            home = DECL_RTL (types);
++
++            if (GET_CODE (home) == MEM
++                && GET_CODE (XEXP (home, 0)) == PLUS
++                && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
++              {
++                XEXP (home, 0)->used = 0;
++              }
++          }
++      }
++
++      reset_used_flags_for_decls (BLOCK_SUBBLOCKS (block));
++
++      block = BLOCK_CHAIN (block);
++    }
++}
++
++
++/* Reset the used flag of every PLUS rtx derived from the specified rtx.  */
++static void
++reset_used_flags_of_plus (rtx x)
++{
++  int i, j;
++  enum rtx_code code;
++  const char *format_ptr;
++
++  if (x == 0)
++    return;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++      /* These types may be freely shared so we needn't do any resetting
++       for them.  */
++    case REG:
++    case QUEUED:
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++      return;
++
++    case INSN:
++    case JUMP_INSN:
++    case CALL_INSN:
++    case NOTE:
++    case LABEL_REF:
++    case BARRIER:
++      /* The chain of insns is not being copied.  */
++      return;
++      
++    case PLUS:
++      x->used = 0;
++      break;
++
++    case CALL_PLACEHOLDER:
++      reset_used_flags_for_insns (XEXP (x, 0));
++      reset_used_flags_for_insns (XEXP (x, 1));
++      reset_used_flags_for_insns (XEXP (x, 2));
++      break;
++
++    default:
++      break;
++    }
++
++  format_ptr = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++)
++    {
++      switch (*format_ptr++)
++      {
++      case 'e':
++        reset_used_flags_of_plus (XEXP (x, i));
++        break;
++
++      case 'E':
++        for (j = 0; j < XVECLEN (x, i); j++)
++          reset_used_flags_of_plus (XVECEXP (x, i, j));
++        break;
++      }
++    }
++}
++
++
++/* Generate the prologue insns of the protector into the specified insn.  */
++static void
++rtl_prologue (rtx insn)
++{
++#if defined(INIT_SECTION_ASM_OP) && !defined(INVOKE__main)
++#undef HAS_INIT_SECTION
++#define HAS_INIT_SECTION
++#endif
++
++  rtx _val;
++
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == NOTE
++      && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG)
++      break;
++  
++#if !defined (HAS_INIT_SECTION)
++  /* If this function is `main', skip a call to `__main'
++     to run guard instruments after global initializers, etc.  */
++  if (DECL_NAME (current_function_decl)
++      && MAIN_NAME_P (DECL_NAME (current_function_decl))
++      && DECL_CONTEXT (current_function_decl) == NULL_TREE)
++    {
++      rtx fbinsn = insn;
++      for (; insn; insn = NEXT_INSN (insn))
++      if (GET_CODE (insn) == NOTE
++          && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
++        break;
++      if (insn == 0)
++      insn = fbinsn;
++    }
++#endif
++
++  /* Mark the next insn of FUNCTION_BEG insn.  */
++  prologue_insert_point = NEXT_INSN (insn);
++              
++  start_sequence ();
++
++  _guard = gen_rtx_MEM (GUARD_m, gen_rtx_SYMBOL_REF (Pmode, "__guard"));
++  emit_move_insn ( guard_area, _guard);
++
++  _val = get_insns ();
++  end_sequence ();
++
++  emit_insn_before (_val, prologue_insert_point);
++}
++
++
++/* Generate the epilogue insns of the protector into the specified insn.  */
++static void
++rtl_epilogue (rtx insn)
++{
++  rtx if_false_label;
++  rtx _val;
++  rtx funcname;
++  tree funcstr;
++  int  flag_have_return = FALSE;
++              
++  start_sequence ();
++
++#ifdef HAVE_return
++  if (HAVE_return)
++    {
++      rtx insn;
++      return_label = gen_label_rtx ();
++      
++      for (insn = prologue_insert_point; insn; insn = NEXT_INSN (insn))
++      if (GET_CODE (insn) == JUMP_INSN
++          && GET_CODE (PATTERN (insn)) == RETURN
++          && GET_MODE (PATTERN (insn)) == VOIDmode)
++        {
++          rtx pat = gen_rtx_SET (VOIDmode,
++                                 pc_rtx,
++                                 gen_rtx_LABEL_REF (VOIDmode,
++                                                    return_label));
++          PATTERN (insn) = pat;
++          flag_have_return = TRUE;
++        }
++
++
++      emit_label (return_label);
++    }
++#endif
++
++  /*                                          if (guard_area != _guard) */
++  compare_from_rtx (guard_area, _guard, NE, 0, GUARD_m, NULL_RTX);
++
++  if_false_label = gen_label_rtx ();          /* { */
++  emit_jump_insn ( gen_beq(if_false_label));
++
++  /* generate string for the current function name */
++  funcstr = build_string (strlen(current_function_name ())+1,
++                        current_function_name ());
++  TREE_TYPE (funcstr) = build_array_type (char_type_node, 0);
++  funcname = output_constant_def (funcstr, 1);
++
++  emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__stack_smash_handler"),
++                   0, VOIDmode, 2,
++                     XEXP (funcname, 0), Pmode, guard_area, GUARD_m);
++
++  /* generate RTL to return from the current function */
++              
++  emit_barrier ();                            /* } */
++  emit_label (if_false_label);
++
++  /* generate RTL to return from the current function */
++  if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
++    use_return_register ();
++
++#ifdef HAVE_return
++  if (HAVE_return && flag_have_return)
++    {
++      emit_jump_insn (gen_return ());
++      emit_barrier ();
++    }
++#endif
++  
++  _val = get_insns ();
++  end_sequence ();
++
++  emit_insn_after (_val, insn);
++}
++
++
++/* For every variable which type is character array, moves its location
++   in the stack frame to the sweep_frame_offset position.  */
++static void
++arrange_var_order (tree block)
++{
++  tree types;
++  HOST_WIDE_INT offset;
++    
++  while (block && TREE_CODE(block)==BLOCK)
++    {
++      /* arrange the location of character arrays in depth first.  */
++      arrange_var_order (BLOCK_SUBBLOCKS (block));
++      
++      for (types = BLOCK_VARS (block); types; types = TREE_CHAIN(types))
++      {
++        /* Skip the declaration that refers an external variable.  */
++        if (! DECL_EXTERNAL (types) && ! TREE_STATIC (types)
++            && TREE_CODE (types) == VAR_DECL
++            && ! DECL_ARTIFICIAL (types)
++            && DECL_RTL_SET_P (types)
++            && GET_CODE (DECL_RTL (types)) == MEM
++            && GET_MODE (DECL_RTL (types)) == BLKmode
++
++            && (is_array=0,
++                search_string_def (TREE_TYPE (types))
++                || (! current_function_defines_vulnerable_string && is_array)))
++          {
++            rtx home = DECL_RTL (types);
++
++            if (!(GET_CODE (home) == MEM
++                  && (GET_CODE (XEXP (home, 0)) == MEM
++                      || (GET_CODE (XEXP (home, 0)) == REG
++                          && XEXP (home, 0) != virtual_stack_vars_rtx
++                          && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
++                          && REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
++#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
++                          && REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
++#endif
++                          ))))
++              {
++                /* Found a string variable.  */
++                HOST_WIDE_INT var_size =
++                  ((TREE_INT_CST_LOW (DECL_SIZE (types)) + BITS_PER_UNIT - 1)
++                   / BITS_PER_UNIT);
++
++                /* Confirmed it is BLKmode.  */
++                int alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
++                var_size = CEIL_ROUND (var_size, alignment);
++
++                /* Skip the variable if it is top of the region
++                   specified by sweep_frame_offset.  */
++                offset = AUTO_OFFSET (XEXP (DECL_RTL (types), 0));
++                if (offset == sweep_frame_offset - var_size)
++                  sweep_frame_offset -= var_size;
++                    
++                else if (offset < sweep_frame_offset - var_size)
++                  sweep_string_variable (DECL_RTL (types), var_size);
++              }
++          }
++      }
++
++      block = BLOCK_CHAIN (block);
++    }
++}
++
++
++/* To protect every pointer argument and move character arrays in the argument,
++   Copy those variables to the top of the stack frame and move the location of
++   character arrays to the posion of sweep_frame_offset.  */
++static void
++copy_args_for_protection (void)
++{
++  tree parms = DECL_ARGUMENTS (current_function_decl);
++  rtx temp_rtx;
++
++  parms = DECL_ARGUMENTS (current_function_decl);
++  for (; parms; parms = TREE_CHAIN (parms))
++    if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
++      {
++      if (PARM_PASSED_IN_MEMORY (parms) && DECL_NAME (parms))
++        {
++          int string_p;
++          rtx seq;
++
++          string_p = search_string_def (TREE_TYPE(parms));
++
++          /* Check if it is a candidate to move.  */
++          if (string_p || search_pointer_def (TREE_TYPE (parms)))
++            {
++              int arg_size
++                = ((TREE_INT_CST_LOW (DECL_SIZE (parms)) + BITS_PER_UNIT - 1)
++                   / BITS_PER_UNIT);
++              tree passed_type = DECL_ARG_TYPE (parms);
++              tree nominal_type = TREE_TYPE (parms);
++              
++              start_sequence ();
++
++              if (GET_CODE (DECL_RTL (parms)) == REG)
++                {
++                  rtx safe = 0;
++                  
++                  change_arg_use_of_insns (prologue_insert_point,
++                                           DECL_RTL (parms), &safe, 0);
++                  if (safe)
++                    {
++                      /* Generate codes for copying the content.  */
++                      rtx movinsn = emit_move_insn (safe, DECL_RTL (parms));
++                  
++                      /* Avoid register elimination in gcse.c.  */
++                      PATTERN (movinsn)->volatil = 1;
++                      
++                      /* Save debugger info.  */
++                      SET_DECL_RTL (parms, safe);
++                    }
++                }
++              else if (GET_CODE (DECL_RTL (parms)) == MEM
++                       && GET_CODE (XEXP (DECL_RTL (parms), 0)) == ADDRESSOF)
++                {
++                  rtx movinsn;
++                  rtx safe = gen_reg_rtx (GET_MODE (DECL_RTL (parms)));
++
++                  /* Generate codes for copying the content.  */
++                  movinsn = emit_move_insn (safe, DECL_INCOMING_RTL (parms));
++                  /* Avoid register elimination in gcse.c.  */
++                  PATTERN (movinsn)->volatil = 1;
++
++                  /* Change the addressof information to the newly
++                     allocated pseudo register.  */
++                  emit_move_insn (DECL_RTL (parms), safe);
++
++                  /* Save debugger info.  */
++                  SET_DECL_RTL (parms, safe);
++                }
++                      
++              /* See if the frontend wants to pass this by invisible
++                 reference.  */
++              else if (passed_type != nominal_type
++                       && POINTER_TYPE_P (passed_type)
++                       && TREE_TYPE (passed_type) == nominal_type)
++                {
++                  rtx safe = 0, orig = XEXP (DECL_RTL (parms), 0);
++
++                  change_arg_use_of_insns (prologue_insert_point,
++                                           orig, &safe, 0);
++                  if (safe)
++                    {
++                      /* Generate codes for copying the content.  */
++                      rtx movinsn = emit_move_insn (safe, orig);
++                  
++                      /* Avoid register elimination in gcse.c  */
++                      PATTERN (movinsn)->volatil = 1;
++                      
++                      /* Save debugger info.  */
++                      SET_DECL_RTL (parms, safe);
++                    }
++                }
++
++              else
++                {
++                  /* Declare temporary local variable for parms.  */
++                  temp_rtx
++                    = assign_stack_local (DECL_MODE (parms), arg_size,
++                                          DECL_MODE (parms) == BLKmode ?
++                                          -1 : 0);
++                  
++                  MEM_IN_STRUCT_P (temp_rtx)
++                    = AGGREGATE_TYPE_P (TREE_TYPE (parms));
++                  set_mem_alias_set (temp_rtx, get_alias_set (parms));
++
++                  /* Generate codes for copying the content.  */
++                  store_expr (parms, temp_rtx, 0);
++
++                  /* Change the reference for each instructions.  */
++                  move_arg_location (prologue_insert_point, DECL_RTL (parms),
++                                     temp_rtx, arg_size);
++
++                  /* Change the location of parms variable.  */
++                  SET_DECL_RTL (parms, temp_rtx);
++                }
++
++              seq = get_insns ();
++              end_sequence ();
++              emit_insn_before (seq, prologue_insert_point);
++
++#ifdef FRAME_GROWS_DOWNWARD
++              /* Process the string argument.  */
++              if (string_p && DECL_MODE (parms) == BLKmode)
++                {
++                  int alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
++                  arg_size = CEIL_ROUND (arg_size, alignment);
++                      
++                  /* Change the reference for each instructions.  */
++                  sweep_string_variable (DECL_RTL (parms), arg_size);
++                }
++#endif
++            }
++        }
++      }
++}
++
++
++/* Sweep a string variable to the positon of sweep_frame_offset in the 
++   stack frame, that is a last position of string variables.  */
++static void
++sweep_string_variable (rtx sweep_var, HOST_WIDE_INT var_size)
++{
++  HOST_WIDE_INT sweep_offset;
++
++  switch (GET_CODE (sweep_var))
++    {
++    case MEM:
++      if (GET_CODE (XEXP (sweep_var, 0)) == ADDRESSOF
++        && GET_CODE (XEXP (XEXP (sweep_var, 0), 0)) == REG)
++      return;
++      sweep_offset = AUTO_OFFSET(XEXP (sweep_var, 0));
++      break;
++    case CONST_INT:
++      sweep_offset = INTVAL (sweep_var);
++      break;
++    default:
++      abort ();
++    }
++
++  /* Scan all declarations of variables and fix the offset address of
++     the variable based on the frame pointer.  */
++  sweep_string_in_decls (DECL_INITIAL (current_function_decl),
++                       sweep_offset, var_size);
++
++  /* Scan all argument variable and fix the offset address based on
++     the frame pointer.  */
++  sweep_string_in_args (DECL_ARGUMENTS (current_function_decl),
++                      sweep_offset, var_size);
++
++  /* For making room for sweep variable, scan all insns and
++     fix the offset address of the variable that is based on frame pointer.  */
++  sweep_string_use_of_insns (function_first_insn, sweep_offset, var_size);
++
++
++  /* Clear all the USED bits in operands of all insns and declarations of
++     local variables.  */
++  reset_used_flags_for_decls (DECL_INITIAL (current_function_decl));
++  reset_used_flags_for_insns (function_first_insn);
++
++  sweep_frame_offset -= var_size;
++}
++
++
++
++/* Move an argument to the local variable addressed by frame_offset.  */
++static void
++move_arg_location (rtx insn, rtx orig, rtx new, HOST_WIDE_INT var_size)
++{
++  /* For making room for sweep variable, scan all insns and
++     fix the offset address of the variable that is based on frame pointer.  */
++  change_arg_use_of_insns (insn, orig, &new, var_size);
++
++
++  /* Clear all the USED bits in operands of all insns and declarations
++     of local variables.  */
++  reset_used_flags_for_insns (insn);
++}
++
++
++/* Sweep character arrays declared as local variable.  */
++static void
++sweep_string_in_decls (tree block, HOST_WIDE_INT sweep_offset,
++                     HOST_WIDE_INT sweep_size)
++{
++  tree types;
++  HOST_WIDE_INT offset;
++  rtx home;
++
++  while (block && TREE_CODE(block)==BLOCK)
++    {
++      for (types = BLOCK_VARS(block); types; types = TREE_CHAIN(types))
++      {
++        /* Skip the declaration that refers an external variable and
++           also skip an global variable.  */
++        if (! DECL_EXTERNAL (types) && ! TREE_STATIC (types)) {
++          
++          if (! DECL_RTL_SET_P (types))
++            continue;
++
++          home = DECL_RTL (types);
++
++          /* Process for static local variable.  */
++          if (GET_CODE (home) == MEM
++              && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
++            continue;
++
++          if (GET_CODE (home) == MEM
++              && XEXP (home, 0) == virtual_stack_vars_rtx)
++            {
++              offset = 0;
++              
++              /* the operand related to the sweep variable.  */
++              if (sweep_offset <= offset
++                  && offset < sweep_offset + sweep_size)
++                {
++                  offset = sweep_frame_offset - sweep_size - sweep_offset;
++
++                  XEXP (home, 0) = plus_constant (virtual_stack_vars_rtx,
++                                                  offset);
++                  XEXP (home, 0)->used = 1;
++                }
++              else if (sweep_offset <= offset
++                       && offset < sweep_frame_offset)
++                {
++                  /* the rest of variables under sweep_frame_offset,
++                     shift the location.  */
++                  XEXP (home, 0) = plus_constant (virtual_stack_vars_rtx,
++                                                  -sweep_size);
++                  XEXP (home, 0)->used = 1;
++                }
++            }
++              
++          if (GET_CODE (home) == MEM
++              && GET_CODE (XEXP (home, 0)) == MEM)
++            {
++              /* Process for dynamically allocated array.  */
++              home = XEXP (home, 0);
++            }
++              
++          if (GET_CODE (home) == MEM
++              && GET_CODE (XEXP (home, 0)) == PLUS
++              && XEXP (XEXP (home, 0), 0) == virtual_stack_vars_rtx
++              && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
++            {
++              if (! XEXP (home, 0)->used)
++                {
++                  offset = AUTO_OFFSET(XEXP (home, 0));
++
++                  /* the operand related to the sweep variable.  */
++                  if (sweep_offset <= offset
++                      && offset < sweep_offset + sweep_size)
++                    {
++
++                      offset
++                        += sweep_frame_offset - sweep_size - sweep_offset;
++                      XEXP (XEXP (home, 0), 1) = gen_rtx_CONST_INT (VOIDmode,
++                                                                    offset);
++
++                      /* mark */
++                      XEXP (home, 0)->used = 1;
++                    }
++                  else if (sweep_offset <= offset
++                           && offset < sweep_frame_offset)
++                    {
++                      /* the rest of variables under sweep_frame_offset,
++                         so shift the location.  */
++
++                      XEXP (XEXP (home, 0), 1)
++                        = gen_rtx_CONST_INT (VOIDmode, offset - sweep_size);
++
++                      /* mark */
++                      XEXP (home, 0)->used = 1;
++                    }
++                }
++            }
++        }
++      }
++
++      sweep_string_in_decls (BLOCK_SUBBLOCKS (block),
++                           sweep_offset, sweep_size);
++
++      block = BLOCK_CHAIN (block);
++    }
++}
++
++
++/* Sweep character arrays declared as argument.  */
++static void
++sweep_string_in_args (tree parms, HOST_WIDE_INT sweep_offset,
++                    HOST_WIDE_INT sweep_size)
++{
++  rtx home;
++  HOST_WIDE_INT offset;
++    
++  for (; parms; parms = TREE_CHAIN (parms))
++    if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
++      {
++      if (PARM_PASSED_IN_MEMORY (parms) && DECL_NAME (parms))
++        {
++          home = DECL_INCOMING_RTL (parms);
++
++          if (XEXP (home, 0)->used)
++            continue;
++
++          offset = AUTO_OFFSET(XEXP (home, 0));
++
++          /* the operand related to the sweep variable.  */
++          if (AUTO_BASEPTR (XEXP (home, 0)) == virtual_stack_vars_rtx)
++            {
++              if (sweep_offset <= offset
++                  && offset < sweep_offset + sweep_size)
++                {
++                  offset += sweep_frame_offset - sweep_size - sweep_offset;
++                  XEXP (XEXP (home, 0), 1) = gen_rtx_CONST_INT (VOIDmode,
++                                                                offset);
++
++                  /* mark */
++                  XEXP (home, 0)->used = 1;
++                }
++              else if (sweep_offset <= offset
++                       && offset < sweep_frame_offset)
++                {
++                  /* the rest of variables under sweep_frame_offset,
++                     shift the location.  */
++                  XEXP (XEXP (home, 0), 1)
++                    = gen_rtx_CONST_INT (VOIDmode, offset - sweep_size);
++
++                  /* mark */
++                  XEXP (home, 0)->used = 1;
++                }
++            }
++        }
++      }
++}
++
++
++/* Set to 1 when the instruction contains virtual registers.  */
++static int has_virtual_reg;
++
++/* Sweep the specified character array for every insns. The array starts from
++   the sweep_offset and its size is sweep_size.  */
++static void
++sweep_string_use_of_insns (rtx insn, HOST_WIDE_INT sweep_offset,
++                         HOST_WIDE_INT sweep_size)
++{
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++      || GET_CODE (insn) == CALL_INSN)
++      {
++      has_virtual_reg = FALSE;
++      sweep_string_in_operand (insn, &PATTERN (insn),
++                               sweep_offset, sweep_size);
++      sweep_string_in_operand (insn, &REG_NOTES (insn),
++                               sweep_offset, sweep_size);
++      }
++}
++
++
++/* Sweep the specified character array, which starts from the sweep_offset and
++   its size is sweep_size.
++
++   When a pointer is given,
++   if it points the address higher than the array, it stays.
++   if it points the address inside the array, it changes to point inside
++   the sweeped array.
++   if it points the address lower than the array, it shifts higher address by
++   the sweep_size.  */
++static void
++sweep_string_in_operand (rtx insn, rtx *loc,
++                       HOST_WIDE_INT sweep_offset, HOST_WIDE_INT sweep_size)
++{
++  rtx x = *loc;
++  enum rtx_code code;
++  int i, j, k = 0;
++  HOST_WIDE_INT offset;
++  const char *fmt;
++
++  if (x == 0)
++    return;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++    case ASM_INPUT:
++    case ADDR_VEC:
++    case ADDR_DIFF_VEC:
++    case RETURN:
++    case ADDRESSOF:
++      return;
++          
++    case REG:
++      if (x == virtual_incoming_args_rtx
++        || x == virtual_stack_vars_rtx
++        || x == virtual_stack_dynamic_rtx
++        || x == virtual_outgoing_args_rtx
++        || x == virtual_cfa_rtx)
++      has_virtual_reg = TRUE;
++      return;
++      
++    case SET:
++      /*
++      skip setjmp setup insn and setjmp restore insn
++      Example:
++      (set (MEM (reg:SI xx)) (virtual_stack_vars_rtx)))
++      (set (virtual_stack_vars_rtx) (REG))
++      */
++      if (GET_CODE (XEXP (x, 0)) == MEM
++        && XEXP (x, 1) == virtual_stack_vars_rtx)
++      return;
++      if (XEXP (x, 0) == virtual_stack_vars_rtx
++        && GET_CODE (XEXP (x, 1)) == REG)
++      return;
++      break;
++          
++    case PLUS:
++      /* Handle typical case of frame register plus constant.  */
++      if (XEXP (x, 0) == virtual_stack_vars_rtx
++        && GET_CODE (XEXP (x, 1)) == CONST_INT)
++      {
++        if (x->used)
++          goto single_use_of_virtual_reg;
++        
++        offset = AUTO_OFFSET(x);
++
++        /* When arguments grow downward, the virtual incoming
++           args pointer points to the top of the argument block,
++           so block is identified by the pointer - 1.
++           The flag is set at the copy_rtx_and_substitute in integrate.c  */
++        if (RTX_INTEGRATED_P (x))
++          k = -1;
++
++        /* the operand related to the sweep variable.  */
++        if (sweep_offset <= offset + k
++            && offset + k < sweep_offset + sweep_size)
++          {
++            offset += sweep_frame_offset - sweep_size - sweep_offset;
++
++            XEXP (x, 0) = virtual_stack_vars_rtx;
++            XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset);
++            x->used = 1;
++          }
++        else if (sweep_offset <= offset + k
++                 && offset + k < sweep_frame_offset)
++          {
++            /* the rest of variables under sweep_frame_offset,
++               shift the location.  */
++            XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset - sweep_size);
++            x->used = 1;
++          }
++        
++      single_use_of_virtual_reg:
++        if (has_virtual_reg) {
++          /* excerpt from insn_invalid_p in recog.c  */
++          int icode = recog_memoized (insn);
++
++          if (icode < 0 && asm_noperands (PATTERN (insn)) < 0)
++            {
++              rtx temp, seq;
++              
++              start_sequence ();
++              temp = force_operand (x, NULL_RTX);
++              seq = get_insns ();
++              end_sequence ();
++              
++              emit_insn_before (seq, insn);
++              if (! validate_change (insn, loc, temp, 0)
++                  && !validate_replace_rtx (x, temp, insn))
++                fatal_insn ("sweep_string_in_operand", insn);
++            }
++        }
++
++        has_virtual_reg = TRUE;
++        return;
++      }
++
++#ifdef FRAME_GROWS_DOWNWARD
++      /* Alert the case of frame register plus constant given by reg.  */
++      else if (XEXP (x, 0) == virtual_stack_vars_rtx
++             && GET_CODE (XEXP (x, 1)) == REG)
++      fatal_insn ("sweep_string_in_operand: unknown addressing", insn);
++#endif
++
++      /*
++      process further subtree:
++      Example:  (plus:SI (mem/s:SI (plus:SI (reg:SI 17) (const_int 8)))
++      (const_int 5))
++      */
++      break;
++
++    case CALL_PLACEHOLDER:
++      for (i = 0; i < 3; i++)
++      {
++        rtx seq = XEXP (x, i);
++        if (seq)
++          {
++            push_to_sequence (seq);
++            sweep_string_use_of_insns (XEXP (x, i),
++                                       sweep_offset, sweep_size);
++            XEXP (x, i) = get_insns ();
++            end_sequence ();
++          }
++      }
++      break;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      {
++      /*
++        virtual_stack_vars_rtx without offset
++        Example:
++          (set (reg:SI xx) (reg:SI 78))
++          (set (reg:SI xx) (MEM (reg:SI 78)))
++      */
++      if (XEXP (x, i) == virtual_stack_vars_rtx)
++        fatal_insn ("sweep_string_in_operand: unknown fp usage", insn);
++      sweep_string_in_operand (insn, &XEXP (x, i), sweep_offset, sweep_size);
++      }
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      sweep_string_in_operand (insn, &XVECEXP (x, i, j), sweep_offset, sweep_size);
++}   
++
++
++/* Change the use of an argument to the use of the duplicated variable for
++   every insns, The variable is addressed by new rtx.  */
++static void
++change_arg_use_of_insns (rtx insn, rtx orig, rtx *new, HOST_WIDE_INT size)
++{
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++      || GET_CODE (insn) == CALL_INSN)
++      {
++      rtx seq;
++      
++      start_sequence ();
++      change_arg_use_in_operand (insn, PATTERN (insn), orig, new, size);
++
++      seq = get_insns ();
++      end_sequence ();
++      emit_insn_before (seq, insn);
++
++      /* load_multiple insn from virtual_incoming_args_rtx have several
++         load insns. If every insn change the load address of arg
++         to frame region, those insns are moved before the PARALLEL insn
++         and remove the PARALLEL insn.  */
++      if (GET_CODE (PATTERN (insn)) == PARALLEL
++          && XVECLEN (PATTERN (insn), 0) == 0)
++        delete_insn (insn);
++      }
++}
++
++
++/* Change the use of an argument to the use of the duplicated variable for
++   every rtx derived from the x.  */
++static void
++change_arg_use_in_operand (rtx insn, rtx x, rtx orig, rtx *new, HOST_WIDE_INT size)
++{
++  enum rtx_code code;
++  int i, j;
++  HOST_WIDE_INT offset;
++  const char *fmt;
++
++  if (x == 0)
++    return;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++    case ASM_INPUT:
++    case ADDR_VEC:
++    case ADDR_DIFF_VEC:
++    case RETURN:
++    case REG:
++    case ADDRESSOF:
++      return;
++
++    case MEM:
++      /* Handle special case of MEM (incoming_args).  */
++      if (GET_CODE (orig) == MEM
++        && XEXP (x, 0) == virtual_incoming_args_rtx)
++      {
++        offset = 0;
++
++        /* the operand related to the sweep variable.  */
++        if (AUTO_OFFSET(XEXP (orig, 0)) <= offset &&
++            offset < AUTO_OFFSET(XEXP (orig, 0)) + size) {
++
++          offset = AUTO_OFFSET(XEXP (*new, 0))
++            + (offset - AUTO_OFFSET(XEXP (orig, 0)));
++
++          XEXP (x, 0) = plus_constant (virtual_stack_vars_rtx, offset);
++          XEXP (x, 0)->used = 1;
++
++          return;
++        }
++      }
++      break;
++      
++    case PLUS:
++      /* Handle special case of frame register plus constant.  */
++      if (GET_CODE (orig) == MEM
++        && XEXP (x, 0) == virtual_incoming_args_rtx
++        && GET_CODE (XEXP (x, 1)) == CONST_INT
++        && ! x->used)
++      {
++        offset = AUTO_OFFSET(x);
++
++        /* the operand related to the sweep variable.  */
++        if (AUTO_OFFSET(XEXP (orig, 0)) <= offset &&
++            offset < AUTO_OFFSET(XEXP (orig, 0)) + size)
++          {
++
++            offset = (AUTO_OFFSET(XEXP (*new, 0))
++                      + (offset - AUTO_OFFSET(XEXP (orig, 0))));
++
++            XEXP (x, 0) = virtual_stack_vars_rtx;
++            XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset);
++            x->used = 1;
++
++            return;
++          }
++
++        /*
++          process further subtree:
++          Example:  (plus:SI (mem/s:SI (plus:SI (reg:SI 17) (const_int 8)))
++          (const_int 5))
++        */
++      }
++      break;
++
++    case SET:
++      /* Handle special case of "set (REG or MEM) (incoming_args)".
++       It means that the the address of the 1st argument is stored.  */
++      if (GET_CODE (orig) == MEM
++        && XEXP (x, 1) == virtual_incoming_args_rtx)
++      {
++        offset = 0;
++
++        /* the operand related to the sweep variable.  */
++        if (AUTO_OFFSET(XEXP (orig, 0)) <= offset &&
++            offset < AUTO_OFFSET(XEXP (orig, 0)) + size)
++          {
++            offset = (AUTO_OFFSET(XEXP (*new, 0))
++                      + (offset - AUTO_OFFSET(XEXP (orig, 0))));
++
++            XEXP (x, 1) = force_operand (plus_constant (virtual_stack_vars_rtx,
++                                                        offset), NULL_RTX);
++            XEXP (x, 1)->used = 1;
++
++            return;
++          }
++      }
++      break;
++
++    case CALL_PLACEHOLDER:
++      for (i = 0; i < 3; i++)
++      {
++        rtx seq = XEXP (x, i);
++        if (seq)
++          {
++            push_to_sequence (seq);
++            change_arg_use_of_insns (XEXP (x, i), orig, new, size);
++            XEXP (x, i) = get_insns ();
++            end_sequence ();
++          }
++      }
++      break;
++
++    case PARALLEL:
++      for (j = 0; j < XVECLEN (x, 0); j++)
++      {
++        change_arg_use_in_operand (insn, XVECEXP (x, 0, j), orig, new, size);
++      }
++      if (recog_memoized (insn) < 0)
++      {
++        for (i = 0, j = 0; j < XVECLEN (x, 0); j++)
++          {
++            /* if parallel insn has a insn used virtual_incoming_args_rtx,
++               the insn is removed from this PARALLEL insn.  */
++            if (check_used_flag (XVECEXP (x, 0, j)))
++              {
++                emit_insn (XVECEXP (x, 0, j));
++                XVECEXP (x, 0, j) = NULL;
++              }
++            else
++              XVECEXP (x, 0, i++) = XVECEXP (x, 0, j);
++          }
++        PUT_NUM_ELEM (XVEC (x, 0), i);
++      }
++      return;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      {
++      if (XEXP (x, i) == orig)
++        {
++          if (*new == 0)
++            *new = gen_reg_rtx (GET_MODE (orig));
++          XEXP (x, i) = *new;
++          continue;
++        }
++      change_arg_use_in_operand (insn, XEXP (x, i), orig, new, size);
++      }
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      {
++        if (XVECEXP (x, i, j) == orig)
++          {
++            if (*new == 0)
++              *new = gen_reg_rtx (GET_MODE (orig));
++            XVECEXP (x, i, j) = *new;
++            continue;
++          }
++        change_arg_use_in_operand (insn, XVECEXP (x, i, j), orig, new, size);
++      }
++}   
++
++
++/* Validate every instructions from the specified instruction.
++   
++   The stack protector prohibits to generate machine specific frame addressing
++   for the first rtl generation. The prepare_stack_protection must convert
++   machine independent frame addressing to machine specific frame addressing,
++   so instructions for inline functions, which skip the conversion of
++   the stack protection, validate every instructions.  */
++static void
++validate_insns_of_varrefs (rtx insn)
++{
++  rtx next;
++
++  /* Initialize recognition, indicating that volatile is OK.  */
++  init_recog ();
++
++  for (; insn; insn = next)
++    {
++      next = NEXT_INSN (insn);
++      if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++        || GET_CODE (insn) == CALL_INSN)
++      {
++        /* excerpt from insn_invalid_p in recog.c  */
++        int icode = recog_memoized (insn);
++
++        if (icode < 0 && asm_noperands (PATTERN (insn)) < 0)
++          validate_operand_of_varrefs (insn, &PATTERN (insn));
++      }
++    }
++
++  init_recog_no_volatile ();
++}
++
++
++/* Validate frame addressing of the rtx and covert it to machine specific one.  */
++static void
++validate_operand_of_varrefs (rtx insn, rtx *loc)
++{
++  enum rtx_code code;
++  rtx x, temp, seq;
++  int i, j;
++  const char *fmt;
++
++  x = *loc;
++  if (x == 0)
++    return;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case USE:
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++    case ASM_INPUT:
++    case ADDR_VEC:
++    case ADDR_DIFF_VEC:
++    case RETURN:
++    case REG:
++    case ADDRESSOF:
++      return;
++
++    case PLUS:
++      /* validate insn of frame register plus constant.  */
++      if (GET_CODE (x) == PLUS
++        && XEXP (x, 0) == virtual_stack_vars_rtx
++        && GET_CODE (XEXP (x, 1)) == CONST_INT)
++      {
++        start_sequence ();
++
++        { /* excerpt from expand_binop in optabs.c  */
++          optab binoptab = add_optab;
++          enum machine_mode mode = GET_MODE (x);
++          int icode = (int) binoptab->handlers[(int) mode].insn_code;
++          enum machine_mode mode1 = insn_data[icode].operand[2].mode;
++          rtx pat;
++          rtx xop0 = XEXP (x, 0), xop1 = XEXP (x, 1);
++          temp = gen_reg_rtx (mode);
++
++          /* Now, if insn's predicates don't allow offset operands,
++             put them into pseudo regs.  */
++
++          if (! (*insn_data[icode].operand[2].predicate) (xop1, mode1)
++              && mode1 != VOIDmode)
++            xop1 = copy_to_mode_reg (mode1, xop1);
++
++          pat = GEN_FCN (icode) (temp, xop0, xop1);
++          if (pat)
++            emit_insn (pat);
++          else
++            abort (); /* there must be add_optab handler.  */
++        }           
++        seq = get_insns ();
++        end_sequence ();
++        
++        emit_insn_before (seq, insn);
++        if (! validate_change (insn, loc, temp, 0))
++          abort ();
++        return;
++      }
++      break;
++      
++
++    case CALL_PLACEHOLDER:
++      for (i = 0; i < 3; i++)
++      {
++        rtx seq = XEXP (x, i);
++        if (seq)
++          {
++            push_to_sequence (seq);
++            validate_insns_of_varrefs (XEXP (x, i));
++            XEXP (x, i) = get_insns ();
++            end_sequence ();
++          }
++      }
++      break;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      validate_operand_of_varrefs (insn, &XEXP (x, i));
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      validate_operand_of_varrefs (insn, &XVECEXP (x, i, j));
++}
++
++
++
++/* Return size that is not allocated for stack frame. It will be allocated
++   to modify the home of pseudo registers called from global_alloc.  */
++HOST_WIDE_INT
++get_frame_free_size (void)
++{
++  if (! flag_propolice_protection)
++    return 0;
++
++  return push_allocated_offset - push_frame_offset;
++}
++
++
++/* The following codes are invoked after the instantiation of pseudo registers.
++
++   Reorder local variables to place a peudo register after buffers to avoid
++   the corruption of local variables that could be used to further corrupt
++   arbitrary memory locations.  */
++#if !defined(FRAME_GROWS_DOWNWARD) && defined(STACK_GROWS_DOWNWARD)
++static void push_frame (HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_in_decls (tree, HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_in_args (tree, HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_of_insns (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_in_operand (rtx, rtx, HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_of_reg_equiv_memory_loc (HOST_WIDE_INT, HOST_WIDE_INT);
++static void push_frame_of_reg_equiv_constant (HOST_WIDE_INT, HOST_WIDE_INT);
++static void reset_used_flags_for_push_frame (void);
++static int check_out_of_frame_access (rtx, HOST_WIDE_INT);
++static int check_out_of_frame_access_in_operand (rtx, HOST_WIDE_INT);
++#endif
++
++
++/* Assign stack local at the stage of register allocater. if a pseudo reg is
++   spilled out from such an allocation, it is allocated on the stack.
++   The protector keep the location be lower stack region than the location of
++   sweeped arrays.  */
++rtx
++assign_stack_local_for_pseudo_reg (enum machine_mode mode,
++                                 HOST_WIDE_INT size, int align)
++{
++#if defined(FRAME_GROWS_DOWNWARD) || !defined(STACK_GROWS_DOWNWARD)
++  return assign_stack_local (mode, size, align);
++#else
++  tree blocks = DECL_INITIAL (current_function_decl);
++  rtx new;
++  HOST_WIDE_INT saved_frame_offset, units_per_push, starting_frame;
++  int first_call_from_purge_addressof, first_call_from_global_alloc;
++
++  if (! flag_propolice_protection
++      || size == 0
++      || ! blocks
++      || current_function_is_inlinable
++      || ! search_string_from_argsandvars (CALL_FROM_PUSH_FRAME)
++      || current_function_contains_functions)
++    return assign_stack_local (mode, size, align);
++
++  first_call_from_purge_addressof = !push_frame_offset && !cse_not_expected;
++  first_call_from_global_alloc = !saved_cse_not_expected && cse_not_expected;
++  saved_cse_not_expected = cse_not_expected;
++
++  starting_frame = ((STARTING_FRAME_OFFSET)
++                  ? STARTING_FRAME_OFFSET : BIGGEST_ALIGNMENT / BITS_PER_UNIT);
++  units_per_push = MAX (BIGGEST_ALIGNMENT / BITS_PER_UNIT,
++                      GET_MODE_SIZE (mode));
++    
++  if (first_call_from_purge_addressof)
++    {
++      push_frame_offset = push_allocated_offset;
++      if (check_out_of_frame_access (get_insns (), starting_frame))
++      {
++        /* After the purge_addressof stage, there may be an instruction which
++           have the pointer less than the starting_frame. 
++           if there is an access below frame, push dummy region to seperate
++           the address of instantiated variables.  */
++        push_frame (GET_MODE_SIZE (DImode), 0);
++        assign_stack_local (BLKmode, GET_MODE_SIZE (DImode), -1);
++      }
++    }
++
++  if (first_call_from_global_alloc)
++    {
++      push_frame_offset = push_allocated_offset = 0;
++      if (check_out_of_frame_access (get_insns (), starting_frame))
++      {
++        if (STARTING_FRAME_OFFSET)
++          {
++            /* if there is an access below frame, push dummy region 
++               to seperate the address of instantiated variables.  */
++            push_frame (GET_MODE_SIZE (DImode), 0);
++            assign_stack_local (BLKmode, GET_MODE_SIZE (DImode), -1);
++          }
++        else
++          push_allocated_offset = starting_frame;
++      }
++    }
++
++  saved_frame_offset = frame_offset;
++  frame_offset = push_frame_offset;
++
++  new = assign_stack_local (mode, size, align);
++
++  push_frame_offset = frame_offset;
++  frame_offset = saved_frame_offset;
++  
++  if (push_frame_offset > push_allocated_offset)
++    {
++      push_frame (units_per_push,
++                push_allocated_offset + STARTING_FRAME_OFFSET);
++
++      assign_stack_local (BLKmode, units_per_push, -1);
++      push_allocated_offset += units_per_push;
++    }
++
++  /* At the second call from global alloc, alpha push frame and assign
++     a local variable to the top of the stack.  */
++  if (first_call_from_global_alloc && STARTING_FRAME_OFFSET == 0)
++    push_frame_offset = push_allocated_offset = 0;
++
++  return new;
++#endif
++}
++
++
++#if !defined(FRAME_GROWS_DOWNWARD) && defined(STACK_GROWS_DOWNWARD)
++
++/* push frame infomation for instantiating pseudo register at the top of stack.
++   This is only for the "frame grows upward", it means FRAME_GROWS_DOWNWARD is 
++   not defined.
++
++   It is called by purge_addressof function and global_alloc (or reload)
++   function.  */
++static void
++push_frame (HOST_WIDE_INT var_size, HOST_WIDE_INT boundary)
++{
++  reset_used_flags_for_push_frame();
++
++  /* Scan all declarations of variables and fix the offset address of
++     the variable based on the frame pointer.  */
++  push_frame_in_decls (DECL_INITIAL (current_function_decl),
++                     var_size, boundary);
++
++  /* Scan all argument variable and fix the offset address based on
++     the frame pointer.  */
++  push_frame_in_args (DECL_ARGUMENTS (current_function_decl),
++                    var_size, boundary);
++
++  /* Scan all operands of all insns and fix the offset address
++     based on the frame pointer.  */
++  push_frame_of_insns (get_insns (), var_size, boundary);
++
++  /* Scan all reg_equiv_memory_loc and reg_equiv_constant.  */
++  push_frame_of_reg_equiv_memory_loc (var_size, boundary);
++  push_frame_of_reg_equiv_constant (var_size, boundary);
++
++  reset_used_flags_for_push_frame();
++}
++
++
++/* Reset used flag of every insns, reg_equiv_memory_loc,
++   and reg_equiv_constant.  */
++static void
++reset_used_flags_for_push_frame(void)
++{
++  int i;
++  extern rtx *reg_equiv_memory_loc;
++  extern rtx *reg_equiv_constant;
++
++  /* Clear all the USED bits in operands of all insns and declarations of
++     local vars.  */
++  reset_used_flags_for_decls (DECL_INITIAL (current_function_decl));
++  reset_used_flags_for_insns (get_insns ());
++
++
++  /* The following codes are processed if the push_frame is called from 
++     global_alloc (or reload) function.  */
++  if (reg_equiv_memory_loc == 0)
++    return;
++
++  for (i=LAST_VIRTUAL_REGISTER+1; i < max_regno; i++)
++    if (reg_equiv_memory_loc[i])
++      {
++      rtx x = reg_equiv_memory_loc[i];
++
++      if (GET_CODE (x) == MEM
++          && GET_CODE (XEXP (x, 0)) == PLUS
++          && AUTO_BASEPTR (XEXP (x, 0)) == frame_pointer_rtx)
++        {
++          /* reset */
++          XEXP (x, 0)->used = 0;
++        }
++      }
++
++  
++  if (reg_equiv_constant == 0)
++    return;
++
++  for (i=LAST_VIRTUAL_REGISTER+1; i < max_regno; i++)
++    if (reg_equiv_constant[i])
++      {
++      rtx x = reg_equiv_constant[i];
++
++      if (GET_CODE (x) == PLUS
++          && AUTO_BASEPTR (x) == frame_pointer_rtx)
++        {
++          /* reset */
++          x->used = 0;
++        }
++      }
++}
++
++
++/* Push every variables declared as a local variable and make a room for
++   instantiated register.  */
++static void
++push_frame_in_decls (tree block, HOST_WIDE_INT push_size,
++                   HOST_WIDE_INT boundary)
++{
++  tree types;
++  HOST_WIDE_INT offset;
++  rtx home;
++
++  while (block && TREE_CODE(block)==BLOCK)
++    {
++      for (types = BLOCK_VARS(block); types; types = TREE_CHAIN(types))
++      {
++        /* Skip the declaration that refers an external variable and
++           also skip an global variable.  */
++        if (! DECL_EXTERNAL (types) && ! TREE_STATIC (types))
++          {
++            if (! DECL_RTL_SET_P (types))
++              continue;
++
++            home = DECL_RTL (types);
++
++            /* Process for static local variable.  */
++            if (GET_CODE (home) == MEM
++                && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
++              continue;
++
++            if (GET_CODE (home) == MEM
++                && GET_CODE (XEXP (home, 0)) == REG)
++              {
++                if (XEXP (home, 0) != frame_pointer_rtx
++                    || boundary != 0)
++                  continue;
++
++                XEXP (home, 0) = plus_constant (frame_pointer_rtx,
++                                                push_size);
++
++                /* mark */
++                XEXP (home, 0)->used = 1;
++              }
++              
++            if (GET_CODE (home) == MEM
++                && GET_CODE (XEXP (home, 0)) == MEM)
++              {
++                /* Process for dynamically allocated array.  */
++                home = XEXP (home, 0);
++              }
++              
++            if (GET_CODE (home) == MEM
++                && GET_CODE (XEXP (home, 0)) == PLUS
++                && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
++              {
++                offset = AUTO_OFFSET(XEXP (home, 0));
++
++                if (! XEXP (home, 0)->used
++                    && offset >= boundary)
++                  {
++                    offset += push_size;
++                    XEXP (XEXP (home, 0), 1)
++                      = gen_rtx_CONST_INT (VOIDmode, offset);
++                    
++                    /* mark */
++                    XEXP (home, 0)->used = 1;
++                  }
++              }
++          }
++      }
++
++      push_frame_in_decls (BLOCK_SUBBLOCKS (block), push_size, boundary);
++      block = BLOCK_CHAIN (block);
++    }
++}
++
++
++/* Push every variables declared as an argument and make a room for
++   instantiated register.  */
++static void
++push_frame_in_args (tree parms, HOST_WIDE_INT push_size,
++                  HOST_WIDE_INT boundary)
++{
++  rtx home;
++  HOST_WIDE_INT offset;
++    
++  for (; parms; parms = TREE_CHAIN (parms))
++    if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
++      {
++      if (PARM_PASSED_IN_MEMORY (parms))
++        {
++          home = DECL_INCOMING_RTL (parms);
++          offset = AUTO_OFFSET(XEXP (home, 0));
++
++          if (XEXP (home, 0)->used || offset < boundary)
++            continue;
++
++          /* the operand related to the sweep variable.  */
++          if (AUTO_BASEPTR (XEXP (home, 0)) == frame_pointer_rtx)
++            {
++              if (XEXP (home, 0) == frame_pointer_rtx)
++                XEXP (home, 0) = plus_constant (frame_pointer_rtx,
++                                                push_size);
++              else {
++                offset += push_size;
++                XEXP (XEXP (home, 0), 1) = gen_rtx_CONST_INT (VOIDmode,
++                                                              offset);
++              }
++
++              /* mark */
++              XEXP (home, 0)->used = 1;
++            }
++        }
++      }
++}
++
++
++/* Set to 1 when the instruction has the reference to be pushed.  */
++static int insn_pushed;
++
++/* Tables of equivalent registers with frame pointer.  */
++static int *fp_equiv = 0;
++
++
++/* Push the frame region to make a room for allocated local variable.  */
++static void
++push_frame_of_insns (rtx insn, HOST_WIDE_INT push_size, HOST_WIDE_INT boundary)
++{
++  /* init fp_equiv */
++  fp_equiv = (int *) xcalloc (max_reg_num (), sizeof (int));
++              
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++      || GET_CODE (insn) == CALL_INSN)
++      {
++      rtx last;
++      
++      insn_pushed = FALSE;
++
++      /* Push frame in INSN operation.  */
++      push_frame_in_operand (insn, PATTERN (insn), push_size, boundary);
++
++      /* Push frame in NOTE.  */
++      push_frame_in_operand (insn, REG_NOTES (insn), push_size, boundary);
++
++      /* Push frame in CALL EXPR_LIST.  */
++      if (GET_CODE (insn) == CALL_INSN)
++        push_frame_in_operand (insn, CALL_INSN_FUNCTION_USAGE (insn),
++                               push_size, boundary);
++
++      /* Pushed frame addressing style may not be machine specific one.
++         so the instruction should be converted to use the machine specific
++         frame addressing.  */
++      if (insn_pushed
++          && (last = try_split (PATTERN (insn), insn, 1)) != insn)
++        {
++          rtx first = NEXT_INSN (insn);
++          rtx trial = NEXT_INSN (first);
++          rtx pattern = PATTERN (trial);
++          rtx set;
++
++          /* Update REG_EQUIV info to the first splitted insn.  */
++          if ((set = single_set (insn))
++              && find_reg_note (insn, REG_EQUIV, SET_SRC (set))
++              && GET_CODE (PATTERN (first)) == SET)
++            {
++              REG_NOTES (first)
++                = gen_rtx_EXPR_LIST (REG_EQUIV,
++                                     SET_SRC (PATTERN (first)),
++                                     REG_NOTES (first));
++            }
++
++          /* copy the first insn of splitted insns to the original insn and
++             delete the first insn,
++             because the original insn is pointed from records:
++             insn_chain, reg_equiv_init, used for global_alloc.  */
++          if (cse_not_expected)
++            {
++              add_insn_before (insn, first);
++              
++              /* Copy the various flags, and other information.  */
++              memcpy (insn, first, sizeof (struct rtx_def) - sizeof (rtunion));
++              PATTERN (insn) = PATTERN (first);
++              INSN_CODE (insn) = INSN_CODE (first);
++              LOG_LINKS (insn) = LOG_LINKS (first);
++              REG_NOTES (insn) = REG_NOTES (first);
++
++              /* then remove the first insn of splitted insns.  */
++              remove_insn (first);
++              INSN_DELETED_P (first) = 1;
++            }
++
++          if (GET_CODE (pattern) == SET
++              && GET_CODE (XEXP (pattern, 0)) == REG
++              && GET_CODE (XEXP (pattern, 1)) == PLUS
++              && XEXP (pattern, 0) == XEXP (XEXP (pattern, 1), 0)
++              && GET_CODE (XEXP (XEXP (pattern, 1), 1)) == CONST_INT)
++            {
++              rtx offset = XEXP (XEXP (pattern, 1), 1);
++              fp_equiv[REGNO (XEXP (pattern, 0))] = INTVAL (offset);
++
++              delete_insn (trial);
++            }
++
++          insn = last;
++        }
++      }
++
++  /* Clean up.  */
++  free (fp_equiv);
++}
++
++
++/* Push the frame region by changing the operand that points the frame.  */
++static void
++push_frame_in_operand (rtx insn, rtx orig,
++                     HOST_WIDE_INT push_size, HOST_WIDE_INT boundary)
++{
++  rtx x = orig;
++  enum rtx_code code;
++  int i, j;
++  HOST_WIDE_INT offset;
++  const char *fmt;
++
++  if (x == 0)
++    return;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++    case ASM_INPUT:
++    case ADDR_VEC:
++    case ADDR_DIFF_VEC:
++    case RETURN:
++    case REG:
++    case ADDRESSOF:
++    case USE:
++      return;
++          
++    case SET:
++      /*
++      Skip setjmp setup insn and setjmp restore insn
++      alpha case:
++      (set (MEM (reg:SI xx)) (frame_pointer_rtx)))
++      (set (frame_pointer_rtx) (REG))
++      */
++      if (GET_CODE (XEXP (x, 0)) == MEM
++        && XEXP (x, 1) == frame_pointer_rtx)
++      return;
++      if (XEXP (x, 0) == frame_pointer_rtx
++        && GET_CODE (XEXP (x, 1)) == REG)
++      return;
++
++      /*
++      powerpc case: restores setjmp address
++      (set (frame_pointer_rtx) (plus frame_pointer_rtx const_int -n))
++      or
++      (set (reg) (plus frame_pointer_rtx const_int -n))
++      (set (frame_pointer_rtx) (reg))
++      */
++      if (GET_CODE (XEXP (x, 0)) == REG
++        && GET_CODE (XEXP (x, 1)) == PLUS
++        && XEXP (XEXP (x, 1), 0) == frame_pointer_rtx
++        && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
++        && INTVAL (XEXP (XEXP (x, 1), 1)) < 0)
++      {
++        x = XEXP (x, 1);
++        offset = AUTO_OFFSET(x);
++        if (x->used || -offset < boundary)
++          return;
++
++        XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset - push_size);
++        x->used = 1; insn_pushed = TRUE;
++        return;
++      }
++
++      /* Reset fp_equiv register.  */
++      else if (GET_CODE (XEXP (x, 0)) == REG
++        && fp_equiv[REGNO (XEXP (x, 0))])
++      fp_equiv[REGNO (XEXP (x, 0))] = 0;
++
++      /* Propagete fp_equiv register.  */
++      else if (GET_CODE (XEXP (x, 0)) == REG
++             && GET_CODE (XEXP (x, 1)) == REG
++             && fp_equiv[REGNO (XEXP (x, 1))])
++      if (REGNO (XEXP (x, 0)) <= LAST_VIRTUAL_REGISTER
++          || reg_renumber[REGNO (XEXP (x, 0))] > 0)
++        fp_equiv[REGNO (XEXP (x, 0))] = fp_equiv[REGNO (XEXP (x, 1))];
++      break;
++
++    case MEM:
++      if (XEXP (x, 0) == frame_pointer_rtx
++        && boundary == 0)
++      {
++        XEXP (x, 0) = plus_constant (frame_pointer_rtx, push_size);
++        XEXP (x, 0)->used = 1; insn_pushed = TRUE;
++        return;
++      }
++      break;
++      
++    case PLUS:
++      /* Handle special case of frame register plus constant.  */
++      if (GET_CODE (XEXP (x, 1)) == CONST_INT
++        && XEXP (x, 0) == frame_pointer_rtx)
++      {
++        offset = AUTO_OFFSET(x);
++
++        if (x->used || offset < boundary)
++          return;
++
++        XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset + push_size);
++        x->used = 1; insn_pushed = TRUE;
++
++        return;
++      }
++      /*
++      Handle alpha case:
++       (plus:SI (subreg:SI (reg:DI 63 FP) 0) (const_int 64 [0x40]))
++      */
++      if (GET_CODE (XEXP (x, 1)) == CONST_INT
++        && GET_CODE (XEXP (x, 0)) == SUBREG
++        && SUBREG_REG (XEXP (x, 0)) == frame_pointer_rtx)
++      {
++        offset = AUTO_OFFSET(x);
++
++        if (x->used || offset < boundary)
++          return;
++
++        XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset + push_size);
++        x->used = 1; insn_pushed = TRUE;
++
++        return;
++      }
++      /*
++      Handle powerpc case:
++       (set (reg x) (plus fp const))
++       (set (.....) (... (plus (reg x) (const B))))
++      */
++      else if (GET_CODE (XEXP (x, 1)) == CONST_INT
++             && GET_CODE (XEXP (x, 0)) == REG
++             && fp_equiv[REGNO (XEXP (x, 0))])
++      {
++        offset = AUTO_OFFSET(x);
++
++        if (x->used)
++          return;
++
++        offset += fp_equiv[REGNO (XEXP (x, 0))];
++
++        XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset);
++        x->used = 1; insn_pushed = TRUE;
++
++        return;
++      }
++      /*
++      Handle special case of frame register plus reg (constant).
++       (set (reg x) (const B))
++       (set (....) (...(plus fp (reg x))))
++      */
++      else if (XEXP (x, 0) == frame_pointer_rtx
++             && GET_CODE (XEXP (x, 1)) == REG
++             && PREV_INSN (insn)
++             && PATTERN (PREV_INSN (insn))
++             && SET_DEST (PATTERN (PREV_INSN (insn))) == XEXP (x, 1)
++             && GET_CODE (SET_SRC (PATTERN (PREV_INSN (insn)))) == CONST_INT)
++      {
++        offset = INTVAL (SET_SRC (PATTERN (PREV_INSN (insn))));
++
++        if (x->used || offset < boundary)
++          return;
++        
++        SET_SRC (PATTERN (PREV_INSN (insn)))
++          = gen_rtx_CONST_INT (VOIDmode, offset + push_size);
++        x->used = 1;
++        XEXP (x, 1)->used = 1;
++
++        return;
++      }
++      /*
++      Handle special case of frame register plus reg (used).
++      The register already have a pushed offset, just mark this frame
++      addressing.
++      */
++      else if (XEXP (x, 0) == frame_pointer_rtx
++             && XEXP (x, 1)->used)
++      {
++        x->used = 1;
++        return;
++      }
++      /*
++      Process further subtree:
++      Example:  (plus:SI (mem/s:SI (plus:SI (FP) (const_int 8)))
++      (const_int 5))
++      */
++      break;
++
++    case CALL_PLACEHOLDER:
++      push_frame_of_insns (XEXP (x, 0), push_size, boundary);
++      push_frame_of_insns (XEXP (x, 1), push_size, boundary);
++      push_frame_of_insns (XEXP (x, 2), push_size, boundary);
++      break;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      {
++      if (XEXP (x, i) == frame_pointer_rtx && boundary == 0)
++        fatal_insn ("push_frame_in_operand", insn);
++      push_frame_in_operand (insn, XEXP (x, i), push_size, boundary);
++      }
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      push_frame_in_operand (insn, XVECEXP (x, i, j), push_size, boundary);
++}   
++
++
++/* Change the location pointed in reg_equiv_memory_loc.  */
++static void
++push_frame_of_reg_equiv_memory_loc (HOST_WIDE_INT push_size,
++                                  HOST_WIDE_INT boundary)
++{
++  int i;
++  extern rtx *reg_equiv_memory_loc;
++
++  /* This function is processed if the push_frame is called from 
++     global_alloc (or reload) function.  */
++  if (reg_equiv_memory_loc == 0)
++    return;
++
++  for (i=LAST_VIRTUAL_REGISTER+1; i < max_regno; i++)
++    if (reg_equiv_memory_loc[i])
++      {
++      rtx x = reg_equiv_memory_loc[i];
++      int offset;
++
++      if (GET_CODE (x) == MEM
++          && GET_CODE (XEXP (x, 0)) == PLUS
++          && XEXP (XEXP (x, 0), 0) == frame_pointer_rtx)
++        {
++          offset = AUTO_OFFSET(XEXP (x, 0));
++          
++          if (! XEXP (x, 0)->used
++              && offset >= boundary)
++            {
++              offset += push_size;
++              XEXP (XEXP (x, 0), 1) = gen_rtx_CONST_INT (VOIDmode, offset);
++
++              /* mark */
++              XEXP (x, 0)->used = 1;
++            }
++        }
++      else if (GET_CODE (x) == MEM
++               && XEXP (x, 0) == frame_pointer_rtx
++               && boundary == 0)
++        {
++          XEXP (x, 0) = plus_constant (frame_pointer_rtx, push_size);
++          XEXP (x, 0)->used = 1; insn_pushed = TRUE;
++        }
++      }
++}
++
++
++/* Change the location pointed in reg_equiv_constant.  */
++static void
++push_frame_of_reg_equiv_constant (HOST_WIDE_INT push_size,
++                                HOST_WIDE_INT boundary)
++{
++  int i;
++  extern rtx *reg_equiv_constant;
++
++  /* This function is processed if the push_frame is called from 
++     global_alloc (or reload) function.  */
++  if (reg_equiv_constant == 0)
++    return;
++
++  for (i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++)
++    if (reg_equiv_constant[i])
++      {
++      rtx x = reg_equiv_constant[i];
++      int offset;
++
++      if (GET_CODE (x) == PLUS
++          && XEXP (x, 0) == frame_pointer_rtx)
++        {
++          offset = AUTO_OFFSET(x);
++          
++          if (! x->used
++              && offset >= boundary)
++            {
++              offset += push_size;
++              XEXP (x, 1) = gen_rtx_CONST_INT (VOIDmode, offset);
++
++              /* mark */
++              x->used = 1;
++            }
++        }
++      else if (x == frame_pointer_rtx
++               && boundary == 0)
++        {
++          reg_equiv_constant[i]
++            = plus_constant (frame_pointer_rtx, push_size);
++          reg_equiv_constant[i]->used = 1; insn_pushed = TRUE;
++        }
++      }
++}
++
++
++/* Check every instructions if insn's memory reference is out of frame.  */
++static int
++check_out_of_frame_access (rtx insn, HOST_WIDE_INT boundary)
++{
++  for (; insn; insn = NEXT_INSN (insn))
++    if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
++      || GET_CODE (insn) == CALL_INSN)
++      {
++      if (check_out_of_frame_access_in_operand (PATTERN (insn), boundary))
++        return TRUE;
++      }
++  return FALSE;
++}
++
++
++/* Check every operands if the reference is out of frame.  */
++static int
++check_out_of_frame_access_in_operand (rtx orig, HOST_WIDE_INT boundary)
++{
++  rtx x = orig;
++  enum rtx_code code;
++  int i, j;
++  const char *fmt;
++
++  if (x == 0)
++    return FALSE;
++
++  code = GET_CODE (x);
++
++  switch (code)
++    {
++    case CONST_INT:
++    case CONST_DOUBLE:
++    case CONST:
++    case SYMBOL_REF:
++    case CODE_LABEL:
++    case PC:
++    case CC0:
++    case ASM_INPUT:
++    case ADDR_VEC:
++    case ADDR_DIFF_VEC:
++    case RETURN:
++    case REG:
++    case ADDRESSOF:
++      return FALSE;
++          
++    case MEM:
++      if (XEXP (x, 0) == frame_pointer_rtx)
++      if (0 < boundary)
++        return TRUE;
++      break;
++      
++    case PLUS:
++      /* Handle special case of frame register plus constant.  */
++      if (GET_CODE (XEXP (x, 1)) == CONST_INT
++        && XEXP (x, 0) == frame_pointer_rtx)
++      {
++        if (0 <= AUTO_OFFSET(x)
++            && AUTO_OFFSET(x) < boundary)
++          return TRUE;
++        return FALSE;
++      }
++      /*
++      Process further subtree:
++      Example:  (plus:SI (mem/s:SI (plus:SI (reg:SI 17) (const_int 8)))
++      (const_int 5))
++      */
++      break;
++
++    case CALL_PLACEHOLDER:
++      if (check_out_of_frame_access (XEXP (x, 0), boundary))
++      return TRUE;
++      if (check_out_of_frame_access (XEXP (x, 1), boundary))
++      return TRUE;
++      if (check_out_of_frame_access (XEXP (x, 2), boundary))
++      return TRUE;
++      break;
++
++    default:
++      break;
++    }
++
++  /* Scan all subexpressions.  */
++  fmt = GET_RTX_FORMAT (code);
++  for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
++    if (*fmt == 'e')
++      {
++      if (check_out_of_frame_access_in_operand (XEXP (x, i), boundary))
++        return TRUE;
++      }
++    else if (*fmt == 'E')
++      for (j = 0; j < XVECLEN (x, i); j++)
++      if (check_out_of_frame_access_in_operand (XVECEXP (x, i, j), boundary))
++        return TRUE;
++
++  return FALSE;
++}
++#endif
+diff -uNr gcc-3.4.3.orig/gcc/protector.h gcc-3.4.3/gcc/protector.h
+--- gcc-3.4.3.orig/gcc/protector.h     1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/protector.h  2004-01-20 03:01:39.000000000 +0100
+@@ -0,0 +1,55 @@
++/* RTL buffer overflow protection function for GNU C compiler
++   Copyright (C) 2003 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 2, or (at your option) any later
++version.
++
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING.  If not, write to the Free
++Software Foundation, 59 Temple Place - Suite 330, Boston, MA
++02111-1307, USA.  */
++
++
++/* Declare GUARD variable.  */
++#define GUARD_m               Pmode
++#define UNITS_PER_GUARD                                               \
++  MAX(BIGGEST_ALIGNMENT / BITS_PER_UNIT, GET_MODE_SIZE (GUARD_m))
++
++#ifndef L_stack_smash_handler
++
++/* Insert a guard variable before a character buffer and change the order
++ of pointer variables, character buffers and pointer arguments.  */
++
++extern void prepare_stack_protection  (int);
++
++#ifdef TREE_CODE
++/* Search a character array from the specified type tree.  */
++
++extern int search_string_def (tree);
++#endif
++
++/* Examine whether the input contains frame pointer addressing.  */
++
++extern int contains_fp (rtx);
++
++/* Return size that is not allocated for stack frame. It will be allocated
++   to modify the home of pseudo registers called from global_alloc.  */
++
++extern HOST_WIDE_INT get_frame_free_size (void);
++
++/* Allocate a local variable in the stack area before character buffers
++   to avoid the corruption of it.  */
++
++extern rtx assign_stack_local_for_pseudo_reg (enum machine_mode,
++                                            HOST_WIDE_INT, int);
++
++#endif
+diff -uNr gcc-3.4.3.orig/gcc/reload1.c gcc-3.4.3/gcc/reload1.c
+--- gcc-3.4.3.orig/gcc/reload1.c       2004-05-02 14:37:17.000000000 +0200
++++ gcc-3.4.3/gcc/reload1.c    2004-11-24 18:35:31.812641048 +0100
+@@ -43,6 +43,7 @@
+ #include "toplev.h"
+ #include "except.h"
+ #include "tree.h"
++#include "protector.h"
+ /* This file contains the reload pass of the compiler, which is
+    run after register allocation has been done.  It checks that
+@@ -891,7 +892,7 @@
+       if (cfun->stack_alignment_needed)
+         assign_stack_local (BLKmode, 0, cfun->stack_alignment_needed);
+-      starting_frame_size = get_frame_size ();
++      starting_frame_size = get_frame_size () - get_frame_free_size ();
+       set_initial_elim_offsets ();
+       set_initial_label_offsets ();
+@@ -955,7 +956,7 @@
+       setup_save_areas ();
+       /* If we allocated another stack slot, redo elimination bookkeeping.  */
+-      if (starting_frame_size != get_frame_size ())
++      if (starting_frame_size != get_frame_size () - get_frame_free_size ())
+       continue;
+       if (caller_save_needed)
+@@ -974,7 +975,7 @@
+       /* If we allocated any new memory locations, make another pass
+        since it might have changed elimination offsets.  */
+-      if (starting_frame_size != get_frame_size ())
++      if (starting_frame_size != get_frame_size () - get_frame_free_size ())
+       something_changed = 1;
+       {
+@@ -1066,11 +1067,11 @@
+   if (insns_need_reload != 0 || something_needs_elimination
+       || something_needs_operands_changed)
+     {
+-      HOST_WIDE_INT old_frame_size = get_frame_size ();
++      HOST_WIDE_INT old_frame_size = get_frame_size () - get_frame_free_size ();
+       reload_as_needed (global);
+-      if (old_frame_size != get_frame_size ())
++      if (old_frame_size != get_frame_size () - get_frame_free_size ())
+       abort ();
+       if (num_eliminable)
+@@ -1957,8 +1958,10 @@
+        inherent space, and no less total space, then the previous slot.  */
+       if (from_reg == -1)
+       {
+-        /* No known place to spill from => no slot to reuse.  */
+-        x = assign_stack_local (GET_MODE (regno_reg_rtx[i]), total_size,
++        /* No known place to spill from => no slot to reuse.
++           For the stack protection, an allocated slot should be placed in
++           the safe region from the stack smaching attack.  */
++        x = assign_stack_local_for_pseudo_reg (GET_MODE (regno_reg_rtx[i]), total_size,
+                                 inherent_size == total_size ? 0 : -1);
+         if (BYTES_BIG_ENDIAN)
+           /* Cancel the  big-endian correction done in assign_stack_local.
+diff -uNr gcc-3.4.3.orig/gcc/rtl.h gcc-3.4.3/gcc/rtl.h
+--- gcc-3.4.3.orig/gcc/rtl.h   2004-10-13 01:35:32.000000000 +0200
++++ gcc-3.4.3/gcc/rtl.h        2004-11-24 18:35:31.830638312 +0100
+@@ -473,6 +473,18 @@
+                            __FUNCTION__);                             \
+    _rtx; })
++#define RTL_FLAG_CHECK9(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8, C9)        \
++  __extension__                                                               \
++({ rtx const _rtx = (RTX);                                            \
++   if (GET_CODE(_rtx) != C1 && GET_CODE(_rtx) != C2                   \
++       && GET_CODE(_rtx) != C3 && GET_CODE(_rtx) != C4                        \
++       && GET_CODE(_rtx) != C5 && GET_CODE(_rtx) != C6                        \
++       && GET_CODE(_rtx) != C7 && GET_CODE(_rtx) != C8                        \
++       && GET_CODE(_rtx) != C9)                                               \
++     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,          \
++                           __FUNCTION__);                             \
++   _rtx; })
++
+ extern void rtl_check_failed_flag (const char *, rtx, const char *,
+                                  int, const char *)
+     ATTRIBUTE_NORETURN
+@@ -488,6 +500,7 @@
+ #define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)            (RTX)
+ #define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)                (RTX)
+ #define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)    (RTX)
++#define RTL_FLAG_CHECK9(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8, C9)        (RTX)
+ #endif
+ #define CLEAR_RTX_FLAGS(RTX)  \
+@@ -583,9 +596,9 @@
+ #define LOG_LINKS(INSN)       XEXP(INSN, 7)
+ #define RTX_INTEGRATED_P(RTX)                                         \
+-  (RTL_FLAG_CHECK8("RTX_INTEGRATED_P", (RTX), INSN, CALL_INSN,                \
++  (RTL_FLAG_CHECK9("RTX_INTEGRATED_P", (RTX), INSN, CALL_INSN,                \
+                  JUMP_INSN, INSN_LIST, BARRIER, CODE_LABEL, CONST,    \
+-                 NOTE)->integrated)
++                 PLUS, NOTE)->integrated)
+ #define RTX_UNCHANGING_P(RTX)                                         \
+   (RTL_FLAG_CHECK3("RTX_UNCHANGING_P", (RTX), REG, MEM, CONCAT)->unchanging)
+ #define RTX_FRAME_RELATED_P(RTX)                                      \
+@@ -1125,6 +1138,10 @@
+   (RTL_FLAG_CHECK3("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS,                \
+                  ASM_INPUT)->volatil)
++/* 1 if RTX is an SET rtx that is not eliminated for the stack protection.  */
++#define SET_VOLATILE_P(RTX)                                   \
++  (RTL_FLAG_CHECK1("SET_VOLATILE_P", (RTX), SET)->volatil)
++
+ /* 1 if RTX is a mem that refers to an aggregate, either to the
+    aggregate itself of to a field of the aggregate.  If zero, RTX may
+    or may not be such a reference.  */
+diff -uNr gcc-3.4.3.orig/gcc/simplify-rtx.c gcc-3.4.3/gcc/simplify-rtx.c
+--- gcc-3.4.3.orig/gcc/simplify-rtx.c  2004-10-10 23:53:35.000000000 +0200
++++ gcc-3.4.3/gcc/simplify-rtx.c       2004-11-24 18:35:31.858634056 +0100
+@@ -2287,6 +2287,7 @@
+   int n_ops = 2, input_ops = 2, input_consts = 0, n_consts;
+   int first, changed;
+   int i, j;
++  HOST_WIDE_INT fp_offset = 0;
+   memset (ops, 0, sizeof ops);
+@@ -2312,6 +2313,10 @@
+         switch (this_code)
+           {
+           case PLUS:
++          if (flag_propolice_protection
++              && XEXP (this_op, 0) == virtual_stack_vars_rtx
++              && GET_CODE (XEXP (this_op, 1)) == CONST_INT)
++            fp_offset = INTVAL (XEXP (this_op, 1));
+           case MINUS:
+             if (n_ops == 7)
+               return NULL_RTX;
+@@ -2473,11 +2478,24 @@
+       && GET_CODE (ops[n_ops - 1].op) == CONST_INT
+       && CONSTANT_P (ops[n_ops - 2].op))
+     {
+-      rtx value = ops[n_ops - 1].op;
+-      if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
+-      value = neg_const_int (mode, value);
+-      ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, INTVAL (value));
+-      n_ops--;
++      if (!flag_propolice_protection)
++      {
++        rtx value = ops[n_ops - 1].op;
++        if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
++          value = neg_const_int (mode, value);
++        ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, INTVAL (value));
++        n_ops--;
++      }
++      /* The stack protector keeps the addressing style of a local variable,
++       so it doesn't use neg_const_int function not to change
++       the offset value.  */
++      else {
++      HOST_WIDE_INT value = INTVAL (ops[n_ops - 1].op);
++      if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
++        value = -value;
++      ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, value);
++      n_ops--;
++      }
+     }
+   /* Count the number of CONSTs that we generated.  */
+@@ -2495,6 +2513,59 @@
+         || (n_ops + n_consts == input_ops && n_consts <= input_consts)))
+     return NULL_RTX;
++  if (flag_propolice_protection)
++    {
++      /* keep the addressing style of local variables
++       as (plus (virtual_stack_vars_rtx) (CONST_int x)).
++       For the case array[r-1],
++       converts from (+ (+VFP c1) (+r -1)) to (SET R (+VFP c1)) (+ R (+r -1)).
++
++       This loop finds ops[i] which is the register for the frame
++       addressing, Then, makes the frame addressing using the register and
++       the constant of ops[n_ops - 1].  */
++      for (i = 0; i < n_ops; i++)
++#ifdef FRAME_GROWS_DOWNWARD
++      if (ops[i].op == virtual_stack_vars_rtx)
++#else
++      if (ops[i].op == virtual_stack_vars_rtx
++          || ops[i].op == frame_pointer_rtx)
++#endif
++        {
++          if (GET_CODE (ops[n_ops - 1].op) == CONST_INT)
++            {
++              HOST_WIDE_INT value = INTVAL (ops[n_ops - 1].op);
++              if (value >= fp_offset)
++                {
++                  ops[i].op = plus_constant (ops[i].op, value);
++                  n_ops--;
++                }
++              else
++                {
++                  if (!force
++                      && (n_ops + 1 + n_consts > input_ops
++                          || (n_ops + 1 + n_consts == input_ops
++                              && n_consts <= input_consts)))
++                    return NULL_RTX;
++                  ops[n_ops - 1].op = GEN_INT (value-fp_offset);
++                  ops[i].op = plus_constant (ops[i].op, fp_offset);
++                }
++            }
++          /* keep the following address pattern;
++             (1) buf[BUFSIZE] is the first assigned variable.
++             (+ (+ fp -BUFSIZE) BUFSIZE)
++             (2) ((+ (+ fp 1) r) -1).  */
++          else if (fp_offset != 0)
++            return NULL_RTX;
++          /* keep the (+ fp 0) pattern for the following case;
++             (1) buf[i]: i: REG, buf: (+ fp 0) in !FRAME_GROWS_DOWNWARD
++             (2) argument: the address is (+ fp 0).  */
++          else if (fp_offset == 0)
++            return NULL_RTX;
++
++          break;
++        }
++    }
++
+   /* Put a non-negated operand first, if possible.  */
+   for (i = 0; i < n_ops && ops[i].neg; i++)
+diff -uNr gcc-3.4.3.orig/gcc/testsuite/gcc.dg/ssp-warn.c gcc-3.4.3/gcc/testsuite/gcc.dg/ssp-warn.c
+--- gcc-3.4.3.orig/gcc/testsuite/gcc.dg/ssp-warn.c     1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/testsuite/gcc.dg/ssp-warn.c  2003-11-21 09:41:19.000000000 +0100
+@@ -0,0 +1,32 @@
++/* { dg-do compile } */
++/* { dg-options "-fstack-protector" } */
++void
++test1()
++{
++  void intest1(int *a)
++    {
++      *a ++;
++    }
++  
++  char buf[80];
++
++  buf[0] = 0;
++} /* { dg-bogus "not protecting function: it contains functions" } */
++
++void
++test2(int n)
++{
++  char buf[80];
++  char vbuf[n];
++
++  buf[0] = 0;
++  vbuf[0] = 0;
++} /* { dg-bogus "not protecting variables: it has a variable length buffer" } */
++
++void
++test3()
++{
++  char buf[5];
++
++  buf[0] = 0;
++} /* { dg-bogus "not protecting function: buffer is less than 8 bytes long" } */
+diff -uNr gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute1.c gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute1.c
+--- gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute1.c 1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute1.c      2004-02-16 06:15:39.000000000 +0100
+@@ -0,0 +1,54 @@
++/* Test location changes of character array.  */
++
++void
++test(int i)
++{
++  int  ibuf1[10];
++  char buf[50];
++  int  ibuf2[10];
++  char buf2[50000];
++  int  ibuf3[10];
++  char *p;
++
++  /* c1: the frame offset of buf[0]
++     c2: the frame offset of buf2[0]
++  */
++  p= &buf[0]; *p=1;           /* expected rtl: (+ fp -c1) */
++  if (*p != buf[0])
++    abort();
++  p= &buf[5]; *p=2;           /* expected rtl: (+ fp -c1+5) */
++  if (*p != buf[5])
++    abort();
++  p= &buf[-1]; *p=3;          /* expected rtl: (+ (+ fp -c1) -1) */
++  if (*p != buf[-1])
++    abort();
++  p= &buf[49]; *p=4;          /* expected rtl: (+ fp -c1+49) */
++  if (*p != buf[49])
++    abort();
++  p = &buf[i+5]; *p=5;                /* expected rtl: (+ (+ fp -c1) (+ i 5)) */
++  if (*p != buf[i+5])
++    abort ();
++  p = buf - 1; *p=6;          /* expected rtl: (+ (+ fp -c1) -1) */
++  if (*p != buf[-1])
++    abort ();
++  p = 1 + buf; *p=7;          /* expected rtl: (+ (+ fp -c1) 1) */
++  if (*p != buf[1])
++    abort ();
++  p = &buf[1] - 1; *p=8;      /* expected rtl: (+ (+ fp -c1+1) -1) */
++  if (*p != buf[0])
++    abort ();
++
++  /* test big offset which is greater than the max value of signed 16 bit integer.  */
++  p = &buf2[45555]; *p=9;     /* expected rtl: (+ fp -c2+45555) */
++  if (*p != buf2[45555])
++    abort ();
++}
++
++int main()
++{
++  test(10);
++  exit(0);
++}
++
++
++  
+diff -uNr gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute2.c gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute2.c
+--- gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute2.c 1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute2.c      2003-11-22 09:44:33.000000000 +0100
+@@ -0,0 +1,49 @@
++void
++test(int i, char *j, int k)
++{
++  int  a[10];
++  char b;
++  int  c;
++  long *d;
++  char buf[50];
++  long e[10];
++  int  n;
++
++  a[0] = 4;
++  b = 5;
++  c = 6;
++  d = (long*)7;
++  e[0] = 8;
++
++  /* overflow buffer */
++  for (n = 0; n < 120; n++)
++    buf[n] = 0;
++  
++  if (j == 0 || *j != 2)
++    abort ();
++  if (a[0] == 0)
++    abort ();
++  if (b == 0)
++    abort ();
++  if (c == 0)
++    abort ();
++  if (d == 0)
++    abort ();
++  if (e[0] == 0)
++    abort ();
++
++  exit (0);
++}
++
++int main()
++{
++  int i, k;
++  int j[40];
++  i = 1;
++  j[39] = 2;
++  k = 3;
++  test(i, &j[39], k);
++}
++
++
++  
+diff -uNr gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute.exp gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute.exp
+--- gcc-3.4.3.orig/gcc/testsuite/gcc.misc-tests/ssp-execute.exp        1970-01-01 01:00:00.000000000 +0100
++++ gcc-3.4.3/gcc/testsuite/gcc.misc-tests/ssp-execute.exp     2004-06-02 13:23:36.000000000 +0200
+@@ -0,0 +1,35 @@
++#   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
++
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++# 
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++# 
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
++
++if $tracelevel then {
++    strace $tracelevel
++}
++
++# Load support procs.
++load_lib c-torture.exp
++
++#
++# main test loop
++#
++
++foreach src [lsort [glob -nocomplain $srcdir/$subdir/ssp-execute*.c]] {
++    # If we're only testing specific files and this isn't one of them, skip it.
++    if ![runtest_file_p $runtests $src] then {
++      continue
++    }
++
++    c-torture-execute $src -fstack-protector
++}
+diff -uNr gcc-3.4.3.orig/gcc/toplev.c gcc-3.4.3/gcc/toplev.c
+--- gcc-3.4.3.orig/gcc/toplev.c        2004-07-26 16:42:11.000000000 +0200
++++ gcc-3.4.3/gcc/toplev.c     2004-11-24 18:35:31.000000000 +0100
+@@ -79,6 +79,7 @@
+ #include "coverage.h"
+ #include "value-prof.h"
+ #include "alloc-pool.h"
++#include "protector.h"
+ #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
+ #include "dwarf2out.h"
+@@ -97,6 +98,10 @@
+                                  declarations for e.g. AIX 4.x.  */
+ #endif
++#ifdef STACK_PROTECTOR
++#include "protector.h"
++#endif
++
+ #ifndef HAVE_conditional_execution
+ #define HAVE_conditional_execution 0
+ #endif
+@@ -979,6 +984,15 @@
+    minimum function alignment.  Zero means no alignment is forced.  */
+ int force_align_functions_log;
++#if defined(STACK_PROTECTOR) && defined(STACK_GROWS_DOWNWARD)
++/* Nonzero means use propolice as a stack protection method */
++int flag_propolice_protection = 1;
++int flag_stack_protection = 0;
++#else
++int flag_propolice_protection = 0;
++int flag_stack_protection = 0;
++#endif
++
+ typedef struct
+ {
+   const char *const string;
+@@ -1154,7 +1168,9 @@
+   {"mem-report", &mem_report, 1 },
+   { "trapv", &flag_trapv, 1 },
+   { "wrapv", &flag_wrapv, 1 },
+-  { "new-ra", &flag_new_regalloc, 1 }
++  { "new-ra", &flag_new_regalloc, 1 },
++  {"stack-protector", &flag_propolice_protection, 1 },
++  {"stack-protector-all", &flag_stack_protection, 1 }
+ };
+ /* Here is a table, controlled by the tm.h file, listing each -m switch
+@@ -2686,6 +2702,9 @@
+   insns = get_insns ();
++  if (flag_propolice_protection)
++    prepare_stack_protection (inlinable);
++
+   /* Dump the rtl code if we are dumping rtl.  */
+   if (open_dump_file (DFI_rtl, decl))
+@@ -4483,6 +4502,12 @@
+     /* The presence of IEEE signaling NaNs, implies all math can trap.  */
+     if (flag_signaling_nans)
+       flag_trapping_math = 1;
++
++  /* This combination makes optimized frame addressings and causes
++    a internal compilation error at prepare_stack_protection.
++    so don't allow it.  */
++  if (flag_stack_protection && !flag_propolice_protection)
++    flag_propolice_protection = TRUE;
+ }
+ /* Initialize the compiler back end.  */
+diff -uNr gcc-3.4.3.orig/gcc/tree.h gcc-3.4.3/gcc/tree.h
+--- gcc-3.4.3.orig/gcc/tree.h  2004-11-24 18:04:19.000000000 +0100
++++ gcc-3.4.3/gcc/tree.h       2004-11-24 18:35:31.000000000 +0100
+@@ -1489,6 +1489,10 @@
+    where it is called.  */
+ #define DECL_INLINE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.inline_flag)
++/* In a VAR_DECL, nonzero if the declaration is copied for inlining.
++   The stack protector should keep its location in the stack.  */
++#define DECL_COPIED(NODE) (VAR_DECL_CHECK (NODE)->decl.inline_flag)
++
+ /* Nonzero in a FUNCTION_DECL means that this function was declared inline,
+    such as via the `inline' keyword in C/C++.  This flag controls the linkage
+    semantics of 'inline'; whether or not the function is inlined is
diff --git a/gcc3-visibility.patch b/gcc3-visibility.patch
new file mode 100644 (file)
index 0000000..877ff53
--- /dev/null
@@ -0,0 +1,702 @@
+diff -aur gcc-3.4.0orig/gcc/c-common.c gcc-3.4.0/gcc/c-common.c
+--- gcc-3.4.0orig/gcc/c-common.c       2004-03-19 01:32:59.000000000 +0000
++++ gcc-3.4.0/gcc/c-common.c   2004-05-10 21:05:33.000000000 +0100
+@@ -833,7 +833,7 @@
+                             handle_deprecated_attribute },
+   { "vector_size",          1, 1, false, true, false,
+                             handle_vector_size_attribute },
+-  { "visibility",           1, 1, true,  false, false,
++  { "visibility",           1, 1, false, false, false,
+                             handle_visibility_attribute },
+   { "tls_model",            1, 1, true,  false, false,
+                             handle_tls_model_attribute },
+@@ -4886,7 +4886,16 @@
+   *no_add_attrs = true;
+-  if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
++  if (TYPE_P (*node))
++    {
++      if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE)
++       {
++         warning ("`%s' attribute ignored on non-class types",
++                  IDENTIFIER_POINTER (name));
++         return NULL_TREE;
++       }
++    }
++  else if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
+     {
+       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+       return NULL_TREE;
+@@ -4897,6 +4906,14 @@
+       error ("visibility arg not a string");
+       return NULL_TREE;
+     }
++  
++  /*  If this is a type, set the visibility on the type decl.  */
++  if (TYPE_P (decl))
++    {
++      decl = TYPE_NAME (decl);
++      if (! decl)
++        return NULL_TREE;
++    }
+   if (strcmp (TREE_STRING_POINTER (id), "default") == 0)
+     DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
+@@ -4908,6 +4925,14 @@
+     DECL_VISIBILITY (decl) = VISIBILITY_PROTECTED;
+   else
+     error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"");
++  DECL_VISIBILITYSPECIFIED (decl) = 1;
++
++  /* For decls only, go ahead and attach the attribute to the node as well.
++     This is needed so we can determine whether we have VISIBILITY_DEFAULT
++     because the visibility was not specified, or because it was explicitly
++     overridden from the class visibility.  */
++  if (DECL_P (*node))
++    *no_add_attrs = false;
+   return NULL_TREE;
+ }
+
+diff -aur gcc-3.4.0orig/gcc/c-decl.c gcc-3.4.0/gcc/c-decl.c
+--- gcc-3.4.0orig/gcc/c-decl.c 2004-03-22 17:58:18.000000000 +0000
++++ gcc-3.4.0/gcc/c-decl.c     2004-05-10 15:16:27.000000000 +0100
+@@ -1164,9 +1164,8 @@
+     }
+   /* warnings */
+-  /* All decls must agree on a non-default visibility.  */
+-  if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT
+-      && DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT
++  /* All decls must agree on a visibility.  */
++  if (DECL_VISIBILITYSPECIFIED (newdecl) && DECL_VISIBILITYSPECIFIED (olddecl)
+       && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
+     {
+       warning ("%Jredeclaration of '%D' with different visibility "
+@@ -1361,9 +1360,12 @@
+      Currently, it can only be defined in the prototype.  */
+   COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
+-  /* If either declaration has a nondefault visibility, use it.  */
+-  if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT)
+-    DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
++  /* Use visibility of whichever declaration had it specified */
++  if (DECL_VISIBILITYSPECIFIED (olddecl))
++    {
++      DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
++      DECL_VISIBILITYSPECIFIED (newdecl) = 1;
++    }
+   if (TREE_CODE (newdecl) == FUNCTION_DECL)
+     {
+
+diff -aur gcc-3.4.0orig/gcc/common.opt gcc-3.4.0/gcc/common.opt
+--- gcc-3.4.0orig/gcc/common.opt       2004-02-18 00:09:04.000000000 +0000
++++ gcc-3.4.0/gcc/common.opt   2004-05-09 08:10:50.000000000 +0100
+@@ -718,6 +718,11 @@
+ Common
+ Add extra commentary to assembler output
++fvisibility=
++Common Joined RejectNegative
++-fvisibility=[default|internal|hidden|protected]      Set the default symbol visibility
++
++
+ fvpt
+ Common
+ Use expression value profiles in optimizations
+
+diff -aur gcc-3.4.0orig/gcc/c.opt gcc-3.4.0/gcc/c.opt
+--- gcc-3.4.0orig/gcc/c.opt    2004-02-18 00:09:03.000000000 +0000
++++ gcc-3.4.0/gcc/c.opt        2004-05-09 08:10:50.000000000 +0100
+@@ -656,6 +656,10 @@
+ C++ ObjC++
+ Use __cxa_atexit to register destructors
++fvisibility-inlines-hidden
++C++
++Marks all inlined methods as having hidden visibility
++
+ fvtable-gc
+ C++ ObjC++
+ Discard unused virtual functions
+diff -aur gcc-3.4.0orig/gcc/c-opts.c gcc-3.4.0/gcc/c-opts.c
+--- gcc-3.4.0orig/gcc/c-opts.c 2004-02-18 00:09:03.000000000 +0000
++++ gcc-3.4.0/gcc/c-opts.c     2004-05-09 08:10:50.000000000 +0100
+@@ -912,6 +912,10 @@
+     case OPT_fuse_cxa_atexit:
+       flag_use_cxa_atexit = value;
+       break;
++      
++    case OPT_fvisibility_inlines_hidden:
++      visibility_options.inlineshidden = value;
++      break;
+     case OPT_fweak:
+       flag_weak = value;
+
+diff -aur gcc-3.4.0orig/gcc/cp/class.c gcc-3.4.0/gcc/cp/class.c
+--- gcc-3.4.0orig/gcc/cp/class.c       2004-03-09 07:27:23.000000000 +0000
++++ gcc-3.4.0/gcc/cp/class.c   2004-05-10 21:06:50.000000000 +0100
+@@ -524,6 +524,10 @@
+   DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node),
+                          DECL_ALIGN (decl));
++  /* The vtable's visibility is the class visibility.  There is no way
++     to override the visibility for just the vtable. */
++  DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
++  DECL_VISIBILITYSPECIFIED (decl) = CLASSTYPE_VISIBILITYSPECIFIED (class_type);
+   import_export_vtable (decl, class_type, 0);
+   return decl;
+@@ -2971,7 +2975,25 @@
+       continue;
+         
+       if (TREE_CODE (x) == CONST_DECL || TREE_CODE (x) == VAR_DECL)
+-      continue;
++      {
++        /* Apply the class's visibility attribute to static members
++           which do not have a visibility attribute. */
++        if (! lookup_attribute ("visibility", DECL_ATTRIBUTES (x)))
++            {
++              if (visibility_options.inlineshidden && DECL_INLINE (x))
++                {
++                  DECL_VISIBILITY (x) = VISIBILITY_HIDDEN;
++                  DECL_VISIBILITYSPECIFIED (x) = 1;
++                }
++              else
++                {
++                  DECL_VISIBILITY (x) = CLASSTYPE_VISIBILITY (current_class_type);
++                  DECL_VISIBILITYSPECIFIED (x) = CLASSTYPE_VISIBILITYSPECIFIED (current_class_type);
++                }
++            }
++
++        continue;
++      }
+       /* Now it can only be a FIELD_DECL.  */
+@@ -3708,6 +3730,22 @@
+       check_for_override (x, t);
+       if (DECL_PURE_VIRTUAL_P (x) && ! DECL_VINDEX (x))
+       cp_error_at ("initializer specified for non-virtual method `%D'", x);
++ 
++      /* Apply the class's visibility attribute to methods which do
++       not have a visibility attribute. */
++      if (! lookup_attribute ("visibility", DECL_ATTRIBUTES (x)))
++        {
++          if (visibility_options.inlineshidden && DECL_INLINE (x))
++            {
++              DECL_VISIBILITY (x) = VISIBILITY_HIDDEN;
++              DECL_VISIBILITYSPECIFIED (x) = 1;
++            }
++          else
++            {
++              DECL_VISIBILITY (x) = CLASSTYPE_VISIBILITY (current_class_type);
++              DECL_VISIBILITYSPECIFIED (x) = CLASSTYPE_VISIBILITYSPECIFIED (current_class_type);
++            }
++        }
+       /* The name of the field is the original field name
+        Save this in auxiliary field for later overloading.  */
+@@ -7830,3 +7868,4 @@
+   *vid->last_init = build_tree_list (NULL_TREE, init);
+   vid->last_init = &TREE_CHAIN (*vid->last_init);
+ }
++
+
+diff -aur gcc-3.4.0orig/gcc/cp/cp-tree.h gcc-3.4.0/gcc/cp/cp-tree.h
+--- gcc-3.4.0orig/gcc/cp/cp-tree.h     2004-03-20 00:13:08.000000000 +0000
++++ gcc-3.4.0/gcc/cp/cp-tree.h 2004-05-10 20:56:56.000000000 +0100
+@@ -1008,7 +1008,12 @@
+ #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \
+   (lookup_base ((TYPE), (PARENT),  ba_not_special | ba_quiet, NULL) \
+    != NULL_TREE)
+-\f
++
++/* Gives the visibility specification for a class type.  */
++#define CLASSTYPE_VISIBILITY(TYPE)            DECL_VISIBILITY (TYPE_NAME (TYPE))
++#define CLASSTYPE_VISIBILITYSPECIFIED(TYPE)   DECL_VISIBILITYSPECIFIED (TYPE_NAME (TYPE))
++
++
+ /* This is a few header flags for 'struct lang_type'.  Actually,
+    all but the first are used only for lang_type_class; they
+    are put in this structure to save space.  */
+
+diff -aur gcc-3.4.0orig/gcc/cp/decl.c gcc-3.4.0/gcc/cp/decl.c
+--- gcc-3.4.0orig/gcc/cp/decl.c        2004-04-01 21:47:21.000000000 +0100
++++ gcc-3.4.0/gcc/cp/decl.c    2004-05-28 21:16:11.000000000 +0100
+@@ -1869,17 +1869,34 @@
+   DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
+   COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
+-  /* If either declaration has a nondefault visibility, use it.  */
+-  if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT)
++  /* Warn about conflicting visibility specifications.  */
++  if (DECL_VISIBILITYSPECIFIED (olddecl) && DECL_VISIBILITYSPECIFIED (newdecl)
++      && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
++    {
++      warning ("%J'%D': visibility attribute ignored because it",
++        newdecl, newdecl);
++      warning ("%Jconflicts with previous declaration here", olddecl);
++    }
++  /* Choose the declaration which specified visibility.  */
++  if (DECL_VISIBILITYSPECIFIED (olddecl))
+     {
+-      if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT
+-        && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
+-      {
+-        warning ("%J'%D': visibility attribute ignored because it",
+-                 newdecl, newdecl);
+-        warning ("%Jconflicts with previous declaration here", olddecl);
+-      }
+       DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
++      DECL_VISIBILITYSPECIFIED (newdecl) = 1;
++    }
++  /* If it's a definition of a global operator new or operator
++     delete, it must be default visibility.  */
++  if (NEW_DELETE_OPNAME_P (DECL_NAME (newdecl)) && DECL_INITIAL (newdecl) != NULL_TREE)
++    {
++      if (!DECL_FUNCTION_MEMBER_P (newdecl) && VISIBILITY_DEFAULT != DECL_VISIBILITY (newdecl))
++        {
++          warning ("%J`%D': ignoring non-default symbol",
++            newdecl, newdecl);
++          warning ("%Jvisibility on global operator new or delete", newdecl);
++          DECL_VISIBILITY (olddecl) = VISIBILITY_DEFAULT;
++          DECL_VISIBILITYSPECIFIED (olddecl) = 1;
++          DECL_VISIBILITY (newdecl) = VISIBILITY_DEFAULT;
++          DECL_VISIBILITYSPECIFIED (newdecl) = 1;
++        }
+     }
+   if (TREE_CODE (newdecl) == FUNCTION_DECL)
+
+diff -aur gcc-3.4.0orig/gcc/cp/method.c gcc-3.4.0/gcc/cp/method.c
+--- gcc-3.4.0orig/gcc/cp/method.c      2004-04-08 23:15:58.000000000 +0100
++++ gcc-3.4.0/gcc/cp/method.c  2004-05-09 08:10:52.000000000 +0100
+@@ -394,6 +394,7 @@
+      rewrite.  */
+   TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
+   DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
++  DECL_VISIBILITYSPECIFIED (thunk_fndecl) = DECL_VISIBILITYSPECIFIED (function);
+   if (flag_syntax_only)
+     {
+
+diff -aur gcc-3.4.0orig/gcc/cp/optimize.c gcc-3.4.0/gcc/cp/optimize.c
+--- gcc-3.4.0orig/gcc/cp/optimize.c    2004-02-08 01:52:50.000000000 +0000
++++ gcc-3.4.0/gcc/cp/optimize.c        2004-05-09 08:10:52.000000000 +0100
+@@ -155,6 +155,7 @@
+       DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn);
+       TREE_PUBLIC (clone) = TREE_PUBLIC (fn);
+       DECL_VISIBILITY (clone) = DECL_VISIBILITY (fn);
++      DECL_VISIBILITYSPECIFIED (clone) = DECL_VISIBILITYSPECIFIED (fn);
+       /* Adjust the parameter names and locations.  */
+       parm = DECL_ARGUMENTS (fn);
+
+diff -aur gcc-3.4.0orig/gcc/cp/rtti.c gcc-3.4.0/gcc/cp/rtti.c
+--- gcc-3.4.0orig/gcc/cp/rtti.c        2004-03-08 23:00:26.000000000 +0000
++++ gcc-3.4.0/gcc/cp/rtti.c    2004-05-10 21:09:21.000000000 +0100
+@@ -361,7 +361,11 @@
+       pushdecl_top_level_and_finish (d, NULL_TREE);
+       if (CLASS_TYPE_P (type))
+-      CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
++      {
++        CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
++        DECL_VISIBILITY (d) = CLASSTYPE_VISIBILITY (type);
++        DECL_VISIBILITYSPECIFIED (d) = CLASSTYPE_VISIBILITYSPECIFIED (type);
++      }
+       /* Remember the type it is for.  */
+       TREE_TYPE (name) = type;
+@@ -759,6 +763,11 @@
+     TREE_STATIC (name_decl) = 1;
+     DECL_EXTERNAL (name_decl) = 0;
+     TREE_PUBLIC (name_decl) = 1;
++    if (CLASS_TYPE_P (target))
++      {
++        DECL_VISIBILITY (name_decl) = CLASSTYPE_VISIBILITY (target);
++        DECL_VISIBILITYSPECIFIED (name_decl) = CLASSTYPE_VISIBILITYSPECIFIED (target);
++      }
+     import_export_tinfo (name_decl, target, typeinfo_in_lib_p (target));
+     /* External name of the string containing the type's name has a
+        special name.  */
+
+diff -aur gcc-3.4.0orig/gcc/c-pragma.c gcc-3.4.0/gcc/c-pragma.c
+--- gcc-3.4.0orig/gcc/c-pragma.c       2004-01-23 23:35:53.000000000 +0000
++++ gcc-3.4.0/gcc/c-pragma.c   2004-05-09 08:10:52.000000000 +0100
+@@ -480,6 +480,86 @@
+   return asmname;
+ }
++
++#ifdef HANDLE_PRAGMA_VISIBILITY
++static void handle_pragma_visibility (cpp_reader *);
++
++/* Sets the default visibility for symbols to something other than that
++   specified on the command line.  */
++static void
++handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
++{ /* Form is #pragma GCC visibility push(hidden)|pop */
++  static int visstack [16], visidx;
++  tree x;
++  enum cpp_ttype token;
++  enum { bad, push, pop } action = bad;
++ 
++  token = c_lex (&x);
++  if (token == CPP_NAME)
++    {
++      const char *op = IDENTIFIER_POINTER (x);
++      if (!strcmp (op, "push"))
++        action = push;
++      else if (!strcmp (op, "pop"))
++        action = pop;
++    }
++  if (bad == action)
++    GCC_BAD ("#pragma GCC visibility must be followed by push or pop");
++  else
++    {
++      if (pop == action)
++        {
++          if (!visidx)
++            {
++              GCC_BAD ("No matching push for '#pragma GCC visibility pop'");
++            }
++          else
++            {
++              default_visibility = visstack[--visidx];
++              visibility_options.inpragma = (visidx>0);
++            }
++        }
++      else
++        {
++          if (c_lex (&x) != CPP_OPEN_PAREN)
++            GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored");
++          token = c_lex (&x);
++          if (token != CPP_NAME)
++            {
++              GCC_BAD ("malformed #pragma GCC visibility push");
++            }
++          else if (visidx >= 16)
++            {
++              GCC_BAD ("No more than sixteen #pragma GCC visibility pushes allowed at once");
++            }
++          else
++            {
++              const char *str = IDENTIFIER_POINTER (x);
++              visstack[visidx++] = default_visibility;
++              if (!strcmp (str, "default"))
++                default_visibility = VISIBILITY_DEFAULT;
++              else if (!strcmp (str, "internal"))
++                default_visibility = VISIBILITY_INTERNAL;
++              else if (!strcmp (str, "hidden"))
++                default_visibility = VISIBILITY_HIDDEN;  
++              else if (!strcmp (str, "protected"))
++                default_visibility = VISIBILITY_PROTECTED;
++              else
++                {
++                  GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected");
++                }
++              visibility_options.inpragma = 1;
++            }
++          if (c_lex (&x) != CPP_CLOSE_PAREN)
++            GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored");
++        }
++    }
++  if (c_lex (&x) != CPP_EOF)
++    warning ("junk at end of '#pragma GCC visibility'");
++}
++
++#endif
++
+ /* Front-end wrapper for pragma registration to avoid dragging
+    cpplib.h in almost everywhere.  */
+ void
+@@ -505,6 +585,9 @@
+ #ifdef HANDLE_PRAGMA_EXTERN_PREFIX
+   c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix);
+ #endif
++#ifdef HANDLE_PRAGMA_VISIBILITY
++  c_register_pragma ("GCC", "visibility", handle_pragma_visibility);
++#endif
+ #ifdef REGISTER_TARGET_PRAGMAS
+   REGISTER_TARGET_PRAGMAS ();
+diff -aur gcc-3.4.0orig/gcc/c-pragma.h gcc-3.4.0/gcc/c-pragma.h
+--- gcc-3.4.0orig/gcc/c-pragma.h       2004-01-31 06:18:05.000000000 +0000
++++ gcc-3.4.0/gcc/c-pragma.h   2004-05-09 08:10:53.000000000 +0100
+@@ -44,6 +44,11 @@
+ #define HANDLE_PRAGMA_PACK 1
+ #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */
++/* It's safe to always leave visibility pragma enabled as if
++   visibility is not supported on the host OS platform the
++   statements are ignored.  */
++#define HANDLE_PRAGMA_VISIBILITY 1
++
+ extern void init_pragma (void);
+ /* Front-end wrapper for pragma registration to avoid dragging
+
+
+diff -aur gcc-3.4.0orig/gcc/doc/invoke.texi gcc-3.4.0/gcc/doc/invoke.texi
+--- gcc-3.4.0orig/gcc/doc/invoke.texi  2004-04-19 00:05:36.000000000 +0100
++++ gcc-3.4.0/gcc/doc/invoke.texi      2004-05-28 21:29:36.000000000 +0100
+@@ -183,7 +183,8 @@
+ -fno-optional-diags  -fpermissive @gol
+ -frepo  -fno-rtti  -fstats  -ftemplate-depth-@var{n} @gol
+ -fuse-cxa-atexit  -fno-weak  -nostdinc++ @gol
+--fno-default-inline  -Wabi  -Wctor-dtor-privacy @gol
++-fno-default-inline  -fvisibility-inlines-hidden @gol
++-Wabi  -Wctor-dtor-privacy @gol
+ -Wnon-virtual-dtor  -Wreorder @gol
+ -Weffc++  -Wno-deprecated @gol
+ -Wno-non-template-friend  -Wold-style-cast @gol
+@@ -674,7 +675,8 @@
+ -fargument-alias  -fargument-noalias @gol
+ -fargument-noalias-global  -fleading-underscore @gol
+ -ftls-model=@var{model} @gol
+--ftrapv  -fwrapv  -fbounds-check}
++-ftrapv  -fwrapv  -fbounds-check @gol
++-fvisibility}
+ @end table
+ @menu
+@@ -1433,6 +1435,20 @@
+ destructors, but will only work if your C library supports
+ @code{__cxa_atexit}.
++@item -fvisibility-inlines-hidden
++@opindex fvisibility-inlines-hidden
++Causes all inlined methods to be marked with
++@code{__attribute__ ((visibility ("hidden")))} so that they do not
++appear in the export table of a DSO and do not require a PLT indirection
++when used within the DSO. Enabling this option can have a dramatic effect
++on load and link times of a DSO as it massively reduces the size of the
++dynamic export table when the library makes heavy use of templates. While
++it can cause bloating through duplication of code within each DSO where
++it is used, often the wastage is less than the considerable space occupied
++by a long symbol name in the export table which is typical when using
++templates and namespaces. For even more savings, combine with the
++@code{-fvisibility=hidden} switch.
++
+ @item -fno-weak
+ @opindex fno-weak
+ Do not use weak symbol support, even if it is provided by the linker.
+@@ -11198,6 +11214,54 @@
+ The default without @option{-fpic} is @code{initial-exec}; with
+ @option{-fpic} the default is @code{global-dynamic}.
++
++@item -fvisibility=@var{default|internal|hidden|protected}
++@opindex fvisibility
++Set the default ELF image symbol visibility to the specified option - all
++symbols will be marked with this unless overrided within the code.
++Using this feature can very substantially improve linking and
++load times of shared object libraries, produce more optimised
++code, provide near-perfect API export and prevent symbol clashes.
++It is @strong{strongly} recommended that you use this in any shared objects
++you distribute.
++     
++Despite the nomenclature, @code{default} always means public ie;
++available to be linked against from outside the shared object.
++@code{protected} and @code{internal} are pretty useless in real-world
++usage so the only other commonly used option will be @code{hidden}.
++The default if -fvisibility isn't specified is @code{default} ie; make every
++symbol public - this causes the same behaviour as previous versions of
++GCC.
++     
++A good explanation of the benefits offered by ensuring ELF
++symbols have the correct visibility is given by ``How To Write
++Shared Libraries'' by Ulrich Drepper (which can be found at
++@w{@uref{http://people.redhat.com/~drepper/}}) - however a superior
++solution made possible by this option to marking things hidden when
++the default is public is to make the default hidden and mark things
++public. This is the norm with DLL's on Windows and with @option{-fvisibility=hidden}
++and @code{__attribute__ ((visibility("default")))} instead of
++@code{__declspec(dllexport)} you get almost identical semantics with
++identical syntax. This is a great boon to those working with
++cross-platform projects.
++
++For those adding visibility support to existing code, you may find
++@samp{#pragma GCC visibility} of use. This works by you enclosing
++the declarations you wish to set visibility for with (for example)
++@samp{#pragma GCC visibility push(hidden)} and
++@samp{#pragma GCC visibility pop}. These can be nested up to sixteen
++times. Bear in mind that symbol visibility should be viewed @strong{as
++part of the API interface contract} and thus all new code should
++always specify visibility when it is not the default ie; declarations
++only for use within the local DSO should @strong{always} be marked explicitly
++as hidden as so to avoid PLT indirection overheads - making this
++abundantly clear also aids readability and self-documentation of the code.
++Note that due to ISO C++ specification requirements, operator new and
++operator delete must always be of default visibility.
++
++An overview of these techniques, their benefits and how to use them
++is at @w{@uref{http://www.nedprod.com/programs/gccvisibility.html}}.
++
+ @end table
+ @c man end
+
+diff -aur gcc-3.4.0orig/gcc/flags.h gcc-3.4.0/gcc/flags.h
+--- gcc-3.4.0orig/gcc/flags.h  2004-02-18 00:09:04.000000000 +0000
++++ gcc-3.4.0/gcc/flags.h      2004-05-09 08:10:53.000000000 +0100
+@@ -60,6 +60,30 @@
+ /* Nonzero means emit debugging information only for symbols which are used.  */
+ extern int flag_debug_only_used_symbols;
++/* Enumerate visibility settings.  */
++#ifndef SYMBOL_VISIBILITY_DEFINED
++#define SYMBOL_VISIBILITY_DEFINED
++enum symbol_visibility
++{
++  VISIBILITY_DEFAULT,
++  VISIBILITY_INTERNAL,
++  VISIBILITY_HIDDEN,
++  VISIBILITY_PROTECTED
++};
++#endif
++
++/* The default visibility for all symbols (unless overridden).  */
++extern enum symbol_visibility default_visibility;
++
++struct visibility_flags
++{
++  unsigned inpragma : 1;      /* True when in #pragma GCC visibility.  */
++  unsigned inlineshidden : 1; /* True when -finlineshidden in effect.  */
++};
++
++/* Global visibility options.  */
++extern struct visibility_flags visibility_options;
++
+ /* Nonzero means do optimizations.  -opt.  */
+ extern int optimize;
+
+diff -aur gcc-3.4.0orig/gcc/opts.c gcc-3.4.0/gcc/opts.c
+--- gcc-3.4.0orig/gcc/opts.c   2004-02-18 00:09:04.000000000 +0000
++++ gcc-3.4.0/gcc/opts.c       2004-05-09 08:10:53.000000000 +0100
+@@ -142,6 +142,12 @@
+    write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
+ bool use_gnu_debug_info_extensions;
++/* The default visibility for all symbols (unless overridden) */
++enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
++
++/* Global visibility options.  */
++struct visibility_flags visibility_options;
++
+ /* Columns of --help display.  */
+ static unsigned int columns = 80;
+@@ -1440,6 +1446,21 @@
+       flag_verbose_asm = value;
+       break;
++    case OPT_fvisibility_:
++      {
++        if(!strcmp(arg, "default"))
++          default_visibility=VISIBILITY_DEFAULT;
++        else if(!strcmp(arg, "internal"))
++          default_visibility=VISIBILITY_INTERNAL;
++        else if(!strcmp(arg, "hidden"))
++          default_visibility=VISIBILITY_HIDDEN;
++        else if(!strcmp(arg, "protected"))
++          default_visibility=VISIBILITY_PROTECTED;
++        else
++          error("unrecognised visibility value \"%s\"", arg);
++      }
++      break;
++
+     case OPT_fweb:
+       flag_web = value;
+       break;
+
+diff -aur gcc-3.4.0orig/gcc/tree.c gcc-3.4.0/gcc/tree.c
+--- gcc-3.4.0orig/gcc/tree.c   2004-02-05 22:01:35.000000000 +0000
++++ gcc-3.4.0/gcc/tree.c       2004-05-10 15:22:52.000000000 +0100
+@@ -2563,6 +2563,11 @@
+     layout_decl (t, 0);
+   else if (code == FUNCTION_DECL)
+     DECL_MODE (t) = FUNCTION_MODE;
++    
++  /* Set default visibility to whatever the user supplied with
++     visibility_specified depending on #pragma GCC visibility.  */
++  DECL_VISIBILITY (t) = default_visibility;
++  DECL_VISIBILITYSPECIFIED (t) = visibility_options.inpragma;
+   return t;
+ }
+
+diff -aur gcc-3.4.0orig/gcc/tree.h gcc-3.4.0/gcc/tree.h
+--- gcc-3.4.0orig/gcc/tree.h   2004-02-08 01:52:43.000000000 +0000
++++ gcc-3.4.0/gcc/tree.h       2004-05-09 08:10:54.000000000 +0100
+@@ -1499,6 +1499,10 @@
+ /* Value of the decls's visibility attribute */
+ #define DECL_VISIBILITY(NODE) (DECL_CHECK (NODE)->decl.visibility)
++/* Nonzero means that the decl had its visibility specified rather than
++   being inferred.  */
++#define DECL_VISIBILITYSPECIFIED(NODE) (DECL_CHECK (NODE)->decl.visibility_specified)
++
+ /* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
+ #define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.uninlinable)
+@@ -1633,7 +1637,8 @@
+    || TREE_CODE (DECL_CONTEXT (EXP)) == TRANSLATION_UNIT_DECL)
+ /* Enumerate visibility settings.  */
+-
++#ifndef SYMBOL_VISIBILITY_DEFINED
++#define SYMBOL_VISIBILITY_DEFINED
+ enum symbol_visibility
+ {
+   VISIBILITY_DEFAULT,
+@@ -1641,6 +1646,7 @@
+   VISIBILITY_HIDDEN,
+   VISIBILITY_PROTECTED
+ };
++#endif
+ struct function;
+@@ -1684,8 +1690,7 @@
+   unsigned thread_local_flag : 1;
+   unsigned declared_inline_flag : 1;
+   ENUM_BITFIELD(symbol_visibility) visibility : 2;
+-  unsigned unused : 1;
+-  /* one unused bit.  */
++  unsigned visibility_specified : 1;
+   unsigned lang_flag_0 : 1;
+   unsigned lang_flag_1 : 1;
+
+diff -aur gcc-3.4.0orig/gcc/varasm.c gcc-3.4.0/gcc/varasm.c
+--- gcc-3.4.0orig/gcc/varasm.c 2004-04-14 22:14:08.000000000 +0100
++++ gcc-3.4.0/gcc/varasm.c     2004-05-09 08:10:54.000000000 +0100
+@@ -5150,8 +5150,8 @@
+   /* Static variables are always local.  */
+   else if (! TREE_PUBLIC (exp))
+     local_p = true;
+-  /* A variable is local if the user tells us so.  */
+-  else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
++  /* A variable is local if the user explicitly tells us so.  */
++  else if (DECL_VISIBILITYSPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
+     local_p = true;
+   /* Otherwise, variables defined outside this object may not be local.  */
+   else if (DECL_EXTERNAL (exp))
+@@ -5159,6 +5159,9 @@
+   /* Linkonce and weak data are never local.  */
+   else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp))
+     local_p = false;
++  /* If none of the above and visibility is not default, make local.  */
++  else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)
++    local_p = true;
+   /* If PIC, then assume that any global name can be overridden by
+      symbols resolved from other modules.  */
+   else if (shlib)
+
This page took 1.025377 seconds and 4 git commands to generate.