- 30 May, 2018 17 commits
-
-
2018-05-30 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_ch3.adb (Access_Subprogram_Declaration): The flag Needs_Activation_Record is only needed on a subprogram type, not on a pointer to such. * sem_res.adb (Resolve_Selected_Component): If the context type and the component type are anonymous access to subprograms, use the component type to obtain the proper value of Needs_Activation_Record flag for the expression. From-SVN: r260932
Ed Schonberg committed -
2018-05-30 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Add comment about the memset case. From-SVN: r260931
Eric Botcazou committed -
This patch fixes a memory leak bug. In particular, in a loop of the form "for X of ...", with a type that has the Iterable aspect specified, if the result of the Element function is returned on the secondary stack (e.g. the result subtype has caller-unknown size), then memory for the secondary stack could leak. 2018-05-30 Bob Duff <duff@adacore.com> gcc/ada/ * exp_ch5.adb (Expand_Formal_Container_Element_Loop): Remove the code to analyze the Elmt_Decl, because it gets analyzed in the wrong scope. We need to analyze it as part of analyzing the block, so that if the call to Element that initializes Elmt_Decl returns on the secondary stack, the block will ss_mark/ss_release. This block is inside the loop; we don't want to leak memory until the loop exits. The purpose of analyzing Elmt_Decl first was to catch the error of modifying it, which is illegal because it's a loop parameter. The above causes us to miss that error. Therefore, we add a flag Is_Loop_Parameter, and set it on the Element entity, so we end up with an E_Variable node with the flag set. * einfo.ads, einfo.adb (Is_Loop_Parameter): New flag. * sem_ch5.adb (Diagnose_Non_Variable_Lhs): Give the "assignment to loop parameter not allowed" error if Is_Loop_Parameter. * sem_util.adb (Is_Variable): Return False if Is_Loop_Parameter, to trigger the call to Diagnose_Non_Variable_Lhs. From-SVN: r260930
Bob Duff committed -
2018-05-30 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * checks.adb (Apply_Scalar_Range_Check): * sem_eval.adb (Check_Non_Static_Context, Out_Of_Range): Ignore out of range values for System.Priority in CodePeer mode since the actual target compiler may provide a wider range. From-SVN: r260929
Arnaud Charlet committed -
2018-05-30 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_unst.adb: Search specification of main unit as well, for unnesting. From-SVN: r260928
Ed Schonberg committed -
2018-05-30 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_ch7.adb (Check_Unnesting_Elaboration_Code): The statement part of a package body that is a compilation unit may contain blocks that declare local subprograms. In Subprogram_Unnesting Mode such subprograms must be handled as nested inside the (implicit) elaboration procedure that executes that statement part. To handle properly uplevel references we construct that subprogram explicitly, to contain blocks and inner subprograms, The statement part of the compilation unit becomes a call to this subprogram. This is only done if blocks are present in the statement list of the body. From-SVN: r260927
Ed Schonberg committed -
2018-05-30 Bob Duff <duff@adacore.com> gcc/ada/ * exp_ch7.adb: Minor comment fix. From-SVN: r260926
Bob Duff committed -
2018-05-30 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_unst.adb (Visit_Node): Handle properly subprogram instantiations that have no corresponding body and appear as attributes of the corresponding wrapper package declaration. (Register_Subprogram): New subprogram, used for subprogram bodies and for subprogram instantiations to enter callable entity into Subp table. From-SVN: r260925
Ed Schonberg committed -
This patch reimplements the secondary stack runtime support as follows: * The compiler interface remains unchanged. This applies to both types and subprograms used by the compiler to create and manage secondary stacks. * The secondary stack is no longer a doubly linked list of chunks. * Various allocation scenarios are now handled by the same mechanism. In addition, the patch introduces a lightweight private interface for testing purposes. ------------ -- Source -- ------------ -- comparator.ads generic type Field_Typ is private; -- The type of the field being compared with function Image (Val : Field_Typ) return String; -- Field-to-String converted procedure Comparator (Field_Nam : String; Actual_Val : Field_Typ; Expected_Val : Field_Typ); -- Compare actual value Actual_Val against expected value Expected_Val for -- field Field_Nam. Emit an error if this is not the case. -- comparator.adb with Ada.Text_IO; use Ada.Text_IO; procedure Comparator (Field_Nam : String; Actual_Val : Field_Typ; Expected_Val : Field_Typ) is begin if Actual_Val /= Expected_Val then Put_Line (Field_Nam); Put_Line (" Actual :" & Image (Actual_Val)); Put_Line (" Expected :" & Image (Expected_Val)); end if; end Comparator; -- debugger.ads package Debugger is Verbouse : constant Boolean := False; -- Set to True in order to obtain verbouse output procedure Output (Msg : String); -- Emit Msg to standard output if Verbouse is True end Debugger; -- debugger.adb with Ada.Text_IO; use Ada.Text_IO; package body Debugger is ------------ -- Output -- ------------ procedure Output (Msg : String) is begin if Verbouse then Put_Line (Msg); end if; end Output; end Debugger; -- s-sestte.ads package System.Secondary_Stack.Tester is procedure Test_Dynamic_Stack_Dynamic_Chunks; -- Test various properties of a dynamic stack's dynamic chunks procedure Test_Dynamic_Stack_Illegal_Allocations; -- Test whether illegal allocations on a dynamic stack are properly -- detected and reported. procedure Test_Dynamic_Stack_Static_Chunk; -- Test various properties of a dynamic stack's static chunk procedure Test_Dynamic_Stack_Zero_Chunk_Size; -- Test various properties of a dynamic stack with default chunk size of -- zero. procedure Test_Static_Stack_Illegal_Allocations; -- Test whether illegal allocations on a static stack are properly -- detected and reported. procedure Test_Static_Stack_Overflow; -- Test whether overflow of a static stack's static chunk is properly -- detected and reported. procedure Test_Static_Stack_Static_Chunk; -- Test various properties of a static chunk's static chunk end System.Secondary_Stack.Tester; -- s-sestte.adb with Ada.Assertions; use Ada.Assertions; with Ada.Text_IO; use Ada.Text_IO; with System; use System; with System.Parameters; use System.Parameters; with System.Soft_Links; use System.Soft_Links; with System.Storage_Elements; use System.Storage_Elements; with Comparator; with Debugger; use Debugger; package body System.Secondary_Stack.Tester is Units : constant := Standard'Maximum_Alignment; -- Each allocation of the secondary stack is rouded up to the nearest -- multiple of the maximum alignment. This value is called a "unit" in -- order to facilitate further allocations. ----------------------- -- Local subprograms -- ----------------------- procedure Compare_Boolean is new Comparator (Field_Typ => Boolean, Image => Boolean'Image); procedure Compare_Chunk_Count is new Comparator (Field_Typ => Chunk_Count, Image => Chunk_Count'Image); procedure Compare_Chunk_Id is new Comparator (Field_Typ => Chunk_Id, Image => Chunk_Id'Image); procedure Compare_Memory_Index is new Comparator (Field_Typ => Memory_Index, Image => Memory_Index'Image); procedure Compare_Memory_Size is new Comparator (Field_Typ => Memory_Size, Image => Memory_Size'Image); procedure Compare_MSWI is new Comparator (Field_Typ => Memory_Size_With_Invalid, Image => Memory_Size_With_Invalid'Image); procedure Initialize_Stack (Size : Memory_Size); -- Create a new secondary stack for the calling task where the default -- chunk size is Size. procedure Match_Chunk (Match_Nam : String; Actual : Chunk_Info; Expected : Chunk_Info); -- Check whether actual chunk info Actual matches expected chunk info -- Expected. Match_Nam is the name of the match. procedure Match_Pointer (Actual : Stack_Pointer_Info; Expected : Stack_Pointer_Info); -- Check whether actual pointer info Actual matches expected pointer info -- Expected. procedure Match_Stack (Match_Nam : String; Actual : Stack_Info; Expected : Stack_Info); -- Check whether actual stack info Stack matches expected stack info -- Expected. Match_Nam is the name of the match. procedure Test_Static_Chunk (Def_Chunk_Size : Memory_Size); -- Common testing for properties of the static chunk for both static and -- dynamic secondary stacks. Def_Chunk_Size denotes the default size of a -- secondary stack chunk. This routine assumes that the secondary stack -- can fit 12 * Units. ---------------------- -- Initialize_Stack -- ---------------------- procedure Initialize_Stack (Size : Memory_Size) is Stack : SS_Stack_Ptr; begin -- Obtain the secondary stack of the calling task Stack := Get_Sec_Stack.all; -- If the calling task has an existing secodnary stack, destroy it -- because this scenario utilizes a custom secondary stack. if Stack /= null then -- Destroy the existing secondary stack because it will be replaced -- with a new one. SS_Free (Stack); pragma Assert (Stack = null); end if; -- Create a brand new empty secondary stack SS_Init (Stack, Size); pragma Assert (Stack /= null); -- Associate the secondary stack with the calling task Set_Sec_Stack (Stack); end Initialize_Stack; ----------------- -- Match_Chunk -- ----------------- procedure Match_Chunk (Match_Nam : String; Actual : Chunk_Info; Expected : Chunk_Info) is begin Output (Match_Nam); Compare_MSWI ("Size", Actual.Size, Expected.Size); Compare_MSWI ("Size_Up_To_Chunk", Actual.Size_Up_To_Chunk, Expected.Size_Up_To_Chunk); end Match_Chunk; ------------------- -- Match_Pointer -- ------------------- procedure Match_Pointer (Actual : Stack_Pointer_Info; Expected : Stack_Pointer_Info) is begin Compare_Memory_Index ("Byte", Actual.Byte, Expected.Byte); Compare_Chunk_Id ("Chunk", Actual.Chunk, Expected.Chunk); end Match_Pointer; ----------------- -- Match_Stack -- ----------------- procedure Match_Stack (Match_Nam : String; Actual : Stack_Info; Expected : Stack_Info) is begin Output (Match_Nam); Compare_Memory_Size ("Default_Chunk_Size", Actual.Default_Chunk_Size, Expected.Default_Chunk_Size); Compare_Boolean ("Freeable", Actual.Freeable, Expected.Freeable); Compare_Memory_Size ("High_Water_Mark", Actual.High_Water_Mark, Expected.High_Water_Mark); Compare_Chunk_Count ("Number_Of_Chunks", Actual.Number_Of_Chunks, Expected.Number_Of_Chunks); Match_Pointer (Actual.Top, Expected.Top); end Match_Stack; --------------------------------------- -- Test_Dynamic_Stack_Dynamic_Chunks -- --------------------------------------- procedure Test_Dynamic_Stack_Dynamic_Chunks is Def_Chunk_Size : constant Memory_Size := 4 * Units; Dummy_1 : Address; Dummy_2 : Address; Dummy_3 : Address; Dummy_4 : Address; Mark : Mark_Id; begin Output ("#### Test_DSDCs ####"); -- Create a brand new empty secondary stack -- -- 1 2 3 4 -- +------------+ -- | | -- +------------+ Initialize_Stack (Def_Chunk_Size); Match_Stack (Match_Nam => "Empty stack", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "Empty stack, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Mark -- | -- 1 2 3 4 -- +------------+ -- | | -- +------------+ Mark := SS_Mark; -- Mark Top.Byte -- | | -- 1 2 3 4 1 2 3 4 5 6 -- +------------+ +---------------+ -- | |->|###############| -- +------------+ +---------------+ -- 1 2 3 4 5 6 7 8 9 -- | -- HWM SS_Allocate (Dummy_1, 5 * Units); Match_Stack (Match_Nam => "After 5u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 9 * Units, Number_Of_Chunks => 2, Top => (Byte => (5 * Units) + 1, Chunk => 2))); Match_Chunk (Match_Nam => "After 5u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 5u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 5 * Units, Size_Up_To_Chunk => 4 * Units)); -- Mark Top.Byte -- | | -- 1 2 3 4 1 2 3 4 5 1 2 3 4 -- +------------+ +---------------+ +------------+ -- | |->|###############|->|###### | -- +------------+ +---------------+ +------------+ -- 1 2 3 4 5 6 7 8 9 10 11 12 13 -- | -- HWM -- -- Note that the size of Chunk 3 defaults to 4 because the request is -- smaller than the default chunk size. SS_Allocate (Dummy_2, 2 * Units); Match_Stack (Match_Nam => "After 2u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 3, Top => (Byte => (2 * Units) + 1, Chunk => 3))); Match_Chunk (Match_Nam => "After 2u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 2u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 5 * Units, Size_Up_To_Chunk => 4 * Units)); Match_Chunk (Match_Nam => "After 2u allocation, chunk 3", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 3), Expected => (Size => 4 * Units, Size_Up_To_Chunk => 9 * Units)); -- Top.Byte -- | -- 1 2 3 4 1 2 3 4 5 1 2 3 4 -- +------------+ +---------------+ +------------+ -- | | --> |###############| --> |###### | -- +------------+ +---------------+ +------------+ -- 1 2 3 4 5 6 7 8 9 10 11 12 13 -- | -- HWM SS_Release (Mark); -- Top.Byte -- | -- 1 2 3 4 1 2 3 4 5 1 2 3 4 -- +------------+ +---------------+ +------------+ -- |######### | --> |###############| --> |###### | -- +------------+ +---------------+ +------------+ -- 1 2 3 4 5 6 7 8 9 10 11 12 13 -- | -- HWM SS_Allocate (Dummy_3, 3 * Units); Match_Stack (Match_Nam => "After 3u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 3, Top => (Byte => (3 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After 3u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 3u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 5 * Units, Size_Up_To_Chunk => 4 * Units)); Match_Chunk (Match_Nam => "After 3u allocation, chunk 3", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 3), Expected => (Size => 4 * Units, Size_Up_To_Chunk => 9 * Units)); -- Top.Byte -- | -- 1 2 3 4 1 2 3 4 5 6 7 8 9 -- +------------+ +------------------------+ -- |######### | --> |########################| -- +------------+ +------------------------+ -- 1 2 3 4 5 6 7 8 9 10 11 12 -- | -- HWM SS_Allocate (Dummy_4, 8 * Units); Match_Stack (Match_Nam => "After 8u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 12 * Units, Number_Of_Chunks => 2, Top => (Byte => (8 * Units) + 1, Chunk => 2))); Match_Chunk (Match_Nam => "After 8u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 8u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 8 * Units, Size_Up_To_Chunk => 4 * Units)); exception when others => Put_Line ("Test_DSDCs: unexpected exception"); end Test_Dynamic_Stack_Dynamic_Chunks; -------------------------------------------- -- Test_Dynamic_Stack_Illegal_Allocations -- -------------------------------------------- procedure Test_Dynamic_Stack_Illegal_Allocations is Def_Chunk_Size : constant Memory_Size := 4 * Units; Dummy_1 : Address; Dummy_2 : Address; begin Output ("#### Test_DSIA ####"); -- Create a brand new empty secondary stack -- -- 1 2 3 4 -- +------------+ -- | | -- +------------+ Initialize_Stack (Def_Chunk_Size); Match_Stack (Match_Nam => "Empty stack", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "Empty stack, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- It should not be possible to allocate an object of size zero Zero_Allocation : begin SS_Allocate (Dummy_1, 0); Put_Line ("Test_DSIA: ERROR: zero allocation succeeded"); exception when Assertion_Error => Match_Stack (Match_Nam => "After zero allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "After zero allocation", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); when others => Put_Line ("Test_DSIA: zero allocation: unexpected exception"); end Zero_Allocation; -- It should not be possible to allocate an object of negative size Negative_Allocation : begin SS_Allocate (Dummy_2, -8); Put_Line ("Test_DSIA: ERROR: negative allocation succeeded"); exception when Assertion_Error => Match_Stack (Match_Nam => "After negative allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "After negative allocation", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); when others => Put_Line ("Test_DSIA: negative allocation: unexpected exception"); end Negative_Allocation; exception when others => Put_Line ("Test_DSIA: unexpected exception"); end Test_Dynamic_Stack_Illegal_Allocations; ------------------------------------- -- Test_Dynamic_Stack_Static_Chunk -- ------------------------------------- procedure Test_Dynamic_Stack_Static_Chunk is Def_Chunk_Size : constant Memory_Size := 12 * Units; Dummy_1 : Address; Dummy_2 : Address; Dummy_3 : Address; Dummy_4 : Address; Mark_1 : Mark_Id; Mark_2 : Mark_Id; begin Output ("#### Test_DSSC ####"); -- Create a brand new empty secondary stack -- -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------+ -- | | -- +------------------------------------+ Initialize_Stack (Def_Chunk_Size); Test_Static_Chunk (Def_Chunk_Size); exception when others => Put_Line ("Test_DSSC: unexpected exception"); end Test_Dynamic_Stack_Static_Chunk; ---------------------------------------- -- Test_Dynamic_Stack_Zero_Chunk_Size -- ---------------------------------------- procedure Test_Dynamic_Stack_Zero_Chunk_Size is Def_Chunk_Size : constant Memory_Size := 0; Dummy_1 : Address; Dummy_2 : Address; Mark : Mark_Id; begin Output ("#### Test_DSZCS ####"); -- Create a brand new empty secondary stack -- -- ++ -- || -- ++ Initialize_Stack (Def_Chunk_Size); Match_Stack (Match_Nam => "Empty stack", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "Empty stack, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Mark -- | -- 1 -- ++ -- || -- ++ Mark := SS_Mark; -- Mark Top.Byte -- | | -- | 1 2 3 4 -- ++ +---------+ -- ||->|#########| -- ++ +---------+ -- 1 2 3 -- | -- HWM SS_Allocate (Dummy_1, 3 * Units); Match_Stack (Match_Nam => "After 3u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 3 * Units, Number_Of_Chunks => 2, Top => (Byte => (3 * Units) + 1, Chunk => 2))); Match_Chunk (Match_Nam => "After 3u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 3u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 3 * Units, Size_Up_To_Chunk => 0)); -- Mark Top.Byte -- | | -- | 1 2 3 1 2 3 -- ++ +---------+ +------+ -- ||->|#########|->|######| -- ++ +---------+ +------+ -- 1 2 3 4 5 -- | -- HWM SS_Allocate (Dummy_2, 2 * Units); Match_Stack (Match_Nam => "After 2u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 5 * Units, Number_Of_Chunks => 3, Top => (Byte => (2 * Units) + 1, Chunk => 3))); Match_Chunk (Match_Nam => "After 2u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 2u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 3 * Units, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 2u allocation, chunk 3", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 3), Expected => (Size => 2 * Units, Size_Up_To_Chunk => 3 * Units)); -- Top.Byte -- | -- | 1 2 3 1 2 -- ++ +---------+ +------+ -- ||->|#########|->|######| -- ++ +---------+ +------+ -- 1 2 3 4 5 -- | -- HWM SS_Release (Mark); -- Top.Byte -- | -- 1 2 3 4 5 6 7 -- ++ +------------------+ -- ||->|##################| -- ++ +------------------+ -- 1 2 3 4 5 6 -- | -- HWM SS_Allocate (Dummy_2, 6 * Units); Match_Stack (Match_Nam => "After 6u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 6 * Units, Number_Of_Chunks => 2, Top => (Byte => (6 * Units) + 1, Chunk => 2))); Match_Chunk (Match_Nam => "After 6u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); Match_Chunk (Match_Nam => "After 6u allocation, chunk 2", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 2), Expected => (Size => 6 * Units, Size_Up_To_Chunk => 0)); exception when others => Put_Line ("Test_DSZCS: unexpected exception"); end Test_Dynamic_Stack_Zero_Chunk_Size; ----------------------- -- Test_Static_Chunk -- ----------------------- procedure Test_Static_Chunk (Def_Chunk_Size : Memory_Size) is Dummy_1 : Address; Dummy_2 : Address; Dummy_3 : Address; Dummy_4 : Address; Mark_1 : Mark_Id; Mark_2 : Mark_Id; begin -- This routine assumes an empty secondary stack Match_Stack (Match_Nam => "Empty stack", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 0, Number_Of_Chunks => 1, Top => (Byte => 1, Chunk => 1))); Match_Chunk (Match_Nam => "Empty stack, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Top.Byte -- | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |############ -- +------------------------------------. . . -- | -- HWM SS_Allocate (Dummy_1, 4 * Units); Match_Stack (Match_Nam => "After 4u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 4 * Units, Number_Of_Chunks => 1, Top => (Byte => (4 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After 4u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Mark_1 -- Top.Byte -- | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |############ -- +------------------------------------. . . -- | -- HWM Mark_1 := SS_Mark; -- Mark_1 -- | Top.Byte -- | | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |########################### -- +------------------------------------. . . -- | -- HWM SS_Allocate (Dummy_2, 5 * Units); Match_Stack (Match_Nam => "After 5u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 9 * Units, Number_Of_Chunks => 1, Top => (Byte => (9 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After 5u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Mark_1 Mark_2 -- | Top.Byte -- | | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |########################### -- +------------------------------------. . . -- | -- HWM Mark_2 := SS_Mark; -- Mark_1 Mark_2 -- | | Top.Byte -- | | | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |################################# -- +------------------------------------. . . -- | -- HWM SS_Allocate (Dummy_3, 2 * Units); Match_Stack (Match_Nam => "After 2u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 1, Top => (Byte => (11 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After 2u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Mark_1 -- | Top.Byte -- | | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |################################# -- +------------------------------------. . . -- | -- HWM SS_Release (Mark_2); Match_Stack (Match_Nam => "After Mark_2 release", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 1, Top => (Byte => (9 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After Mark_2 release, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Top.Byte -- | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |################################# -- +------------------------------------. . . -- | -- HWM SS_Release (Mark_1); Match_Stack (Match_Nam => "After Mark_1 release", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 1, Top => (Byte => (4 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After Mark_1 release, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); -- Top.Byte -- | -- 1 2 3 4 5 6 7 8 9 10 11 12 -- +------------------------------------. . . -- |################################# -- +------------------------------------. . . -- | -- HWM SS_Allocate (Dummy_4, 6 * Units); Match_Stack (Match_Nam => "After 6u allocation", Actual => Get_Stack_Info (Get_Sec_Stack.all), Expected => (Default_Chunk_Size => Def_Chunk_Size, Freeable => True, High_Water_Mark => 11 * Units, Number_Of_Chunks => 1, Top => (Byte => (10 * Units) + 1, Chunk => 1))); Match_Chunk (Match_Nam => "After 6u allocation, chunk 1", Actual => Get_Chunk_Info (Get_Sec_Stack.all, 1), Expected => (Size => Def_Chunk_Size, Size_Up_To_Chunk => 0)); end Test_Static_Chunk; ------------------------------------------- -- Test_Static_Stack_Illegal_Allocations -- ------------------------------------------- procedure Test_Static_Stack_Illegal_Allocations is Dummy_1 : Address; Dummy_2 : Address; begin Output ("#### Test_SSIA ####"); -- It should not be possible to allocate an object of size zero Zero_Allocation : begin SS_Allocate (Dummy_1, 0); Put_Line ("Test_SSIA: ERROR: zero allocation succeeded"); exception when Assertion_Error => Output ("After zero allocation"); when others => Put_Line ("Test_SSIA: zero allocation: unexpected exception"); end Zero_Allocation; -- It should not be possible to allocate an object of negative size Negative_Allocation : begin SS_Allocate (Dummy_2, -8); Put_Line ("Test_SSIA: ERROR: negative allocation succeeded"); exception when Assertion_Error => Output ("After negative allocation"); when others => Put_Line ("Test_SSIA: negative allocation: unexpected exception"); end Negative_Allocation; exception when others => Put_Line ("Test_SSIA: unexpected exception"); end Test_Static_Stack_Illegal_Allocations; -------------------------------- -- Test_Static_Stack_Overflow -- -------------------------------- procedure Test_Static_Stack_Overflow is Info : constant Stack_Info := Get_Stack_Info (Get_Sec_Stack.all); Dummy : Address; begin Output ("#### Test_SSO ####"); -- Try to overflow the static chunk Overflow : begin SS_Allocate (Dummy, Storage_Offset (Info.Default_Chunk_Size)); Put_Line ("Test_SSO: ERROR: Overflow not detected"); exception when Storage_Error => Output ("After overflow"); when others => Put_Line ("Test_SSO: overflow: unexpected exception"); end Overflow; exception when others => Put_Line ("Test_SSO: unexpected exception"); end Test_Static_Stack_Overflow; ------------------------------------ -- Test_Static_Stack_Static_Chunk -- ------------------------------------ procedure Test_Static_Stack_Static_Chunk is Info : Stack_Info; begin Output ("#### Test_SSSC ####"); Info := Get_Stack_Info (Get_Sec_Stack.all); Test_Static_Chunk (Info.Default_Chunk_Size); exception when others => Put_Line ("Test_SSSC: unexpected exception"); end Test_Static_Stack_Static_Chunk; end System.Secondary_Stack.Tester; -- main.adb with Ada.Text_IO; use Ada.Text_IO; with System.Parameters; use System.Parameters; with System.Secondary_Stack.Tester; use System.Secondary_Stack.Tester; procedure Main is task Tester; -- The various scenarios are tested within a task because this guarantees -- that on a normal compilation, the task's secondary stack is created on -- the heap and can be safely freed and replaced with a custom one. task body Tester is begin if Sec_Stack_Dynamic then Test_Dynamic_Stack_Static_Chunk; Test_Dynamic_Stack_Dynamic_Chunks; Test_Dynamic_Stack_Zero_Chunk_Size; Test_Dynamic_Stack_Illegal_Allocations; else Test_Static_Stack_Static_Chunk; Test_Static_Stack_Overflow; Test_Static_Stack_Illegal_Allocations; end if; end Tester; begin null; end Main; ----------------- -- Compilation -- ----------------- $ gnatmake -a -f -q -gnata -gnatws main.adb $ ./main 2018-05-30 Hristian Kirtchev <kirtchev@adacore.com> gcc/ada/ * libgnat/s-secsta.adb: Reimplement the secondary stack support. * libgnat/s-secsta.ads: Update the documentation of all routines in the public part of the package. Reimplement the private part of the package to account for the new secondary stack structure. Add types and subprograms for testing purposes. Add several documentation sections. From-SVN: r260924
Hristian Kirtchev committed -
2018-05-30 Hristian Kirtchev <kirtchev@adacore.com> gcc/ada/ * exp_aggr.adb, exp_ch3.adb, exp_ch4.adb, exp_ch7.adb, exp_unst.adb, exp_util.adb, exp_util.ads, libgnat/a-calcon.adb, libgnat/a-calcon.ads, libgnat/s-os_lib.adb, repinfo.adb, sem_ch3.adb, sem_disp.adb, sem_disp.ads, sem_util.adb: Minor reformatting. From-SVN: r260923
Hristian Kirtchev committed -
2018-05-30 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * gcc-interface/Makefile.in: Move special flags for Ada runtime files from here... * Makefile.rtl: ... to here. Update comments. Protect call to "GCC_FOR_TARGET" in case target_os isn't defined. From-SVN: r260922
Arnaud Charlet committed -
2018-05-30 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * gcc-interface/Makefile.in: Move target pair settings from here... * Makefile.rtl: ... to here. (setup-rts): New target. From-SVN: r260921
Arnaud Charlet committed -
* typeck.c (cxx_sizeof_or_alignof_type): Return size_one_node instead of using it in dead store. From-SVN: r260920
Jonathan Wakely committed -
This patch generalises various places that used hwi tree accessors so that they can handle poly_ints instead. In many cases these changes are by inspection rather than because something had shown them to be necessary. I think the alias.c part is a minor bug fix: previously we used fits_uhwi_p for a signed HOST_WIDE_INT (which the caller does treat as signed rather than unsigned). We also checked whether each individual offset overflowed but didn't check whether the sum did. 2018-05-30 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * alias.c (adjust_offset_for_component_ref): Use poly_int_tree_p and wi::to_poly_offset. Add the current offset and then check whether the sum fits, rather than using an unchecked addition of a checked term. Check for a shwi rather than a uhwi. * expr.c (get_bit_range): Use tree_to_poly_uint64. (store_constructor): Use poly_int_tree_p. (expand_expr_real_1): Likewise. * function.c (assign_temp): Likewise. * fold-const.c (const_binop): Use poly_int_tree_p and wi::to_poly_offset. (fold_indirect_ref_1): Likewise. Use multiple_p to attempt an exact division. * ipa-icf-gimple.c (func_checker::compare_operand): Use to_poly_offset for MEM offsets. * ipa-icf.c (sem_variable::equals): Likewise. * stor-layout.c (compute_record_mode): Use poly_int_tree_p. * tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Use wi::to_poly_offset for BIT_FIELD_REF offsets. (vn_reference_maybe_forwprop_address): Use poly_int_tree_p and wi::to_poly_offset. * var-tracking.c (emit_note_insn_var_location): Use tree_to_poly_uint64. From-SVN: r260914
Richard Sandiford committed -
Backport https://golang.org/cl/113715 and https://golang.org/cl/113716: cmd/go: don't pass -compiler flag to vet Without this running go vet -compiler=gccgo causes vet to fail. The vet tool does need to know the compiler, but it is passed in vetConfig.Compiler. cmd/go, cmd/vet, go/internal/gccgoimport: make vet work with gccgo When using gccgo/GoLLVM, there is no package file for a standard library package. Since it is impossible for the go tool to rebuild the package, and since the package file exists only in the form of a .gox file, this seems like the best choice. Unfortunately it was confusing vet, which wanted to see a real file. This caused vet to report errors about missing package files for standard library packages. The gccgoimporter knows how to correctly handle this case. Fix this by 1) telling vet which packages are standard; 2) letting vet skip those packages; 3) letting the gccgoimporter handle this case. As a separate required fix, gccgo/GoLLVM has no runtime/cgo package, so don't try to depend on it (as it happens, this fixes golang/go#25324). The result is that the cmd/go vet tests pass when using -compiler=gccgo. Reviewed-on: https://go-review.googlesource.com/114516 From-SVN: r260913
Ian Lance Taylor committed -
From-SVN: r260912
GCC Administrator committed -
Reviewed-on: https://go-review.googlesource.com/113179 From-SVN: r260908
Ian Lance Taylor committed
-
- 29 May, 2018 23 commits
-
-
* config/riscv/riscv.c (riscv_interrupt_type): Fix comment typo. From-SVN: r260907
Jim Wilson committed -
PR c++/67711 - assigning from temporary initializer_list. PR c++/48562 - new initializer_list. * typeck.c (maybe_warn_about_returning_address_of_local): Also warn about returning local initializer_list. * cp-tree.h (AUTO_TEMP_NAME, TEMP_NAME_P): Remove. * call.c (build_over_call): Warn about assignment from temporary init_list. * init.c (build_new_1): Warn about 'new std::initializer_list'. (find_list_begin, maybe_warn_list_ctor): New. (perform_member_init): Use maybe_warn_list_ctor. From-SVN: r260905
Jason Merrill committed -
PR target/85950 * config/i386/i386.md (l<rounding_insn><MODEF:mode><SWI48:mode>2): Enable for TARGET_SSE4_1 and generate rounds{s,d} and cvtts{s,d}2si{,q} sequence. (sse4_1_round<mode>2): Use nonimmediate_operand for operand 1 predicate. testsuite/ChangeLog: PR target/85950 * gcc.target/i386/pr85950.c: New test. From-SVN: r260903
Uros Bizjak committed -
PR middle-end/85888 - New test case c-c++-common/attr-nonstring-6.c from r260541 fails with excess errors 2018-05-29 Martin Sebor <msebor@redhat.com> Richard Biener <rguenther@suse.de> PR testsuite/85888 * calls.c (get_size_range): Call determine_value_range instead of get_value_range.. * tree-vrp.h (determine_value_range): Declared new function. * tree-vrp.c (determine_value_range_1, determine_value_range): New. Co-Authored-By: Richard Biener <rguenther@suse.de> From-SVN: r260902
Martin Sebor committed -
PR c++/85883 * init.c (build_new): Handle deducing a class with new with more than one argument. * g++.dg/cpp1z/class-deduction55.C: New test. * g++.dg/cpp1z/class-deduction56.C: New test. * g++.dg/cpp1z/class-deduction57.C: New test. From-SVN: r260901
Marek Polacek committed -
* include/std/variant (__erased_dtor): Qualify call to __get. From-SVN: r260900
Jonathan Wakely committed -
PR c++/85952 * init.c (build_aggr_init): For structured binding initialized from array call mark_rvalue_use on the initializer. * g++.dg/warn/Wunused-var-33.C: New test. From-SVN: r260899
Jakub Jelinek committed -
tree-vect-data-refs.c (vect_preserves_scalar_order_p): Make sure to use non-pattern stmts for get_earlier_stmt arguments. 2018-05-29 Richard Biener <rguenther@suse.de> * tree-vect-data-refs.c (vect_preserves_scalar_order_p): Make sure to use non-pattern stmts for get_earlier_stmt arguments. * tree-vectorizer.h (get_earlier_stmt): Assert we do not get called on pattern stmts. (get_later_stmt): Likewise. From-SVN: r260896
Richard Biener committed -
2018-05-29 Martin Liska <mliska@suse.cz> PR gcov-profile/85759 * doc/gcov.texi: Document GCOV_ERROR_FILE and GCOV_EXIT_AT_ERROR env variables. 2018-05-29 Martin Liska <mliska@suse.cz> PR gcov-profile/85759 * libgcov-driver-system.c (gcov_error): Introduce usage of GCOV_EXIT_AT_ERROR env. variable. * libgcov-driver.c (merge_one_data): Print error that we overwrite a gcov file with a different timestamp. From-SVN: r260895
Martin Liska committed -
* tree-cfg.c (verify_gimple_assign_unary): Add checking for VEC_UNPACK_*_EXPR. (verify_gimple_assign_binary): Check TYPE_VECTOR_SUBPARTS for VEC_PACK_*_EXPR. From-SVN: r260894
Jakub Jelinek committed -
re PR target/85918 (Conversions to/from [unsigned] long long are not vectorized for AVX512DQ target) PR target/85918 * tree.def (VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR, VEC_PACK_FLOAT_EXPR): New tree codes. * tree-pretty-print.c (op_code_prio): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR and VEC_UNPACK_FIX_TRUNC_LO_EXPR. (dump_generic_node): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR and VEC_PACK_FLOAT_EXPR. * tree-inline.c (estimate_operator_cost): Likewise. * gimple-pretty-print.c (dump_binary_rhs): Handle VEC_PACK_FLOAT_EXPR. * fold-const.c (const_binop): Likewise. (const_unop): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR and VEC_UNPACK_FIX_TRUNC_LO_EXPR. * tree-cfg.c (verify_gimple_assign_unary): Likewise. (verify_gimple_assign_binary): Handle VEC_PACK_FLOAT_EXPR. * cfgexpand.c (expand_debug_expr): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR and VEC_PACK_FLOAT_EXPR. * expr.c (expand_expr_real_2): Likewise. * optabs.def (vec_packs_float_optab, vec_packu_float_optab, vec_unpack_sfix_trunc_hi_optab, vec_unpack_sfix_trunc_lo_optab, vec_unpack_ufix_trunc_hi_optab, vec_unpack_ufix_trunc_lo_optab): New optabs. * optabs.c (expand_widen_pattern_expr): For VEC_UNPACK_FIX_TRUNC_HI_EXPR and VEC_UNPACK_FIX_TRUNC_LO_EXPR use sign from result type rather than operand's type. (expand_binop_directly): For vec_packu_float_optab and vec_packs_float_optab allow result type to be different from operand's type. * optabs-tree.c (optab_for_tree_code): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR and VEC_PACK_FLOAT_EXPR. Formatting fixes. * tree-vect-generic.c (expand_vector_operations_1): Handle VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR and VEC_PACK_FLOAT_EXPR. * tree-vect-stmts.c (supportable_widening_operation): Handle FIX_TRUNC_EXPR. (supportable_narrowing_operation): Handle FLOAT_EXPR. * config/i386/i386.md (fixprefix, floatprefix): New code attributes. * config/i386/sse.md (*float<floatunssuffix>v2div2sf2): Rename to ... (float<floatunssuffix>v2div2sf2): ... this. Formatting fix. (vpckfloat_concat_mode, vpckfloat_temp_mode, vpckfloat_op_mode): New mode attributes. (vec_pack<floatprefix>_float_<mode>): New expander. (vunpckfixt_mode, vunpckfixt_model, vunpckfixt_extract_mode): New mode attributes. (vec_unpack_<fixprefix>fix_trunc_lo_<mode>, vec_unpack_<fixprefix>fix_trunc_hi_<mode>): New expanders. * doc/md.texi (vec_packs_float_@var{m}, vec_packu_float_@var{m}, vec_unpack_sfix_trunc_hi_@var{m}, vec_unpack_sfix_trunc_lo_@var{m}, vec_unpack_ufix_trunc_hi_@var{m}, vec_unpack_ufix_trunc_lo_@var{m}): Document. * doc/generic.texi (VEC_UNPACK_FLOAT_HI_EXPR, VEC_UNPACK_FLOAT_LO_EXPR): Fix pasto in description. (VEC_UNPACK_FIX_TRUNC_HI_EXPR, VEC_UNPACK_FIX_TRUNC_LO_EXPR, VEC_PACK_FLOAT_EXPR): Document. * gcc.target/i386/avx512dq-pr85918.c: Add -mprefer-vector-width=512 and -fno-vect-cost-model options. Add aligned(64) attribute to the arrays. Add suffix 1 to all functions and use 4 iterations rather than N. Add functions with conversions to and from float. Add new set of functions with 8 iterations and another one with 16 iterations, expect 24 vectorized loops instead of just 4. * gcc.target/i386/avx512dq-pr85918-2.c: New test. From-SVN: r260893
Jakub Jelinek committed -
2018-05-29 Richard Biener <rguenther@suse.de> * tree-vectorizer.h (struct vec_info): Add stmt_vec_infos member. (stmt_vec_info_vec): Make pointer. (init_stmt_vec_info_vec): Remove. (free_stmt_vec_info_vec): Likewise. (set_stmt_vec_info_vec): New function. (free_stmt_vec_infos): Likewise. (vinfo_for_stmt): Adjust for stmt_vec_info_vec indirection. (set_vinfo_for_stmt): Likewise. (get_earlier_stmt): Likewise. (get_later_stmt): Likewise. * tree-vectorizer.c (stmt_vec_info_vec): Make pointer. (vec_info::vec_info): Allocate stmt_vec_infos and set the global. (vec_info::~vec_info): Free stmt_vec_infos. (vectorize_loops): Set the global stmt_vec_info_vec to NULL. Remove old init_stmt_vec_info_vec/free_stmt_vec_info_vec calls. (pass_slp_vectorize::execute): Likewise. * tree-vect-stmts.c (init_stmt_vec_info_vec): Remove. (free_stmt_vec_info_vec): Likewise. (set_stmt_vec_info_vec): New function. (free_stmt_vec_infos): Likewise. * tree-vect-loop.c (_loop_vec_info::~_loop_vec_info): Set the global stmt_vec_info_vec. * tree-parloops.c (gather_scalar_reductions): Use set_stmt_vec_info_vec/free_stmt_vec_infos and maintain a local vector. From-SVN: r260892
Richard Biener committed -
2018-05-29 Richard Biener <rguenther@suse.de> * dominance.c (iterate_fix_dominators): Push/pop TV_DOMINANCE. From-SVN: r260891
Richard Biener committed -
2018-05-29 Martin Liska <mliska@suse.cz> David Malcolm <dmalcolm@redhat.com> * vec.c (test_reverse): New. (vec_c_tests): Add new test. * vec.h (vl_ptr>::reverse): New function. Co-Authored-By: David Malcolm <dmalcolm@redhat.com> From-SVN: r260890
Martin Liska committed -
This changes the wording in the documentation of the -gnatn switch to make it use "units" rather than "modules" and also adjusts the usage message. No functional changes. 2018-05-29 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * doc/gnat_ugn/building_executable_programs_with_gnat.rst (Alphabetical List of All Switches): Replace "modules" with "units". (Subprogram Inlining Control): Likewise. * gnat_ugn.texi: Regenerate. * usage.adb (Usage): Fix description of -gnatn switch. From-SVN: r260889
Eric Botcazou committed -
2018-05-29 Arnaud Charlet <charlet@adacore.com> gcc/ada/ * gcc-interface/Makefile.in: Fix typos. From-SVN: r260888
Arnaud Charlet committed -
2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_ch7.adb (Build_Finalizer_Call): Attach to tree the reference to the finalizer procedure in the At_End handler, for use in LLVM generation. From-SVN: r260887
Ed Schonberg committed -
When a private type declaration T1 is completed with a derivation of an untagged private type that overrides the predefined equality primitive, and the full view of T2 is a derivation of another private type T2 whose full view is a tagged type, the compiler may generate code that references the wrong equality primitive when processing comparisons of objects of type T1. 2018-05-29 Javier Miranda <miranda@adacore.com> gcc/ada/ * exp_ch4.adb (Expand_N_Op_Eq, Expand_Composite_Equality): Use the new subprogram Inherits_From_Tagged_Full_View to identify more reliably untagged private types completed with a derivation of an untagged private whose full view is a tagged type. * sem_util.ads, sem_util.adb (Inherits_From_Tagged_Full_View): New subprogram. (Collect_Primitive_Operations): Handle untagged private types completed with a derivation of an untagged private type whose full view is a tagged type. In such case, collecting the list of primitives we may find two equality primitives: one associated with the untagged private and another associated with the ultimate tagged type (and we must remove from the returned list this latter one). gcc/testsuite/ * gnat.dg/equal2.adb: New testcase. From-SVN: r260886
Javier Miranda committed -
2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_unst.adb (Visit_Node): Handle statement sequences that include an At_End handler. From-SVN: r260885
Ed Schonberg committed -
The -gnatR switch outputs representation information for locally-defined types but it was skipping those defined in blocks without label, unlike those defined in named blocks. This change plugs this small hole. The following procedure: procedure P is begin declare type R is record I : Integer; end record; begin null; end; end; must now generate the following output with -gnatR: Representation information for unit P (body) -------------------------------------------- for B_1.R'Size use 32; for B_1.R'Alignment use 4; for B_1.R use record I at 0 range 0 .. 31; end record; 2018-05-29 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * repinfo.adb (List_Entities): Also recurse into blocks without label. From-SVN: r260884
Eric Botcazou committed -
2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * exp_ch6.adb (Expand_N_Subprogram_Body): Do not generate push/pop for exceptions if subprogram unnesting is in effect, because these branch nodes are relevant only in the presence of nested subprograms. From-SVN: r260883
Ed Schonberg committed -
This patch fixes an error in the handling of attributes Pred qnd Succ when applied to the limit values of a floating-point type. The RM mandates that such operations must raise constraint_error, but GNAT generated in most cases an infinite value, regardless of whether overflow checks were enabled. 2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * libgnat/s-fatgen.adb (Succ, Pred): Raise Constraint_Error unconditionally when applied to the largest positive (resp. largest negative) value of a floating-point type. gcc/testsuite/ * gnat.dg/float_attributes_overflows.adb: New testcase. From-SVN: r260882
Ed Schonberg committed -
2018-05-29 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * einfo.ads, einfo.adb: Clarify use of Activation_Record_Component: discriminants and exceptions are never components of such. The flag Needs_Activation_Record is set on subprogram types, not on access to them. From-SVN: r260881
Ed Schonberg committed
-