GCC uses some fairly sophisticated memory management techniques, which involve determining information about GCC's data structures from GCC's source code and using this information to perform garbage collection.
A full C parser would be too overcomplicated for this task, so a limited
subset of C is interpreted and special markers are used to determine
what parts of the source to look at.  The parser can also detect
simple typedefs of the form typedef struct ID1 *ID2; and
typedef int ID3;, and these don't need to be specially marked.
   
The two forms that do need to be marked are:
struct ID1 GTY(([options]))
{
  [fields]
};
typedef struct ID2 GTY(([options]))
{
  [fields]
} ID3;