diff options
author | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-04 21:29:11 +0000 |
---|---|---|
committer | mrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-04 21:29:11 +0000 |
commit | aeb682a27a580c32813c316b911b59b851f6f34e (patch) | |
tree | caef14d95e41d87b155a732aa16f18f483eea729 /gcc/doc/gty.texi | |
parent | 8945e16bd0dc520c80b423cc0802c89ce551ff08 (diff) | |
parent | 8dd9f7ce09ba28909b069f5baa405ea4cc7b5c42 (diff) | |
download | gcc-aeb682a27a580c32813c316b911b59b851f6f34e.tar.gz |
Merge in trunk.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/wide-int@204366 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/doc/gty.texi')
-rw-r--r-- | gcc/doc/gty.texi | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gcc/doc/gty.texi b/gcc/doc/gty.texi index 82e8e4f728f..a64d110a980 100644 --- a/gcc/doc/gty.texi +++ b/gcc/doc/gty.texi @@ -87,6 +87,7 @@ data members. @menu * GTY Options:: What goes inside a @code{GTY(())}. +* Inheritance and GTY:: Adding GTY to a class hierarchy. * User GC:: Adding user-provided GC marking routines. * GGC Roots:: Making global variables GGC roots. * Files:: How the generated files work. @@ -234,6 +235,10 @@ In this example, the value of BINDING_HAS_LEVEL_P when applied to a mechanism will treat the field @code{level} as being present and if 0, will treat the field @code{scope} as being present. +The @code{desc} and @code{tag} options can also be used for inheritance +to denote which subclass an instance is. See @ref{Inheritance and GTY} +for more information. + @findex param_is @findex use_param @item param_is (@var{type}) @@ -470,6 +475,60 @@ fields is completely handled by user-provided routines. See section @ref{User GC} for details on what functions need to be provided. @end table +@node Inheritance and GTY +@section Support for inheritance +gengtype has some support for simple class hierarchies. You can use +this to have gengtype autogenerate marking routines, provided: + +@itemize @bullet +@item +There must be a concrete base class, with a discriminator expression +that can be used to identify which subclass an instance is. +@item +Only single inheritance is used. +@item +None of the classes within the hierarchy are templates. +@end itemize + +If your class hierarchy does not fit in this pattern, you must use +@ref{User GC} instead. + +The base class and its discriminator must be identified using the ``desc'' +option. Each concrete subclass must use the ``tag'' option to identify +which value of the discriminator it corresponds to. + +Every class in the hierarchy must have a @code{GTY(())} marker, as +gengtype will only attempt to parse classes that have such a marker +@footnote{Classes lacking such a marker will not be identified as being +part of the hierarchy, and so the marking routines will not handle them, +leading to a assertion failure within the marking routines due to an +unknown tag value (assuming that assertions are enabled).}. + +@smallexample +class GTY((desc("%h.kind"), tag("0"))) example_base +@{ +public: + int kind; + tree a; +@}; + +class GTY((tag("1")) some_subclass : public example_base +@{ +public: + tree b; +@}; + +class GTY((tag("2")) some_other_subclass : public example_base +@{ +public: + tree c; +@}; +@end smallexample + +The generated marking routines for the above will contain a ``switch'' +on ``kind'', visiting all appropriate fields. For example, if kind is +2, it will cast to ``some_other_subclass'' and visit fields a, b, and c. + @node User GC @section Support for user-provided GC marking routines @cindex user gc |