The compiler blows up generating code associated with occurrences of attribute
Valid_Scalars whose evaluation is always true. After this patch the following
test compiles fine.
2018-05-23 Javier Miranda <miranda@adacore.com>
gcc/ada/
* sem_attr.adb (Valid_Scalars): Do not invoke Error_Attr_P to report
the warning on occurrences of this attribute whose evaluation is always
true (since that subprogram aborts processing the attribute). In
addition, replace the node by its boolean result 'True' (required
because the backend has no knowledge of this attribute).
gcc/testsuite/
* gnat.dg/valid_scalars1.adb: New testcase.
From-SVN: r260591
This patch fixes a bug in which if Ada.Containers.Vectors is instantiated with
an Index_Type such that Index_Type'Base'Last is less than Count_Type'Last, and
the -gnatwE switch is used, the compiler gives spurious error messages.
The following test should compile quietly with -gnatwE:
gnatmake short_vectors.ads -gnatwa -gnatwE -gnatf
with Ada.Containers.Vectors;
package Short_Vectors is
type Index_Type is range 1 .. 256;
package Map_Pkg is new Ada.Containers.Vectors
(Index_Type => Index_Type,
Element_Type => Integer);
end Short_Vectors;
2018-05-23 Bob Duff <duff@adacore.com>
gcc/ada/
* libgnat/a-convec.adb: (Insert, Insert_Space): Suppress warnings. The
code in question is not reachable in the case where Count_Type'Last is
out of range.
From-SVN: r260590
A local use of pragma Warnings Off to suppress specific messages, when
not followed by a matching pragma Warnings On, extends until the end of
the file.
2018-05-23 Yannick Moy <moy@adacore.com>
gcc/ada/
* doc/gnat_rm/implementation_defined_pragmas.rst: Clarify meaning of
local pragma Warnings Off without On.
* gnat_rm.texi: Regenerate.
From-SVN: r260589
Useful to check if an occurrence caught by a "when others" choice originates
from a foreign language, e.g. C++.
2018-05-23 Olivier Hainque <hainque@adacore.com>
gcc/ada/
* libgnat/g-excact.ads (Is_Foreign_Exception): New predicate.
* libgnat/g-excact.adb: Implement.
From-SVN: r260588
This patch adds a check on an iterator over a GNAT-specific formal container,
when the iterator specification includes a subtype indication that must be
compatible with the element type of the container.
2018-05-23 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch5.adb (Analyze_Iterator_Specification): If a subtype indication
is present, verify its legality when the domain of iteration is a
GNAT-specific formal container, as is already done for arrays and
predefined containers.
gcc/testsuite/
* gnat.dg/iter1.adb, gnat.dg/iter1.ads: New testcase.
From-SVN: r260587
This utility is used in GNATprove to find when a node is inside a named
number declaration, and this case was not properly handled. Now fixed.
There is no impact on compilation.
2018-05-23 Yannick Moy <moy@adacore.com>
gcc/ada/
* sem_util.adb (Enclosing_Declaration): Fix the case of a named number
declaration, which was not taken into account.
From-SVN: r260586
This patch modifies the static elaboration model to stop the inspection of
a task body when it contains a synchronous suspension call and restriction
No_Entry_Calls_In_Elaboration_Code or switch -gnatd_s is in effect.
------------
-- Source --
------------
-- suspension.ads
package Suspension is
procedure ABE;
task type Barrier_Task_1;
task type Barrier_Task_2;
task type Object_Task_1;
task type Object_Task_2;
end Suspension;
-- suspension.adb
with Ada.Synchronous_Barriers; use Ada.Synchronous_Barriers;
with Ada.Synchronous_Task_Control; use Ada.Synchronous_Task_Control;
package body Suspension is
Bar : Synchronous_Barrier (Barrier_Limit'Last);
Obj : Suspension_Object;
task body Barrier_Task_1 is
OK : Boolean;
begin
Wait_For_Release (Bar, OK);
ABE;
end Barrier_Task_1;
task body Barrier_Task_2 is
procedure Block is
OK : Boolean;
begin
Wait_For_Release (Bar, OK);
end Block;
begin
Block;
ABE;
end Barrier_Task_2;
task body Object_Task_1 is
begin
Suspend_Until_True (Obj);
ABE;
end Object_Task_1;
task body Object_Task_2 is
procedure Block is
begin
Suspend_Until_True (Obj);
end Block;
begin
Block;
ABE;
end Object_Task_2;
function Elaborator return Boolean is
BT_1 : Barrier_Task_1;
BT_2 : Barrier_Task_2;
OT_1 : Object_Task_1;
OT_2 : Object_Task_2;
begin
return True;
end Elaborator;
Elab : constant Boolean := Elaborator;
procedure ABE is begin null; end ABE;
end Suspension;
-- main.adb
with Suspension;
procedure Main is begin null; end Main;
----------------------------
-- Compilation and output --
----------------------------
$ gnatmake -q -gnatd_s main.adb
suspension.adb:23:07: warning: cannot call "ABE" before body seen
suspension.adb:23:07: warning: Program_Error may be raised at run time
suspension.adb:23:07: warning: body of unit "Suspension" elaborated
suspension.adb:23:07: warning: function "Elaborator" called at line 51
suspension.adb:23:07: warning: local tasks of "Elaborator" activated
suspension.adb:23:07: warning: procedure "ABE" called at line 23
suspension.adb:39:07: warning: cannot call "ABE" before body seen
suspension.adb:39:07: warning: Program_Error may be raised at run time
suspension.adb:39:07: warning: body of unit "Suspension" elaborated
suspension.adb:39:07: warning: function "Elaborator" called at line 51
suspension.adb:39:07: warning: local tasks of "Elaborator" activated
suspension.adb:39:07: warning: procedure "ABE" called at line 39
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* debug.adb: Switch -gnatd_s is now used to stop elaboration checks on
synchronized suspension.
* rtsfind.ads: Add entries for units Ada.Synchronous_Barriers and
Ada.Synchronous_Task_Control and routines Suspend_Until_True and
Wait_For_Release.
* sem_elab.adb: Document switch -gnatd_s.
(In_Task_Body): New routine.
(Is_Potential_Scenario): Code cleanup. Stop the traversal of a task
body when the current construct denotes a synchronous suspension call,
and restriction No_Entry_Calls_In_Elaboration_Code or switch -gnatd_s
is in effect.
(Is_Synchronous_Suspension_Call): New routine.
* switch-c.adb (Scan_Front_End_Switches): Switch -gnatJ now sets switch
-gnatd_s.
From-SVN: r260585
2018-05-23 Javier Miranda <miranda@adacore.com>
gcc/ada/
* exp_disp.adb (Make_DT): Restrict the initialization of
External_Tag and Expanded_Name to an empty string to the case where
both pragmas apply (i.e. No_Tagged_Streams and Discard_Names), since
restricted runtimes are compiled with pragma Discard_Names.
* doc/gnat_rm/implementation_defined_pragmas.rst,
doc/gnat_rm/implementation_defined_characteristics.rst: Add
documentation.
* gnat_rm.texi: Regenerate.
From-SVN: r260584
This commit fixes bugs in the code that implements the rules for safe pointers
in SPARK. This only affects SPARK tools, not compilation.
* Global variables should be handled differently compared
to parameters. The whole tree of an in global variable has the
permission Read-Only. In contrast, an in parameter has the
permission Read-Only for the first level and Read-Write permission
for suffixes.
* The suffix X of Integer'image(X) was not analyzed correctly.
* The instruction X'img was not dealt with.
* Shallow aliased types which are not initialized are now allowed
and analyzed.
Dealing with function inlining is not handled correctly yet.
2018-05-23 Maroua Maalej <maalej@adacore.com>
gcc/ada/
* sem_spark.adb: Fix of some permission rules of pointers in SPARK.
From-SVN: r260583
This patch inhibits the generation of freeze nodes when pre-analyzing the
domain of iteration of an Ada2012 loop that appears as a quantified
expression in a predicate for an array type. This prevents a back-end
abort on an invisible freeze node that would otherwise appear in an
unexpanded code sequence.
The following must compile quietly:
----
with Id_Manager;
package My_Id_Manager is new Id_Manager (Max_Id_Type => 100_000,
Max_Key_Count => 100);
----
generic
Max_Id_Type : Positive;
Max_Key_Count : Positive;
package Id_Manager is
type Unique_Id_Type is new Integer range 0 .. Max_Id_Type;
Undefined_Id : constant Unique_Id_Type := 0;
type Key_Count is new Integer range 0 .. Max_Key_Count;
subtype Key_Index is Key_Count range 1 .. Key_Count'Last;
type Key_Array is array (Key_Index range <>) of Unique_Id_Type
with Predicate => Key_Array'First = 1;
type Id_Manager_State (Capacity : Key_Count) is private;
procedure Display_Objects (TheObject : Id_Manager_State);
private
type Id_Manager_State (Capacity : Key_Count) is record
Id_Key : Key_Array (1 .. Capacity) := (others => Undefined_Id);
Key_Size : Key_Count := 0;
end record;
end Id_Manager;
----
package body Id_Manager is
procedure Display_Objects (TheObject : Id_Manager_State) is
begin
for Item of TheObject.Id_Key loop
null;
end loop;
end Display_Objects;
end Id_Manager;
2018-05-23 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch5.adb (Preanalyze_Range): The pre-analysis of the domain of
iteration of an Ada2012 loop is performed to determine the type of the
domain, but full analysis is performed once the loop is rewritten as a
while-loop during expansion. The pre-analysis suppresses expansion; it
must also suppress the generation of freeze nodes, which may otherwise
appear in the wrong scope before rewritting.
From-SVN: r260582
This patch updates the documentation section on suppressing elaboration
warnings. No change in behavior, no need for a test.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_elab.adb: Update the section on suppressing elaboration warnings.
From-SVN: r260581
This patch modifies the effects of pragma Warnings (Off, ...) to suppress
elaboration warnings related to an entity.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb (Is_Elaboration_Checks_OK_Id): Use predicate
Is_Elaboration_Target.
(Is_Elaboration_Target): New routine.
(Is_Elaboration_Warnings_OK_Id): Use predicate Is_Elaboration_Target.
(Set_Is_Elaboration_Checks_OK_Id): Use predicate Is_Elaboration_Target.
(Set_Is_Elaboration_Warnings_OK_Id): Use predicate
Is_Elaboration_Target.
* einfo.ads: Add new synthesized attribute Is_Elaboration_Target along
with occurrences in nodes.
(Is_Elaboration_Target): New routine.
* sem_prag.adb (Analyze_Pragma): Suppress elaboration warnings when an
elaboration target is subject to pragma Warnings (Off, ...).
gcc/testsuite/
* gnat.dg/elab5.adb, gnat.dg/elab5_pkg.adb, gnat.dg/elab5_pkg.ads: New
testcase.
From-SVN: r260580
This patch changes the behavior of elaboration-related warnings as follows:
* If a scenario or a target has [elaboration] warnings suppressed, then
any further elaboration-related warnings along the paths rooted at the
scenario are also suppressed.
* Elaboration-related warnings related to task activation can now be
suppressed when either the task object, task type, or the activation
call have [elaboration] warnings suppressed.
* Elaboration-related warnings related to calls can now be suppressed when
either the target or the call have [elaboration] warnings suppressed.
* Elaboration-related warnings related to instantiations can now be
suppressed when the instantiation has [elaboration] warnings suppressed.
The patch also cleans up the way the state of the Processing phase is updated
with each new node along a path. It is now preferable to update the state in
routines
Process_Conditional_ABE_Activation_Impl
Process_Conditional_ABE_Call
Process_Conditional_ABE_Instantiation
rather than within their language-specific versions.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb: Flag304 is now Is_Elaboration_Warnings_OK_Id.
(Is_Elaboration_Warnings_OK_Id): New routine.
(Set_Is_Elaboration_Warnings_OK_Id): New routine.
(Write_Entity_Flags): Output Flag304.
* einfo.ads: Add new attribute Is_Elaboration_Warnings_OK_Id along with
occurrences in entities.
(Is_Elaboration_Warnings_OK_Id): New routine along with pragma Inline.
(Set_Is_Elaboration_Warnings_OK_Id): New routine along with pragma
Inline.
* sem_attr.adb (Analyze_Access_Attribute): Capture the state of
elaboration warnings.
* sem_ch3.adb (Analyze_Object_Declaration): Capture the state of
elaboration warnings.
* sem_ch6.adb (Analyze_Abstract_Subprogram_Declaration): Capture the
state of elaboration warnings.
(Analyze_Subprogram_Body_Helper): Capture the state of elaboration
warnings.
(Analyze_Subprogram_Declaration): Capture the state of elaboration
warnings.
* sem_ch9.adb (Analyze_Entry_Declaration): Capture the state of
elaboration warnings.
(Analyze_Single_Task_Declaration): Capture the state of elaboration
warnings.
(Analyze_Task_Type_Declaration): Capture the state of elaboration
warnings.
* sem_ch12.adb (Analyze_Generic_Package_Declaration): Capture the state
of elaboration warnings.
(Analyze_Generic_Subprogram_Declaration): Capture the state of
elaboration warnings.
* sem_elab.adb: Add a section on suppressing elaboration warnings.
Type Processing_Attributes includes component Suppress_Warnings
intended to suppress any elaboration warnings along a path in the
graph. Update Initial_State to include a value for this component.
Types Target_Attributes and Task_Attriutes include component
Elab_Warnings_OK to indicate whether the target or task has elaboration
warnings enabled. component Elab_Warnings_OK.
(Build_Access_Marker): Propagate attribute
Is_Elaboration_Warnings_OK_Node from the attribute to the generated
call marker.
(Extract_Instantiation_Attributes): Set the value for Elab_Warnings_OK.
(Extract_Target_Attributes): Set the value for Elab_Warnings_OK.
(Extract_Task_Attributes): Set the value for Elab_Warnings_OK.
(Process_Conditional_ABE_Access): Suppress futher elaboration warnings
when already in this mode or when the attribute or target have warnings
suppressed.
(Process_Conditional_ABE_Activation_Impl): Do not emit any diagnostics
if warnings are suppressed.
(Process_Conditional_ABE_Call): Suppress further elaboration warnings
when already in this mode, or the target or call have warnings
suppressed.
(Process_Conditional_ABE_Call_Ada): Do not emit any diagnostics if
warnings are suppressed.
(Process_Conditional_ABE_Call_SPARK): Do not emit any diagnostics if
warnings are suppressed.
(Process_Conditional_ABE_Instantiation): Suppress further elaboration
warnings when already in this mode or when the instantiation has
warnings suppressed.
(Process_Conditional_ABE_Instantiation_Ada): Do not emit any
diagnostics if warnings are suppressed.
(Process_Conditional_ABE_Variable_Assignment_Ada): Use the more
specific Is_Elaboration_Warnings_OK_Id rather than Warnings_Off.
(Process_Conditional_ABE_Variable_Assignment_SPARK): Use the more
specific Is_Elaboration_Warnings_OK_Id rather than Warnings_Off.
(Process_Task_Object): Suppress further elaboration warnings when
already in this mode, or when the object, activation call, or task type
have warnings suppressed. Update the processing state to indicate that
the path goes through a task body.
* sinfo.adb (Is_Elaboration_Warnings_OK_Node): Accept attribute
references.
(Set_Is_Elaboration_Warnings_OK_Node): Accept attribute references.
* sinfo.ads: Attribute Is_Elaboration_Warnings_OK_Node now applies to
attribute references.
gcc/testsuite/
* gnat.dg/elab4.adb, gnat.dg/elab4_pkg.adb, gnat.dg/elab4_pkg.ads: New
testcase.
From-SVN: r260578
GNAT properly rejects an attempt to assign an access_to_subprogram formal
to a local variable, according to accessibiiity rules. This patch forces the
same behavior on the use of such a formal in an object declaration.
Compiling store_anon.adb must yield:
store_anon.adb:7:35: illegal attempt to store anonymous access to subprogram
store_anon.adb:7:35: value has deeper accessibility than any master
(RM 3.10.2 (13))
store_anon.adb:7:35: use named access type for "P" instead of access parameter
----
package Store_Anon is
procedure Store (P : not null access procedure);
procedure Invoke;
end Store_Anon;
----
package body Store_Anon is
type P_Ptr is access procedure;
Stored : P_Ptr;
procedure Store (P : not null access procedure) is
Illegal : constant P_Ptr := P;
begin -- Store
Stored := Illegal;
end Store;
procedure Invoke is
-- Empty
begin -- Invoke
Stored.all;
end Invoke;
end Store_Anon;
2018-05-23 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch3.adb (Analyze_Object_Declaration): If expression is an
anonymous_access_to_ subprogram formal, apply a conversion to force an
accsssibility check that will fail statically, enforcing 3.10.2 (13).
From-SVN: r260576
This patch fixes a bug in which if a limited volatile variable with
an Address aspect is initialized with a build-in-place aggregate
containing build-in-place function calls, the compiler can crash.
2018-05-23 Bob Duff <duff@adacore.com>
gcc/ada/
* freeze.adb: (Check_Address_Clause): Deal with build-in-place
aggregates in addition to build-in-place calls.
gcc/testsuite/
* gnat.dg/addr10.adb: New testcase.
From-SVN: r260574
This patch suppresses the optimization of scalar arrays when pragma
Initialize_Scalars is in effect if the component type is subject to
predicates. Since the scalar array is initialized with invalid values,
these values may violate the predicate or a validity check within the
predicate.
------------
-- Source --
------------
-- gnat.adc
pragma Initialize_Scalars;
-- types.ads
with System; use System;
package Types is
type Byte is mod System.Storage_Unit;
subtype Inter_Byte is Byte;
function Always_OK (B : Inter_Byte) return Boolean is (True);
function Is_OK (B : Inter_Byte) return Boolean is (Always_OK (B));
subtype Final_Byte is Byte with Predicate => Is_OK (Final_Byte);
type Bytes is array (1 .. 5) of Final_Byte;
Obj : Bytes;
end Types;
-- main.adb
with Types; use Types;
procedure Main is begin null; end Main;
-----------------
-- Compilation --
-----------------
$ gnatmake -q -gnata -gnatVa main.adb
$ ./main
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch3.adb (Default_Initialize_Object): Do not optimize scalar array
initialization when the component type has predicates.
* exp_ch4.adb (Expand_N_Allocator): Do not optimize scalar array
allocation when the component type has predicates.
From-SVN: r260572
Since IFUNC resolver is called indirectly, don't mark IFUNC resolver as
only called directly. This patch adds ifunc_resolver to cgraph_node,
sets ifunc_resolver for ifunc attribute and checks ifunc_resolver
instead of looking up ifunc attribute.
gcc/
PR target/85345
* cgraph.h (cgraph_node::create): Set ifunc_resolver for ifunc
attribute.
(cgraph_node::create_alias): Likewise.
(cgraph_node::get_availability): Check ifunc_resolver instead
of looking up ifunc attribute.
* cgraphunit.c (maybe_diag_incompatible_alias): Likewise.
* varasm.c (do_assemble_alias): Likewise.
(assemble_alias): Likewise.
(default_binds_local_p_3): Likewise.
* cgraph.h (cgraph_node): Add ifunc_resolver.
(cgraph_node::only_called_directly_or_aliased_p): Return false
for IFUNC resolver.
* lto-cgraph.c (input_node): Set ifunc_resolver for ifunc
attribute.
* symtab.c (symtab_node::verify_base): Verify that ifunc_resolver
is equivalent to lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)).
(symtab_node::binds_to_current_def_p): Check ifunc_resolver
instead of looking up ifunc attribute.
gcc/testsuite/
PR target/85345
* gcc.target/i386/pr85345.c: New test.
From-SVN: r260547
A customer reported the following missed opportunities to combine a couple
instructions into a sbfiz.
int sbfiz32 (int x)
{
return x << 29 >> 10;
}
long sbfiz64 (long x)
{
return x << 58 >> 20;
}
This gets converted to the following pattern:
(set (reg:SI 98)
(ashift:SI (sign_extend:SI (reg:HI 0 x0 [ xD.3334 ]))
(const_int 6 [0x6])))
Currently, gcc generates the following:
sbfiz32:
lsl x0, x0, 29
asr x0, x0, 10
ret
sbfiz64:
lsl x0, x0, 58
asr x0, x0, 20
ret
It could generate this instead:
sbfiz32:
sbfiz w0, w0, 19, 3
ret
sbfiz64::
sbfiz x0, x0, 38, 6
ret
The unsigned versions already generate ubfiz for the same code, so the lack of
a sbfiz pattern may have been an oversight.
This particular sbfiz pattern shows up in both CPU2006 (~ 80 hits) and
CPU2017 (~ 280 hits). It's not a lot, but seems beneficial in any case. No
significant performance differences, probably due to the small number of
occurrences or cases outside hot areas.
gcc/ChangeLog:
2018-05-22 Luis Machado <luis.machado@linaro.org>
gcc/
* config/aarch64/aarch64.md (*ashift<mode>_extv_bfiz): New pattern.
gcc/testsuite/ChangeLog:
2018-05-22 Luis Machado <luis.machado@linaro.org>
gcc/testsuite/
* gcc.target/aarch64/lsl_asr_sbfiz.c: New test.
From-SVN: r260546
gcc/ChangeLog:
PR c/85623
* calls.c (maybe_warn_nonstring_arg): Use string length to set
or ajust the presumed bound on an operation to avoid unnecessary
warnings.
gcc/testsuite/ChangeLog:
PR c/85623
* c-c++-common/attr-nonstring-3.c: Adjust.
* c-c++-common/attr-nonstring-4.c: Adjust.
* c-c++-common/attr-nonstring-6.c: New test.
From-SVN: r260541
This patch removes a lot of duplicated code in aarch64-ldpstp.md.
The patterns that did not previously generate a base register now
do not check for aarch64_mem_pair_operand in the pattern. This has
been extracted to a check in aarch64_operands_ok_for_ldpstp.
All patterns in the file used to have explicit switching code to
swap loads and stores that were in the wrong order.
This has been extracted into aarch64_operands_ok_for_ldpstp
as a final operation after all the checks have been performed.
2018-05-22 Jackson Woodruff <jackson.woodruff@arm.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64-ldpstp.md: Replace uses of
aarch64_mem_pair_operand with memory_operand and delete operand swapping
code.
* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
Add check for legitimate_address.
(aarch64_gen_adjusted_ldpstp): Swap operands where appropriate.
(aarch64_swap_ldrstr_operands): New.
* config/aarch64/aarch64-protos.h (aarch64_swap_ldrstr_operands):
Define prototype.
Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
From-SVN: r260539
This patch merges loads and stores from D-registers that are of different modes.
Code like this:
typedef int __attribute__((vector_size(8))) vec;
struct pair
{
vec v;
double d;
}
Now generates a store pair instruction:
void
assign (struct pair *p, vec v)
{
p->v = v;
p->d = 1.0;
}
Whereas previously it generated two `str` instructions.
This patch also merges storing of double zero values with
long integer values:
struct pair
{
long long l;
double d;
}
void
foo (struct pair *p)
{
p->l = 10;
p->d = 0.0;
}
Now generates a single store pair instruction rather than two `str` instructions.
The patch basically generalises the mode iterators on the patterns in aarch64.md
and the peepholes in aarch64-ldpstp.md to take all combinations of pairs of modes
so, while it may be a large-ish patch, it does fairly mechanical stuff.
2018-05-22 Jackson Woodruff <jackson.woodruff@arm.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md: New patterns to generate stp
and ldp.
(store_pair_sw, store_pair_dw): New patterns to generate stp for
single words and double words.
(load_pair_sw, load_pair_dw): Likewise.
(store_pair_sf, store_pair_df, store_pair_si, store_pair_di):
Delete.
(load_pair_sf, load_pair_df, load_pair_si, load_pair_di):
Delete.
* config/aarch64/aarch64-ldpstp.md: Modify peephole
for different mode ldpstp and add peephole for merged zero stores.
Likewise for loads.
* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
Add size check.
(aarch64_gen_store_pair): Rename calls to match new patterns.
(aarch64_gen_load_pair): Rename calls to match new patterns.
* config/aarch64/aarch64-simd.md (load_pair<mode>): Rename to...
(load_pair<DREG:mode><DREG2:mode>): ... This.
(store_pair<mode>): Rename to...
(vec_store_pair<DREG:mode><DREG2:mode>): ... This.
* config/aarch64/iterators.md (DREG, DREG2, DX2, SX, SX2, DSX):
New mode iterators.
(V_INT_EQUIV): Handle SImode.
* config/aarch64/predicates.md (aarch64_reg_zero_or_fp_zero):
New predicate.
* gcc.target/aarch64/ldp_stp_6.c: New.
* gcc.target/aarch64/ldp_stp_7.c: New.
* gcc.target/aarch64/ldp_stp_8.c: New.
Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
From-SVN: r260538
PR tree-optimization/85826 - ICE in gimple-ssa-warn-restruct on
a variable-length struct
gcc/ChangeLog:
PR tree-optimization/85826
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Avoid
assuming that a DECL necesarily has a constant size.
gcc/testsuite/ChangeLog:
PR tree-optimization/85826
* gcc.dg/Wrestrict-17.c: New test.
From-SVN: r260537
This patch fixes an issue whereby the compiler failed to properly warn against
unreferenced formal parameters when analyzing expression functions.
2018-05-22 Justin Squirek <squirek@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Expression_Function): Propagate flags from the
original function spec into the generated function spec due to
expansion of expression functions during analysis.
(Analyze_Subprogram_Body_Helper): Modify check on formal parameter
references from the body to the subprogram spec in the case of
expression functions because of inconsistances related to having a
generated body.
* libgnarl/s-osinte__android.ads: Flag parameters as unused.
* libgnarl/s-osinte__lynxos178e.ads: Likewise.
* libgnarl/s-osinte__qnx.adb: Likewise.
* libgnarl/s-osinte__qnx.ads: Likewise.
gcc/testsuite/
* gnat.dg/warn14.adb: New testcase.
From-SVN: r260535
In a sequence like
(d) (c) (b) (a)
c++ raises <-- Ada calls c++, <-- c++ call Ada <-- Ada calls
exception others handler and handles c++
gets foreign c++ exception
exception and
re-raises
the original exception raised on the C++ world at (d) couldn't be caught
as a regular c++ exception at (b) when the re-raise performed at (c) is
done with an explicit call to Ada.Exceptions.Reraise_Occurrence.
Indeed, the latter just re-crafted a new Ada-ish occurence and the
nature and contents of the original exception object were lost.
This patch fixes this by refining Reraise_Occurrence to be more careful
with exceptions in the course of a propagation, just resuming propagation
of the original object.
From the set of soures below, compilation and execution with:
g++ -c bd.cc && gnatmake -f -g a.adb -largs bd.o --LINK=g++ && ./a
is expected to output:
foreign exception caught, reraising ...
b() caught x = 5
----
// bd.cc
extern "C" {
extern void c();
void b ();
void d ();
}
void b ()
{
try {
c();
} catch (int x) {
printf ("b() caught x = %d\n", x);
}
}
void d ()
{
throw (5);
}
-- a.adb
with C;
procedure A is
procedure B;
pragma Import (Cpp, B);
begin
B;
end;
-- c.ads
procedure C;
pragma Export (C, C, "c");
-- c.adb
with Ada.Exceptions; use Ada.Exceptions;
with System.Standard_Library;
with Ada.Unchecked_Conversion;
with Ada.Text_IO; use Ada.Text_IO;
procedure C is
package SSL renames System.Standard_Library;
use type SSL.Exception_Data_Ptr;
function To_Exception_Data_Ptr is new
Ada.Unchecked_Conversion (Exception_Id, SSL.Exception_Data_Ptr);
procedure D;
pragma Import (Cpp, D);
Foreign_Exception : aliased SSL.Exception_Data;
pragma Import
(Ada, Foreign_Exception, "system__exceptions__foreign_exception");
begin
D;
exception
when E : others =>
if To_Exception_Data_Ptr (Exception_Identity (E))
= Foreign_Exception'Unchecked_access
then
Put_Line ("foreign exception caught, reraising ...");
Reraise_Occurrence (E);
end if;
end;
2018-05-22 Olivier Hainque <hainque@adacore.com>
gcc/ada/
* libgnat/a-except.adb (Exception_Propagation.Propagate_Exception):
Expect an Exception_Occurence object, not an Access.
(Complete_And_Propagate_Occurrence): Adjust accordingly.
(Raise_From_Signal_Handler): Likewise.
(Reraise_Occurrence_No_Defer): If we have a Machine_Occurrence
available in the provided occurrence object, just re-propagate the
latter as a bare "raise;" would do.
* libgnat/a-exexpr.adb (Propagate_Exception): Adjust to spec change.
* libgnat/a-exstat.adb (String_To_EO): Initialize X.Machine_Occurrence
to null, to mark that the occurrence we're crafting from the stream
contents is not being propagated (yet).
From-SVN: r260533
This patch modifies the late expansion of record aggregates to ensure that the
generated code which handles a controlled component initialized by a function
call is inserted in line with the rest of the initialization code, rather than
before the record aggregate. This way the function call has proper access to
the discriminants of the object being created.
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_aggr.adb (Initialize_Ctrl_Record_Component): Insert the generated
code for a transient component in line with the rest of the
initialization code, rather than before the aggregate. This ensures
that the component has proper visibility of the discriminants.
gcc/testsuite/
* gnat.dg/controlled8.adb: New testcase.
From-SVN: r260532
Although the sysconf SC_NPROCESSORS_ONLN is also defined by the API, the
only documented way to retrieve the number of CPUs is by using the syspage.
This also better organise the QNX-specific macros in adaint.c
2018-05-22 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* adaint.c: Reorganize QNX-specific macros, use syspage to retreive the
number of CPUs.
From-SVN: r260531
The trampoline now properly restores the link register as well as the stack
pointer. As a minor optimisation, now only callee-saved registers are
restored: the scratch registers don't need that.
2018-05-22 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* sigtramp-qnx.c: Properly restore link register in signal trampoline.
From-SVN: r260530
This patch optimizes the initialization and allocation of scalar array objects
when pragma Initialize_Scalars is in effect. The patch also extends the syntax
and semantics of pragma Initialize_Scalars to allow for the specification of
invalid values pertaining to families of scalar types. The new syntax is as
follows:
pragma Initialize_Scalars
[ ( TYPE_VALUE_PAIR {, TYPE_VALUE_PAIR} ) ];
TYPE_VALUE_PAIR ::=
SCALAR_TYPE => static_EXPRESSION
SCALAR_TYPE :=
Short_Float
| Float
| Long_Float
| Long_Long_Flat
| Signed_8
| Signed_16
| Signed_32
| Signed_64
| Unsigned_8
| Unsigned_16
| Unsigned_32
| Unsigned_64
Depending on the value specified by pragma Initialize_Scalars, the backend may
optimize the creation of the scalar array object into a fast memset.
------------
-- Source --
------------
-- gnat.adc
pragma Initialize_Scalars
(Short_Float => 0.0,
Float => 0.0,
Long_Float => 0.0,
Long_Long_Float => 0.0,
Signed_8 => 0,
Signed_16 => 0,
Signed_32 => 0,
Signed_64 => 0,
Unsigned_8 => 0,
Unsigned_16 => 0,
Unsigned_32 => 0,
Unsigned_64 => 0);
-- types.ads
with System;
package Types is
Max : constant := 10_000;
subtype Big is Integer range 1 .. Max;
type Byte is range 0 .. 255;
for Byte'Size use System.Storage_Unit;
type Byte_Arr_1 is array (1 .. Max) of Byte;
type Byte_Arr_2 is array (Big) of Byte;
type Byte_Arr_3 is array (Integer range <>) of Byte;
type Byte_Arr_4 is array (Integer range <>,
Integer range <>) of Byte;
type Constr_Arr_1 is array (1 .. Max) of Integer;
type Constr_Arr_2 is array (Big) of Integer;
type Constr_Arr_3 is array (1 .. Max, 1 .. Max) of Integer;
type Constr_Arr_4 is array (Big, Big) of Integer;
type Unconstr_Arr_1 is array (Integer range <>) of Integer;
type Unconstr_Arr_2 is array (Integer range <>,
Integer range <>) of Integer;
subtype Subt_Arr_1 is Unconstr_Arr_1 (1 .. Max);
subtype Subt_Arr_2 is Unconstr_Arr_1 (Big);
subtype Subt_Arr_3 is Unconstr_Arr_2 (1 .. Max, 1 .. Max);
subtype Subt_Arr_4 is Unconstr_Arr_2 (Big, Big);
subtype Subt_Str_1 is String (1 .. Max);
subtype Subt_Str_2 is String (Big);
type Byte_Arr_1_Ptr is access Byte_Arr_1;
type Byte_Arr_2_Ptr is access Byte_Arr_2;
type Byte_Arr_3_Ptr is access Byte_Arr_3;
type Byte_Arr_4_Ptr is access Byte_Arr_4;
type Constr_Arr_1_Ptr is access Constr_Arr_1;
type Constr_Arr_2_Ptr is access Constr_Arr_2;
type Constr_Arr_3_Ptr is access Constr_Arr_3;
type Constr_Arr_4_Ptr is access Constr_Arr_4;
type Unconstr_Arr_1_Ptr is access Unconstr_Arr_1;
type Unconstr_Arr_2_Ptr is access Unconstr_Arr_2;
type Subt_Arr_1_Ptr is access Subt_Arr_1;
type Subt_Arr_2_Ptr is access Subt_Arr_2;
type Subt_Arr_3_Ptr is access Subt_Arr_3;
type Subt_Arr_4_Ptr is access Subt_Arr_4;
type Str_Ptr is access String;
type Subt_Str_1_Ptr is access Subt_Str_1;
type Subt_Str_2_Ptr is access Subt_Str_2;
end Types;
-- main.adb
with Types; use Types;
procedure Main is
Byte_Arr_1_Obj : Byte_Arr_1;
Byte_Arr_2_Obj : Byte_Arr_2;
Byte_Arr_3_Obj : Byte_Arr_3 (1 .. Max);
Byte_Arr_4_Obj : Byte_Arr_3 (Big);
Byte_Arr_5_Obj : Byte_Arr_4 (1 .. Max, 1 .. Max);
Byte_Arr_6_Obj : Byte_Arr_4 (Big, Big);
Constr_Arr_1_Obj : Constr_Arr_1;
Constr_Arr_2_Obj : Constr_Arr_2;
Constr_Arr_3_Obj : Constr_Arr_3;
Constr_Arr_4_Obj : Constr_Arr_4;
Unconstr_Arr_1_Obj : Unconstr_Arr_1 (1 .. Max);
Unconstr_Arr_2_Obj : Unconstr_Arr_1 (Big);
Unconstr_Arr_3_Obj : Unconstr_Arr_2 (1 .. Max, 1 .. Max);
Unconstr_Arr_4_Obj : Unconstr_Arr_2 (Big, Big);
Subt_Arr_1_Obj : Subt_Arr_1;
Subt_Arr_2_Obj : Subt_Arr_2;
Subt_Arr_3_Obj : Subt_Arr_3;
Subt_Arr_4_Obj : Subt_Arr_4;
Str_1_Obj : String (1 .. Max);
Str_2_Obj : String (Big);
Subt_Str_1_Obj : Subt_Str_1;
Subt_Str_2_Obj : Subt_Str_2;
Byte_Arr_1_Ptr_Obj : Byte_Arr_1_Ptr := new Byte_Arr_1;
Byte_Arr_2_Ptr_Obj : Byte_Arr_2_Ptr := new Byte_Arr_2;
Byte_Arr_3_Ptr_Obj : Byte_Arr_3_Ptr := new Byte_Arr_3 (1 .. Max);
Byte_Arr_4_Ptr_Obj : Byte_Arr_3_Ptr := new Byte_Arr_3 (Big);
Byte_Arr_5_Ptr_Obj : Byte_Arr_4_Ptr :=
new Byte_Arr_4 (1 .. Max, 1 .. Max);
Byte_Arr_6_Ptr_Obj : Byte_Arr_4_Ptr := new Byte_Arr_4 (Big, Big);
Constr_Arr_1_Ptr_Obj : Constr_Arr_1_Ptr := new Constr_Arr_1;
Constr_Arr_2_Ptr_Obj : Constr_Arr_2_Ptr := new Constr_Arr_2;
Constr_Arr_3_Ptr_Obj : Constr_Arr_3_Ptr := new Constr_Arr_3;
Constr_Arr_4_Ptr_Obj : Constr_Arr_4_Ptr := new Constr_Arr_4;
Unconstr_Arr_1_Ptr_Obj : Unconstr_Arr_1_Ptr :=
new Unconstr_Arr_1 (1 .. Max);
Unconstr_Arr_2_Ptr_Obj : Unconstr_Arr_1_Ptr := new Unconstr_Arr_1 (Big);
Unconstr_Arr_3_Ptr_Obj : Unconstr_Arr_2_Ptr :=
new Unconstr_Arr_2 (1 .. Max, 1 .. Max);
Unconstr_Arr_4_Ptr_Obj : Unconstr_Arr_2_Ptr :=
new Unconstr_Arr_2 (Big, Big);
Subt_Arr_1_Ptr_Obj : Subt_Arr_1_Ptr := new Subt_Arr_1;
Subt_Arr_2_Ptr_Obj : Subt_Arr_2_Ptr := new Subt_Arr_2;
Subt_Arr_3_Ptr_Obj : Subt_Arr_3_Ptr := new Subt_Arr_3;
Subt_Arr_4_Ptr_Obj : Subt_Arr_4_Ptr := new Subt_Arr_4;
Str_Ptr_1_Obj : Str_Ptr := new String (1 .. Max);
Str_Ptr_2_Obj : Str_Ptr := new String (Big);
Subt_Str_1_Ptr_Obj : Subt_Str_1_Ptr := new Subt_Str_1;
Subt_Str_2_Ptr_Obj : Subt_Str_2_Ptr := new Subt_Str_2;
begin null; end Main;
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c -S -gnatDG -gnatws main.adb
$ grep -c "others => types__TbyteB!(0));" main.adb.dg
$ grep -c "others => integer!(0));" main.adb.dg
$ grep -c "others => character!(0));" main.adb.dg
$ grep -c "others => types__TbyteB!(0));" main.adb.dg
$ grep -c "memset" main.s
8
12
8
8
44
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): Strip away any
conversions before extracting the value of the expression.
* exp_ch3.adb (Default_Initialize_Object): Optimize the default
initialization of an array of scalars.
(Get_Simple_Init_Val): Add processing for array types. Remove the
processing of strings because this case is already handled by the array
case.
(Needs_Simple_Initialization): Moved to Sem_Util.
(Simple_Init_Array_Type): New routine.
(Simple_Init_Initialize_Scalars_Type): Reimplemented to use the new
facilities from Sem_Util.
(Simple_Initialization_OK): New routine.
* exp_ch3.ads (Needs_Simple_Initialization): Moved to Sem_Util.
* exp_ch4.adb (Expand_N_Allocator): Optimize the default allocation of
an array of scalars.
* sem_prag.adb (Analyze_Float_Value): New routine.
(Analyze_Integer_Value): New routine.
(Analyze_Pragma): Reimplement the analysis of pragma Initialize_Scalars
to handled the extended form of the pragma.
(Analyze_Type_Value_Pair): New routine.
* sem_util.adb: Add invalid value-related data structures.
(Examine_Array_Bounds): New routine.
(Has_Static_Array_Bounds): Reimplemented.
(Has_Static_Non_Empty_Array_Bounds): New routine.
(Invalid_Scalar_Value): New routine.
(Needs_Simple_Initialization): Moved from Exp_Ch3.
(Set_Invalid_Scalar_Value): New routines.
* sem_util.ads (Has_Static_Non_Empty_Array_Bounds): New routine.
(Invalid_Scalar_Value): New routine.
(Needs_Simple_Initialization): Moved from Exp_Ch3.
(Set_Invalid_Scalar_Value): New routines.
* snames.ads-tmpl: Add names for the salar type families used by pragma
Initialize_Scalars.
From-SVN: r260529
In order to avoid exposing internal names of tagged types in the
binary code generated by the compiler this enhancement facilitates
initializes the External_Tag of a tagged type with an empty string
when pragma No_Tagged_Streams is applicable to the tagged type, and
facilitates initializes its Expanded_Name with an empty string when
pragma Discard_Names is applicable to the tagged type.
This enhancement can be verified by means of the following small
test:
package Library_Level_Test is
type Typ_01 is tagged null record; -- Case 1: No pragmas
type Typ_02 is tagged null record; -- Case 2: Discard_Names
pragma Discard_Names (Typ_02);
pragma No_Tagged_Streams;
type Typ_03 is tagged null record; -- Case 3: No_Tagged_Streams
type Typ_04 is tagged null record; -- Case 4: Both pragmas
pragma Discard_Names (Typ_04);
end;
Commands:
gcc -c -gnatD library_level_test.ads
grep "\.TYP_" library_level_test.ads.dg
Output:
"LIBRARY_LEVEL_TEST.TYP_01["00"]";
"LIBRARY_LEVEL_TEST.TYP_02["00"]";
"LIBRARY_LEVEL_TEST.TYP_03["00"]";
2018-05-22 Javier Miranda <miranda@adacore.com>
gcc/ada/
* exp_disp.adb (Make_DT): Initialize the External_Tag with an empty
string when pragma No_Tagged_Streams is applicable to the tagged type,
and initialize the Expanded_Name with an empty string when pragma
Discard_Names is applicable to the tagged type.
From-SVN: r260528
This patch improves on the error message for an attempt to apply 'Access
to a formal subprogram. It also applies the check to a renaming of a formal
subprogram.
Compiling p.adb must yield:
p.adb:15:18: not subtype conformant with declaration at line 2
p.adb:15:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
p.adb:16:18: not subtype conformant with declaration at line 2
p.adb:16:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
----
package body P is
procedure Non_Generic (P : access procedure (I : Integer)) is
begin
P.all (5);
end Non_Generic;
procedure G is
procedure Local (I : Integer) is
begin
Action (I);
end;
procedure Local_Action (I : Integer) renames Action;
begin
Non_Generic (Local'access);
Non_Generic (Local_Action'access);
Non_Generic (Action'access);
-- p.adb:15:18: not subtype conformant with declaration at line 2
-- p.adb:15:18: formal subprograms not allowed
end G;
end P;
----
package P is
generic
with procedure Action (I : Integer);
procedure G;
end P;
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch6.adb (Check_Conformance): Add RM reference for rule that a
formal subprogram is never subtype conformqnt, and thus cannot be the
prefix of 'Access. Reject as well the attribute when applied to a
renaming of a formal subprogram.
From-SVN: r260527
This patch cleans up the implementation of routine Get_Simple_Init_Val. It also
eliminates potentially large and unnecessary tree replications in the context
of object default initialization.
No change in behavior, no test needed.
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch3.adb (Build_Array_Init_Proc): Update the call to
Needs_Simple_Initialization.
(Build_Init_Statements): Update the call to Get_Simple_Init_Val.
(Check_Subtype_Bounds): Renamed to Extract_Subtype_Bounds. Update the
profile and comment on usage.
(Default_Initialize_Object): Do not use New_Copy_Tree to set the proper
Sloc of a value obtained from aspect Default_Value because this could
potentially replicate large trees. The proper Sloc is now set in
Get_Simple_Init_Val.
(Get_Simple_Init_Val): Reorganized by breaking the various cases into
separate routines. Eliminate the use of global variables.
(Init_Component): Update the call to Get_Simple_Init_Val.
(Needs_Simple_Initialization): Update the parameter profile and all
uses of T.
(Simple_Init_Defaulted_Type): Copy the value of aspect Default_Value
and set the proper Sloc.
* exp_ch3.ads (Get_Simple_Init_Val): Update the parameter profile and
comment on usage.
(Needs_Simple_Initialization): Update the parameter profile.
From-SVN: r260526
This patch fixes a compiler abort on a discriminant constraint when the
constraint is a subtype indication.
2018-05-22 Patrick Bernardi <bernardi@adacore.com>
gcc/ada/
* sem_ch3.adb (Build_Discriminant_Constraints): Raise an error if the
user tries to use a subtype indication as a discriminant constraint.
gcc/testsuite/
* gnat.dg/discr50.adb: New testcase.
From-SVN: r260525
This patch dismantles the prototype implementation of the first proposal
for Reduction expressions, one of the important potentially parallel
constructs for Ada2020. The ARG is going in a different direction with
a simpler syntax.
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* exp_ch4.ads, exp_ch4.adb, exp_util.adb, expander.adb: Remove mention
of N_Reduction_Expression and N_Reduction_Expression_Parameter.
* par-ch4.adb: Remove parsing routines for reduction expressions.
* sem.adb, sinfo.ads, sinfo.adb, sem_ch4.ads, sem_ch4.adb, sem_res.adb,
sem_spark.adb, sprint.adb: Remove analysis routines for reduction
expressions.
From-SVN: r260524