diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2009-04-17 15:31:42 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2009-04-17 15:31:42 +0200 |
commit | c5d91669f305eb83adb2ef982b05ee19a15fbf47 (patch) | |
tree | d8fc5b05422c518bb486d7b26cdb24c2dcf90224 /gcc | |
parent | c4edb5791a28deb8bc93737089840d4c989418f1 (diff) | |
download | gcc-c5d91669f305eb83adb2ef982b05ee19a15fbf47.zip gcc-c5d91669f305eb83adb2ef982b05ee19a15fbf47.tar.gz gcc-c5d91669f305eb83adb2ef982b05ee19a15fbf47.tar.bz2 |
[multiple changes]
2009-04-17 Robert Dewar <dewar@adacore.com>
* exp_disp.adb: Minor reformatting
Minor code reorganization (use Nkind_In)
* prepcomp.adb: Minor reformatting
* sem_ch3.adb: Minor reformatting
* sem_res.adb: Minor comment addition
* exp_ch5.adb (Expand_Assign_Array): Use Has_Address_Clause to test
for address clause
* lib-xref.adb (Generate_Reference): Exclude recursive calls from
setting Is_Referenced
* types.ads: Minor reformatting
2009-04-17 Arnaud Charlet <charlet@adacore.com>
* gnat_ugn.texi: Initial documentation on binding generator.
From-SVN: r146266
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 23 | ||||
-rw-r--r-- | gcc/ada/exp_ch5.adb | 7 | ||||
-rw-r--r-- | gcc/ada/exp_disp.adb | 7 | ||||
-rw-r--r-- | gcc/ada/gnat_ugn.texi | 147 | ||||
-rw-r--r-- | gcc/ada/lib-xref.adb | 9 | ||||
-rw-r--r-- | gcc/ada/prepcomp.adb | 6 | ||||
-rw-r--r-- | gcc/ada/sem_ch3.adb | 17 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 3 | ||||
-rw-r--r-- | gcc/ada/types.ads | 4 |
9 files changed, 200 insertions, 23 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3ace58e..44f54c6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,26 @@ +2009-04-17 Robert Dewar <dewar@adacore.com> + + * exp_disp.adb: Minor reformatting + Minor code reorganization (use Nkind_In) + + * prepcomp.adb: Minor reformatting + + * sem_ch3.adb: Minor reformatting + + * sem_res.adb: Minor comment addition + + * exp_ch5.adb (Expand_Assign_Array): Use Has_Address_Clause to test + for address clause + + * lib-xref.adb (Generate_Reference): Exclude recursive calls from + setting Is_Referenced + + * types.ads: Minor reformatting + +2009-04-17 Arnaud Charlet <charlet@adacore.com> + + * gnat_ugn.texi: Initial documentation on binding generator. + 2009-04-17 Ed Schonberg <schonberg@adacore.com> * einfo.ads, einfo.adb: New attribute Underlying_Record_View, to handle diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index c025f58..5008f4c 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -311,12 +311,7 @@ package body Exp_Ch5 is -- If either operand has an address clause clear Backwards_OK and -- Forwards_OK, since we cannot tell if the operands overlap. - if (Is_Entity_Name (Lhs) - and then Present (Address_Clause (Entity (Lhs)))) - or else - (Is_Entity_Name (Lhs) - and then Present (Address_Clause (Entity (Lhs)))) - then + if Has_Address_Clause (Lhs) or else Has_Address_Clause (Rhs) then Set_Forwards_OK (N, False); Set_Backwards_OK (N, False); end if; diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index 6a125ec..d090320 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -164,13 +164,12 @@ package body Exp_Disp is -- Handle full type declarations and derivations of library -- level tagged types - elsif (Nkind (D) = N_Full_Type_Declaration - or else Nkind (D) = N_Derived_Type_Definition) + elsif Nkind_In (D, N_Full_Type_Declaration, + N_Derived_Type_Definition) and then Is_Library_Level_Tagged_Type (Defining_Entity (D)) and then Ekind (Defining_Entity (D)) /= E_Record_Subtype and then not Is_Private_Type (Defining_Entity (D)) then - -- We do not generate dispatch tables for the internal type -- created for a type extension with unknown discriminants -- The needed information is shared with the source type, @@ -180,7 +179,7 @@ package body Exp_Disp is and then Has_Unknown_Discriminants (Etype (Defining_Entity (D))) and then - not Comes_From_Source (First_Subtype (Defining_Entity (D))) + not Comes_From_Source (First_Subtype (Defining_Entity (D))) then null; diff --git a/gcc/ada/gnat_ugn.texi b/gcc/ada/gnat_ugn.texi index c645682..771aff7b 100644 --- a/gcc/ada/gnat_ugn.texi +++ b/gcc/ada/gnat_ugn.texi @@ -187,6 +187,7 @@ AdaCore@* * Stack Related Facilities:: * Verifying Properties Using gnatcheck:: * Creating Sample Bodies Using gnatstub:: +* Generating Ada Bindings for C and C++ headers:: * Other Utility Programs:: * Running and Debugging Ada Programs:: @ifclear vms @@ -846,6 +847,10 @@ a utility that checks Ada code against a set of rules. a utility that generates empty but compilable bodies for library units. @item +@ref{Generating Ada Bindings for C and C++ headers}, describes how to +generate automatically Ada bindings from C and C++ headers. + +@item @ref{Other Utility Programs}, discusses several other GNAT utilities, including @code{gnathtml}. @@ -22247,6 +22252,148 @@ Verbose mode: generate version information. @end table +@c ********************************* +@node Generating Ada Bindings for C and C++ headers +@chapter Generating Ada Bindings for C and C++ headers +@findex binding + +@noindent +GNAT now comes with a new experimental binding generator for C and C++ +headers which is intended to do 95% of the tedious work of generating +Ada specs from C or C++ header files. Note that this still is a work in +progress, not designed to generate 100% correct Ada specs. + +Note that the code generated is using the Ada 2005 syntax, which makes it +easier to inteface with other languages than previous versions of Ada. + +@menu +* Running the binding generator:: +* Generating bindings for C++ headers:: +* Switches:: +@end menu + +@node Running the binding generator +@section Running the binding generator + +@noindent +The binding generator is part of the @command{gcc} compiler and can be +invoked via the @option{-fdump-ada-spec} switch, which will generate Ada +spec files for the header files specified on the command line, and all +header files needed by these files transitivitely. For example: + +@smallexample +$ g++ -c -fdump-ada-spec -C /usr/include/time.h +$ gcc -c -gnat05 *.ads +@end smallexample + +will generate, under GNU/Linux, the following files: @file{bits_time_h.ads}, +@code{bits_types_h.ads}, @code{stddef_h.ads}, @code{time_h.ads} which +correspond to the files @file{/usr/include/time.h}, +@file{/usr/include/bits/time.h}, etc@dots{}, and will then compile in Ada 2005 +mode these Ada specs. + +The @code{-C} switch tells @command{gcc} to extract comments from headers, +and will attempt to generate corresponding Ada comments. + +If you want to generate a single Ada file and not the transitive closure, you +can use instead the @option{-fdump-ada-spec-slim} switch. + +Note that we recommend when possible to use the @command{g++} driver to +generate bindings, even for most C headers, since this will in general +generate better Ada specs. For generating bindings for C++ headers, it is +mandatory to use the @command{g++} command, or @command{gcc -x c++} which +is equivalent in this case. If @command{g++} cannot work on your C headers +because of incompatibilities between C and C++, then you can fallback to +@command{gcc} instead. + +For an example of better bindings generated from the C++ front-end, +the name of the parameters (when available) are actually ignored by the C +front-end. Consider the following C header: + +@smallexample +extern void foo (int variable); +@end smallexample + +with the C front-end, @code{variable} is ignored, and the above is handled as: + +@smallexample +extern void foo (int); +@end smallexample + +generating a generic: + +@smallexample +procedure foo (param1 : int); +@end smallexample + +with the C++ front-end, the name is available, and we generate: + +@smallexample +procedure foo (variable : int); +@end smallexample + +In some cases, the generated bindings will be more complete or more meaningful +when defining some macros, which you can do via the @option{-D} switch. this +is for example the case with @file{Xlib.h} under GNU/Linux: + +@smallexample +g++ -c -fdump-ada-spec -DXLIB_ILLEGAL_ACCESS -C /usr/include/X11/Xlib.h +@end smallexample + +The above will generate more complete bindings than a straight call without +the @option{-DXLIB_ILLEGAL_ACCESS} switch. + +In other cases, it is not possible to parse a header file in a stand alone +manner, because other include files need to be included first. In this +case, the solution is to create a small header file including the needed +@code{#include} and possible @code{#define} directives. For example, to +generate Ada bindings for @file{readline/readlin.h}, you need to first +include @file{stdio.h}, so you can create a file with the following two +lines in e.g. @file{readline1.h}: + +@smallexample +#include <stdio.h> +#include <readline/readline.h> +@end smallexample + +and then generate Ada bindings from this file: + +@smallexample +$ g++ -c -fdump-ada-spec readline1.h +@end smallexample + +@node Generating bindings for C++ headers +@section Generating bindings for C++ headers + +@noindent +Generating bindings for C++ headers is done using the same options, always +with the @command{g++} compiler. + +In this mode, C++ classes will be mapped to Ada tagged types, constructors +will be mapped using the @code{CPP_Constructor} pragma, and when possible, +multiple inheritance of abstract classes will be mapped to Ada interfaces +(@xref{Interfacing to C++,,,gnat_rm, GNAT Reference Manual}, for additional +information on interfacing to C++). + +@node Switches +@section Switches + +@table @option +@item -fdump-ada-spec +@cindex @option{-fdump-ada-spec} (@command{gcc}) +Generate Ada spec files for the given header files transitively (including +all header files that these headers depend upon). + +@item -fdump-ada-spec-slim +@cindex @option{-fdump-ada-spec-slim} (@command{gcc}) +Generate Ada spec files for the header files specified on the command line +only. + +@item -C +@item @option{-C} (@command{gcc}) +Extract comments from headers and generate Ada comments in the Ada spec files. +@end table + @node Other Utility Programs @chapter Other Utility Programs diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb index 3e36d0c..fac4864 100644 --- a/gcc/ada/lib-xref.adb +++ b/gcc/ada/lib-xref.adb @@ -564,6 +564,15 @@ package body Lib.Xref is Set_Referenced_As_LHS (E, False); end if; + -- Don't count a recursive reference within a subprogram as a + -- reference (that allows detection of a recursive subprogram + -- whose only references are recursive calls as unreferenced). + + elsif Is_Subprogram (E) + and then E = Nearest_Dynamic_Scope (Current_Scope) + then + null; + -- Any other occurrence counts as referencing the entity elsif OK_To_Set_Referenced then diff --git a/gcc/ada/prepcomp.adb b/gcc/ada/prepcomp.adb index 63d64e7..18c2686 100644 --- a/gcc/ada/prepcomp.adb +++ b/gcc/ada/prepcomp.adb @@ -47,9 +47,9 @@ package body Prepcomp is -- The following variable should be a constant, but this is not possible -- because its type GNAT.Dynamic_Tables.Instance has a component P of - -- unitialized private type GNAT.Dynamic_Tables.Table_Private and there are - -- no exported values for this private type. - -- Warnings are Off because it is never assigned a value. + -- unitialized private type GNAT.Dynamic_Tables.Table_Private and there + -- are no exported values for this private type. Warnings are Off because + -- it is never assigned a value. pragma Warnings (Off); No_Mapping : Prep.Symbol_Table.Instance; diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 11c6491..e6be49e 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -5522,11 +5522,12 @@ package body Sem_Ch3 is then declare Full_Der : constant Entity_Id := - Make_Defining_Identifier (Loc, New_Internal_Name ('T')); - Decl : Node_Id; - New_Ext : constant Node_Id := - Copy_Separate_Tree - (Record_Extension_Part (Type_Definition (N))); + Make_Defining_Identifier (Loc, + Chars => New_Internal_Name ('T')); + Decl : Node_Id; + New_Ext : constant Node_Id := + Copy_Separate_Tree + (Record_Extension_Part (Type_Definition (N))); begin Build_Derived_Record_Type @@ -5561,7 +5562,7 @@ package body Sem_Ch3 is Set_Underlying_Record_View (Derived_Type, Full_Der); end; - -- if discriminants are known, build derived record. + -- if discriminants are known, build derived record else Build_Derived_Record_Type @@ -5600,8 +5601,8 @@ package body Sem_Ch3 is Build_Underlying_Full_View (N, Derived_Type, Parent_Type); elsif Is_Constrained (Full_View (Parent_Type)) then - Set_Underlying_Full_View (Derived_Type, - Full_View (Parent_Type)); + Set_Underlying_Full_View + (Derived_Type, Full_View (Parent_Type)); end if; else diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 31242c6..676cbc2 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -5231,6 +5231,9 @@ package body Sem_Res is and then Present (Controlling_Argument (N)) then Generate_Reference (Nam, Subp, 'R'); + + -- Normal case, not a dispatching call + else Generate_Reference (Nam, Subp); end if; diff --git a/gcc/ada/types.ads b/gcc/ada/types.ads index 3b89ab2..96b60b5 100644 --- a/gcc/ada/types.ads +++ b/gcc/ada/types.ads @@ -192,8 +192,8 @@ package Types is subtype Source_Buffer is Text_Buffer; -- Type used to store text of a source file . The buffer for the main -- source (the source specified on the command line) has a lower bound - -- starting at zero. Subsequent subsidiary sources have lower bounds which - -- are one greater than the previous upper bound. + -- starting at zero. Subsequent subsidiary sources have lower bounds + -- which are one greater than the previous upper bound. subtype Big_Source_Buffer is Text_Buffer (0 .. Text_Ptr'Last); -- This is a virtual type used as the designated type of the access |