[multiple changes]

2014-01-24  Vincent Celier  <celier@adacore.com>

	* projects.texi: Document that aggregate projects are only
	supported by gprbuild, but not by gnatmake.  Document that the
	only attribute Switches in package Binder of aggregate projects
	will be ignored if its index is not others.  Document that
	attribute Global_Config_File is allowed in package Binder of
	aggregate projects.

2014-01-24  Robert Dewar  <dewar@adacore.com>

	* sem_prag.adb: Minor code reorganization.
	* sem_util.adb: Minor fix of potential latent bug in Is_LHS.

From-SVN: r207029
This commit is contained in:
Arnaud Charlet 2014-01-24 15:01:57 +01:00
parent 0567ae8de7
commit 0bd38d942c
4 changed files with 77 additions and 27 deletions

View File

@ -1,3 +1,17 @@
2014-01-24 Vincent Celier <celier@adacore.com>
* projects.texi: Document that aggregate projects are only
supported by gprbuild, but not by gnatmake. Document that the
only attribute Switches in package Binder of aggregate projects
will be ignored if its index is not others. Document that
attribute Global_Config_File is allowed in package Binder of
aggregate projects.
2014-01-24 Robert Dewar <dewar@adacore.com>
* sem_prag.adb: Minor code reorganization.
* sem_util.adb: Minor fix of potential latent bug in Is_LHS.
2014-01-24 Pascal Obry <obry@adacore.com>
* prj-attr.adb, projects.texi, snames.ads-tmpl: Add Excluded_Patterns

View File

@ -2365,6 +2365,9 @@ aggregate project, you will need to add "p.gpr" in the list of project
files for the aggregate project, or the main will not be built when
building the aggregate project.
Aggregate projects are only supported with @command{gprbuild}, but not with
@command{gnatmake}.
@c ---------------------------------------------------------
@node Building a set of projects with a single command
@subsection Building a set of projects with a single command
@ -2404,8 +2407,8 @@ with Annex E.
@subsection Define a build environment
@c ---------------------------------------------
The environment variables at the time you launch @command{gprbuild} or
@command{gnatmake} will influence the view these tools have of the project
The environment variables at the time you launch @command{gprbuild}
will influence the view these tools have of the project
(PATH to find the compiler, ADA_PROJECT_PATH or GPR_PROJECT_PATH to find the
projects, environment variables that are referenced in project files
through the "external" statement,...). Several command line switches
@ -2462,12 +2465,12 @@ end MyProject;
@subsection Performance improvements in builder
@c --------------------------------------------
The loading of aggregate projects is optimized in @command{gprbuild} and
@command{gnatmake}, so that all files are searched for only once on the disk
The loading of aggregate projects is optimized in @command{gprbuild},
so that all files are searched for only once on the disk
(thus reducing the number of system calls and contributing to faster
compilation times especially on systems with sources on remote
servers). As part of the loading, @command{gprbuild} and @command{gnatmake}
compute how and where a source file should be compiled, and even if it is found
servers). As part of the loading, @command{gprbuild}
computes how and where a source file should be compiled, and even if it is found
several times in the aggregated projects it will be compiled only
once.
@ -2663,15 +2666,15 @@ These override the value given by the attribute, so that
users can override the value set in the (presumably shared
with others in his team) aggregate project.
@item The -X command line switch to @command{gprbuild} and @command{gnatmake}
@item The -X command line switch to @command{gprbuild}
This always takes precedence.
@end itemize
This attribute is only taken into account in the main aggregate
project (i.e. the one specified on the command line to @command{gprbuild} or
@command{gnatmake}), and ignored in other aggregate projects. It is invalid
project (i.e. the one specified on the command line to @command{gprbuild}),
and ignored in other aggregate projects. It is invalid
in standard projects.
The goal is to have a consistent value in all
projects that are built through the aggregate, which would not
@ -2695,13 +2698,15 @@ are valid:
@table @asis
@item @b{^Switches^Switches^}:
@cindex @code{^Switches^Switches^}
This attribute gives the list of switches to use for the builder
(@command{gprbuild} or @command{gnatmake}), depending on the language of the
main file. For instance,
This attribute gives the list of switches to use for @command{gprbuild}.
Because no mains can be specified for aggregate projects, the only possible
index for attribute @code{Switches} is @code{others}. All other indexes will
be ignored.
Example:
@smallexample @c projectfile
for ^Switches^Switches^ ("Ada") use ("-d", "-p");
for ^Switches^Switches^ ("C") use ("-p");
for ^Switches^Switches^ (other) use ("-v", "-k", "-j8");
@end smallexample
These switches are only read from the main aggregate project (the
@ -2797,7 +2802,7 @@ B), the switches used by the compiler are unambiguous.
@cindex @code{Global_Configuration_Pragmas}
This attribute can be used to specify a file containing
configuration pragmas, to be passed to the compiler. Since we
configuration pragmas, to be passed to the Ada compiler. Since we
ignore the package Builder in other aggregate projects and projects,
only those pragmas defined in the main aggregate project will be
taken into account.
@ -2805,6 +2810,13 @@ taken into account.
Projects can locally add to those by using the
@code{Compiler.Local_Configuration_Pragmas} attribute if they need.
@item @b{Global_Config_File}
@cindex @code{Global_Config_File}
This attribute, indexed with a language name, can be used to specify a config
when compiling sources of the language. For Ada, these files are configuration
pragmas files.
@end table
For projects that are built through the aggregate, the package Builder

View File

@ -15565,14 +15565,10 @@ package body Sem_Prag is
case Ekind (Ent) is
-- Objects (constants and variables)
-- Objects (constants and variables) and types. For these cases
-- all we need to do is to set the Linker_Section_pragma field.
when E_Constant | E_Variable =>
Set_Linker_Section_Pragma (Ent, N);
-- Types
when Type_Kind =>
when E_Constant | E_Variable | Type_Kind =>
Set_Linker_Section_Pragma (Ent, N);
-- Subprograms

View File

@ -9850,20 +9850,48 @@ package body Sem_Util is
------------
-- We seem to have a lot of overlapping functions that do similar things
-- (testing for left hand sides or lvalues???). Anyway, since this one is
-- purely syntactic, it should be in Sem_Aux I would think???
-- (testing for left hand sides or lvalues???).
function Is_LHS (N : Node_Id) return Boolean is
P : constant Node_Id := Parent (N);
begin
-- Return True if we are the left hand side of an assignment statement
if Nkind (P) = N_Assignment_Statement then
return Name (P) = N;
elsif
Nkind_In (P, N_Indexed_Component, N_Selected_Component, N_Slice)
-- Case of prefix of indexed or selected component or slice
elsif Nkind_In (P, N_Indexed_Component, N_Selected_Component, N_Slice)
and then N = Prefix (P)
then
return N = Prefix (P) and then Is_LHS (P);
-- Here we have the case where the parent P is N.Q or N(Q .. R).
-- If P is an LHS, then N is also effectively an LHS, but there
-- is an important exception. If N is of an access type, then
-- what we really have is N.all.Q (or N.all(Q .. R)). In either
-- case this makes N.all a left hand side but not N itself!
-- Here follows a worrisome kludge. If Etype (N) is not set, which
-- for sure happens in the call from Find_Direct_Name, that means we
-- don't know if N is of an access type, so we can't give an accurate
-- answer. For now, we assume we do not have an access type, which
-- means for example that P.Q.R := X will look like a modification
-- of P, even if P.Q eventually turns out to be an access type. The
-- consequence is at least that in some cases we incorrectly identify
-- a reference as a modification. It is not clear if there are any
-- other bad consequences. ???
if Present (Etype (N)) and then Is_Access_Type (Etype (N)) then
return False;
-- OK, not access type case, so just test whole expression
else
return Is_LHS (P);
end if;
-- All other cases are not left hand sides
else
return False;