This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Reduce Dwarf Debug Size


A major contribution to object and executable size is DWARF debug
information size.  A major contribution to debug information
size is struct descriptions replicated in several object files.
This patch adds an option to reduce the size of this information,
which mainly benefits C++.

The basic idea is to not emit struct debugging information in the
current compilation unit when that information will be generated
by another compilation unit.  The primary criteria is whether the
base name of the file containing the struct definition matches the
base name of the main file being compiled.  For example, if struct
foo is defined in bar.h, then when used in bar.c, the compiler will
generate the struct debugging information.  On the other hand, when
used in ping.c, the compiler will not generate the information.
This simple approach is complicated by templates, system headers,
indirect use of structs, etc.

Because there is less information, there is a chance that debugging
may be impaired.  Therefore, the compiler's default behavior is
unchanged and the option has a value that enables you to chose the
size versus debuggibility, that is, to choose the criteria by which
struct debugging information will be emitted.  The most important
choices are as follows.

  By default, the compiler's and debugger's behavior does not
  change.

  With -g -gstruct, the compiler conservatively suppresses some
  struct debug information.  Debugging behavior should be mostly
  unimpaired, except perhaps for interactions with non-system
  libraries built without -g.

  With -g -gstruct=base, the compiler emits struct information
  on strictly matching file base names.  Debugging templates or
  structs defined in system headers will be impaired.

Experimentally, the size savings can be significant.  On one very
large application, the sizes were:

 debug executable
  size   size
  100%   100%   with only -g
   60%    73%   with -g -gstruct
   37%    58%   with -g -gstruct=base

The -gstruct option documentation in texinfo is:

  -gstruct[=spec-list]
     Specify the struct-like types for which the compiler will
     generate debug information.  The intent is to reduce duplicate
     struct debug information between different object files within
     the same program.

     A specification has the syntax
     [dir:|ind:][ord:|gen:](any|sys|base|none)

     The optional first word limits the specification to structs
     that are used directly (dir:) or used indirectly (ind:).
     A struct type is used directly when it is the type of a
     variable, member.  Indirect uses arise through pointers to
     structs.  That is, when use of an incomplete struct would be
     legal, the use is indirect.  An example is struct one direct;
     struct two * indirect;.

     The optional second word limits the specification to ordinary
     structs (ord:) or generic structs (gen:).  Generic structs are
     a bit complicated to explain.  For C++, these are non-explicit
     specializations of template classes, or non-template classes
     within the above.  Other programming languages have generics,
     but -gstruct does not yet implement them.

     The third word specifies the source files for those structs for
     which the compiler will emit debug information.  The values
     none and any have the normal meaning.  The value base means
     that the base of name of the file in which the type declaration
     appears must match the base of the name of the main compilation
     file.  In practice, this means that types declared in foo.c
     and foo.h will have debug information, but types declared
     in other header will not.  The value sys means those types
     satisfying base or declared in system or compiler headers.

     By default, the compiler emits debug information
     for any struct.  When -gstruct is present without any
     specification, i.e. without the = sign, the specification
     is dir:ord:sys,dir:gen:any,ind:base, which should provide
     reasonably good debuggability with significant size reduction.
     You may need to experiment to determine the best settings
     for your application.

This option works only with DWARF.

--
Lawrence Crowl

Attachment: gcc-gstruct-compiler-changelog.txt
Description: Text document

Attachment: gcc-gstruct-testsuite-changelog.txt
Description: Text document

==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c-opts.c#11 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c-opts.c ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c-opts.c#11	2007-02-20 11:09:09.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c-opts.c	2007-02-16 14:55:59.000000000 -0800
@@ -823,6 +823,14 @@
       flag_gen_declaration = 1;
       break;
 
+    case OPT_gstruct:
+      set_struct_debug_option ("dir:ord:sys,dir:gen:any,ind:base");
+      break;
+
+    case OPT_gstruct_:
+      set_struct_debug_option (arg);
+      break;
+
     case OPT_idirafter:
       add_path (xstrdup (arg), AFTER, 0, true);
       break;
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c.opt#11 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c.opt ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c.opt#11	2007-02-20 11:09:09.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/c.opt	2007-02-16 16:28:12.000000000 -0800
@@ -775,6 +775,14 @@
 ObjC ObjC++
 Dump declarations to a .decl file
 
+gstruct
+C ObjC C++ ObjC++
+-gstruct	Reduced debug info for structs
+
+gstruct=
+C ObjC C++ ObjC++ Joined
+-gstruct=<spec-list>	Controlled reduced debug info for structs
+
 idirafter
 C ObjC C++ ObjC++ Joined Separate
 -idirafter <dir>	Add <dir> to the end of the system include path
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-lang.c#2 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-lang.c ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-lang.c#2	2007-02-20 11:09:09.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-lang.c	2007-02-02 17:40:31.000000000 -0800
@@ -44,6 +44,8 @@
 #define LANG_HOOKS_NAME "GNU C++"
 #undef LANG_HOOKS_INIT
 #define LANG_HOOKS_INIT cxx_init
+#undef LANG_HOOKS_GENERIC_TYPE_P
+#define LANG_HOOKS_GENERIC_TYPE_P class_tmpl_impl_spec_p
 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
 #define LANG_HOOKS_DECL_PRINTABLE_NAME	cxx_printable_name
 #undef LANG_HOOKS_FOLD_OBJ_TYPE_REF
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-tree.h#11 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-tree.h ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-tree.h#11	2007-02-20 11:09:09.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/cp-tree.h	2007-02-02 17:40:31.000000000 -0800
@@ -4384,6 +4384,7 @@
 extern tree cxx_maybe_build_cleanup		(tree);
 extern void init_tree				(void);
 extern int pod_type_p				(tree);
+extern bool class_tmpl_impl_spec_p		(tree);
 extern int zero_init_p				(tree);
 extern tree canonical_type_variant		(tree);
 extern tree copy_binfo				(tree, tree, tree,
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/tree.c#3 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/tree.c ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/tree.c#3	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/cp/tree.c	2007-02-02 17:40:31.000000000 -0800
@@ -1904,6 +1904,14 @@
   return 1;
 }
 
+/* Nonzero iff type T is a class template implicit specialization.  */
+
+bool
+class_tmpl_impl_spec_p (tree t)
+{
+  return CLASS_TYPE_P (t) && CLASSTYPE_TEMPLATE_INSTANTIATION (t);
+}
+
 /* Returns 1 iff zero initialization of type T means actually storing
    zeros in it.  */
 
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/doc/invoke.texi#39 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/doc/invoke.texi ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/doc/invoke.texi#39	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/doc/invoke.texi	2007-02-16 15:02:11.000000000 -0800
@@ -297,6 +297,7 @@
 -ftest-coverage  -ftime-report -fvar-tracking @gol
 -g  -g@var{level}  -gcoff -gdwarf-2 @gol
 -ggdb  -gstabs  -gstabs+  -gvms  -gxcoff  -gxcoff+ @gol
+-gstruct@r{[}=@var{spec-list}@r{]} @gol
 -p  -pg  -print-file-name=@var{library}  -print-libgcc-file-name @gol
 -print-multi-directory  -print-multi-lib @gol
 -print-prog-name=@var{program}  -print-search-dirs  -Q @gol
@@ -3754,6 +3755,54 @@
 information about each symbol.  This option only makes sense when
 generating DWARF2 debugging information with @option{-gdwarf-2}.
 
+@item -gstruct@r{[}=@var{spec-list}@r{]}
+Specify the struct-like types
+for which the compiler will generate debug information.
+The intent is to reduce duplicate struct debug information
+between different object files within the same program.
+
+A specification has the syntax
+[@samp{dir:}|@samp{ind:}][@samp{ord:}|@samp{gen:}](@samp{any}|@samp{sys}|@samp{base}|@samp{none})
+
+The optional first word limits the specification to
+structs that are used directly (@samp{dir:}) or used indirectly (@samp{ind:}).
+A struct type is used directly when it is the type of a variable, member.
+Indirect uses arise through pointers to structs.
+That is, when use of an incomplete struct would be legal, the use is indirect.
+An example is
+@samp{struct one direct; struct two * indirect;}.
+
+The optional second word limits the specification to
+ordinary structs (@samp{ord:}) or generic structs (@samp{gen:}).
+Generic structs are a bit complicated to explain.
+For C++, these are non-explicit specializations of template classes,
+or non-template classes within the above.
+Other programming languages have generics,
+but @samp{-gstruct} does not yet implement them.
+
+The third word specifies the source files for those
+structs for which the compiler will emit debug information.
+The values @samp{none} and @samp{any} have the normal meaning.
+The value @samp{base} means that
+the base of name of the file in which the type declaration appears
+must match the base of the name of the main compilation file.
+In practice, this means that
+types declared in @file{foo.c} and @file{foo.h} will have debug information,
+but types declared in other header will not.
+The value @samp{sys} means those types satisfying @samp{base}
+or declared in system or compiler headers.
+
+By default, the compiler emits debug information for any struct.
+When @samp{-gstruct} is present without any specification,
+i.e. without the @samp{=} sign,
+the specification is @samp{dir:ord:sys,dir:gen:any,ind:base},
+which should provide reasonably good debuggability
+with significant size reduction.
+You may need to experiment to determine the best settings
+for your application.
+
+This option works only with DWARF.
+
 @cindex @command{prof}
 @item -p
 @opindex p
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/dwarf2out.c#12 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/dwarf2out.c ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/dwarf2out.c#12	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/dwarf2out.c	2007-02-20 11:13:32.000000000 -0800
@@ -4214,7 +4214,8 @@
 static dw_die_ref gen_compile_unit_die (const char *);
 static void gen_inheritance_die (tree, tree, dw_die_ref);
 static void gen_member_die (tree, dw_die_ref);
-static void gen_struct_or_union_type_die (tree, dw_die_ref);
+static void gen_struct_or_union_type_die (tree, dw_die_ref,
+						enum debug_info_usage);
 static void gen_subroutine_type_die (tree, dw_die_ref);
 static void gen_typedef_die (tree, dw_die_ref);
 static void gen_type_die (tree, dw_die_ref);
@@ -12501,7 +12502,8 @@
    member DIEs needed by later specification DIEs.  */
 
 static void
-gen_struct_or_union_type_die (tree type, dw_die_ref context_die)
+gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
+				enum debug_info_usage usage)
 {
   dw_die_ref type_die = lookup_type_die (type);
   dw_die_ref scope_die = 0;
@@ -12510,6 +12512,7 @@
 		  && (! TYPE_STUB_DECL (type)
 		      || ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))));
   int ns_decl = (context_die && context_die->die_tag == DW_TAG_namespace);
+  complete = complete && should_emit_struct_debug (type, usage);
 
   if (type_die && ! complete)
     return;
@@ -12646,7 +12649,8 @@
 /* Generate a type description DIE.  */
 
 static void
-gen_type_die (tree type, dw_die_ref context_die)
+gen_type_die_with_usage (tree type, dw_die_ref context_die,
+				enum debug_info_usage usage)
 {
   int need_pop;
 
@@ -12694,16 +12698,19 @@
 
       /* For these types, all that is required is that we output a DIE (or a
 	 set of DIEs) to represent the "basis" type.  */
-      gen_type_die (TREE_TYPE (type), context_die);
+      gen_type_die_with_usage (TREE_TYPE (type), context_die,
+				DINFO_USAGE_IND_USE);
       break;
 
     case OFFSET_TYPE:
       /* This code is used for C++ pointer-to-data-member types.
 	 Output a description of the relevant class type.  */
-      gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die);
+      gen_type_die_with_usage (TYPE_OFFSET_BASETYPE (type), context_die,
+					DINFO_USAGE_IND_USE);
 
       /* Output a description of the type of the object pointed to.  */
-      gen_type_die (TREE_TYPE (type), context_die);
+      gen_type_die_with_usage (TREE_TYPE (type), context_die,
+					DINFO_USAGE_IND_USE);
 
       /* Now output a DIE to represent this pointer-to-data-member type
 	 itself.  */
@@ -12712,13 +12719,15 @@
 
     case FUNCTION_TYPE:
       /* Force out return type (in case it wasn't forced out already).  */
-      gen_type_die (TREE_TYPE (type), context_die);
+      gen_type_die_with_usage (TREE_TYPE (type), context_die,
+					DINFO_USAGE_DIR_USE);
       gen_subroutine_type_die (type, context_die);
       break;
 
     case METHOD_TYPE:
       /* Force out return type (in case it wasn't forced out already).  */
-      gen_type_die (TREE_TYPE (type), context_die);
+      gen_type_die_with_usage (TREE_TYPE (type), context_die,
+					DINFO_USAGE_DIR_USE);
       gen_subroutine_type_die (type, context_die);
       break;
 
@@ -12744,7 +12753,7 @@
 	  && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
 	  && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
 	{
-	  gen_type_die (TYPE_CONTEXT (type), context_die);
+	  gen_type_die_with_usage (TYPE_CONTEXT (type), context_die, usage);
 
 	  if (TREE_ASM_WRITTEN (type))
 	    return;
@@ -12768,7 +12777,7 @@
 	    gen_enumeration_type_die (type, context_die);
 	}
       else
-	gen_struct_or_union_type_die (type, context_die);
+	gen_struct_or_union_type_die (type, context_die, usage);
 
       if (need_pop)
 	pop_decl_scope ();
@@ -12797,6 +12806,12 @@
   TREE_ASM_WRITTEN (type) = 1;
 }
 
+static void
+gen_type_die (tree type, dw_die_ref context_die)
+{
+  gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
+}
+
 /* Generate a DIE for a tagged type instantiation.  */
 
 static void
@@ -13392,7 +13407,11 @@
   if (!context)
     scope_die = comp_unit_die;
   else if (TYPE_P (context))
+    {
+      if (!should_emit_struct_debug (context, DINFO_USAGE_DIR_USE))
+	return;
     scope_die = force_type_die (context);
+    }
   else
     scope_die = force_decl_die (context);
 
@@ -13413,7 +13432,12 @@
 
 	      if (TYPE_CONTEXT (type))
 		if (TYPE_P (TYPE_CONTEXT (type)))
+		  {
+		    if (!should_emit_struct_debug (TYPE_CONTEXT (type),
+						   DINFO_USAGE_DIR_USE))
+		      return;
 		  type_context_die = force_type_die (TYPE_CONTEXT (type));
+		  }
 	      else
 		type_context_die = force_decl_die (TYPE_CONTEXT (type));
 	      else
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/flags.h#3 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/flags.h ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/flags.h#3	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/flags.h	2007-02-05 13:20:48.000000000 -0800
@@ -23,6 +23,7 @@
 #ifndef GCC_FLAGS_H
 #define GCC_FLAGS_H
 
+#include "coretypes.h"
 #include "options.h"
 
 enum debug_info_type
@@ -54,6 +55,25 @@
 /* Specify how much debugging info to generate.  */
 extern enum debug_info_level debug_info_level;
 
+/* A major contribution to object and executable size is debug
+   information size.  A major contribution to debug information
+   size is struct descriptions replicated in several object files.
+   The following function determines whether or not debug information
+   should be generated for a given struct.  The indirect parameter
+   indicates that the struct is being handled indirectly, via
+   a pointer.  See opts.c for the implementation. */
+
+enum debug_info_usage
+{
+  DINFO_USAGE_DFN,	/* A struct definition. */
+  DINFO_USAGE_DIR_USE,	/* A direct use, such as the type of a variable. */
+  DINFO_USAGE_IND_USE,	/* An indirect use, such as through a pointer. */
+  DINFO_USAGE_NUM_ENUMS	/* The number of enumerators. */
+};
+
+extern bool should_emit_struct_debug (tree type_decl, enum debug_info_usage);
+extern void set_struct_debug_option (const char *value);
+
 /* Nonzero means use GNU-only extensions in the generated symbolic
    debugging information.  */
 extern bool use_gnu_debug_info_extensions;
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks-def.h#3 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks-def.h ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks-def.h#3	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks-def.h	2007-02-02 17:40:31.000000000 -0800
@@ -216,6 +216,7 @@
    so we create a compile-time error instead.  */
 #define LANG_HOOKS_MAKE_TYPE lhd_make_node
 #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error
+#define LANG_HOOKS_GENERIC_TYPE_P	hook_bool_tree_false
 #define LANG_HOOKS_TYPE_PROMOTES_TO lhd_type_promotes_to
 #define LANG_HOOKS_REGISTER_BUILTIN_TYPE lhd_register_builtin_type
 #define LANG_HOOKS_TYPE_MAX_SIZE	lhd_return_null_tree
@@ -230,6 +231,7 @@
   LANG_HOOKS_UNSIGNED_TYPE, \
   LANG_HOOKS_SIGNED_TYPE, \
   LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, \
+  LANG_HOOKS_GENERIC_TYPE_P, \
   LANG_HOOKS_TYPE_PROMOTES_TO, \
   LANG_HOOKS_REGISTER_BUILTIN_TYPE, \
   LANG_HOOKS_INCOMPLETE_TYPE_ERROR, \
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks.h#3 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks.h ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks.h#3	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/langhooks.h	2007-02-02 17:40:31.000000000 -0800
@@ -119,6 +119,10 @@
      according to UNSIGNEDP.  */
   tree (*signed_or_unsigned_type) (int, tree);
 
+  /* True if the type is an instantiation of a generic type,
+     e.g. C++ template implicit specializations.  */
+  bool (*generic_p) (tree);
+
   /* Given a type, apply default promotions to unnamed function
      arguments and return the new type.  Return the same type if no
      change.  Required by any language that supports variadic
==== //depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/opts.c#8 - /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/opts.c ====
--- /tmp/g4-21482/cache/depot2/gcctools/google_vendor_src_branch/gcc/trunk/gcc/opts.c#8	2007-02-20 11:09:10.000000000 -0800
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/opts.c	2007-02-02 17:40:31.000000000 -0800
@@ -73,6 +73,251 @@
    the definitions of the different possible levels.  */
 enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
 
+/* A major contribution to object and executable size is debug
+   information size.  A major contribution to debug information size
+   is struct descriptions replicated in several object files. The
+   following flags attempt to reduce this information.  The basic
+   idea is to not emit struct debugging information in the current
+   compilation unit when that information will be generated by
+   another compilation unit.
+
+   Debug information for a struct defined in the current source
+   file should be generated in the object file.  Likewise the
+   debug information for a struct defined in a header should be
+   generated in the object file of the corresponding source file.
+   Both of these case are handled when the base name of the file of
+   the struct definition matches the base name of the source file
+   of thet current compilation unit.  This matching emits minimal
+   struct debugging information.
+
+   The base file name matching rule above will fail to emit debug
+   information for structs defined in system headers.  So a second
+   category of files includes system headers in addition to files
+   with matching bases.
+
+   The remaining types of files are library headers and application
+   headers.  We cannot currently distinguish these two types.  */
+
+enum debug_struct_file
+{
+  DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
+  DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
+                               same base name as the compilation unit. */
+  DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
+                               header files.  */
+  DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
+};
+
+/* Generic structs (e.g. templates not explicitly specialized)
+   may not have a compilation unit associated with them, and so
+   may need to be treated differently from ordinary structs.
+
+   Structs only handled by reference (indirectly), will also usually
+   not need as much debugging information.  */
+
+static enum debug_struct_file gstruct_ordinary[DINFO_USAGE_NUM_ENUMS]
+  = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
+static enum debug_struct_file gstruct_generic[DINFO_USAGE_NUM_ENUMS]
+  = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
+
+/* Parse the -gstruct option value and set the flag variables. */
+
+#define MATCH( prefix, string ) \
+  ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
+   ? ((string += sizeof prefix - 1), 1) : 0)
+
+void
+set_struct_debug_option (const char *spec)
+{
+  /* various labels for comparison */
+  static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
+  static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
+  static char none_lbl[] = "none", any_lbl[] = "any";
+  static char base_lbl[] = "base", sys_lbl[] = "sys";
+
+  enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
+  /* Default is to apply to as much as possible. */
+  enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
+  int ord = 1, gen = 1;
+
+  /* What usage? */
+  if (MATCH (dfn_lbl, spec))
+    usage = DINFO_USAGE_DFN;
+  else if (MATCH (dir_lbl, spec))
+    usage = DINFO_USAGE_DIR_USE;
+  else if (MATCH (ind_lbl, spec))
+    usage = DINFO_USAGE_IND_USE;
+
+  /* Generics or not? */
+  if (MATCH (ord_lbl, spec))
+    gen = 0;
+  else if (MATCH (gen_lbl, spec))
+    ord = 0;
+
+  /* What allowable environment? */
+  if (MATCH (none_lbl, spec))
+    files = DINFO_STRUCT_FILE_NONE;
+  else if (MATCH (any_lbl, spec))
+    files = DINFO_STRUCT_FILE_ANY;
+  else if (MATCH (sys_lbl, spec))
+    files = DINFO_STRUCT_FILE_SYS;
+  else if (MATCH (base_lbl, spec))
+    files = DINFO_STRUCT_FILE_BASE;
+  else
+    error ("argument %qs to %<-gstruct%> not recognized", spec);
+
+  /* Effect the specification. */
+  if (usage == DINFO_USAGE_NUM_ENUMS)
+    {
+      if (ord)
+        {
+          gstruct_ordinary[DINFO_USAGE_DFN] = files;
+          gstruct_ordinary[DINFO_USAGE_DIR_USE] = files;
+          gstruct_ordinary[DINFO_USAGE_IND_USE] = files;
+        }
+      if (gen)
+        {
+          gstruct_generic[DINFO_USAGE_DFN] = files;
+          gstruct_generic[DINFO_USAGE_DIR_USE] = files;
+          gstruct_generic[DINFO_USAGE_IND_USE] = files;
+        }
+    }
+  else
+    {
+      if (ord)
+        gstruct_ordinary[usage] = files;
+      if (gen)
+        gstruct_generic[usage] = files;
+    }
+
+  if (*spec == ',')
+    set_struct_debug_option (spec+1);
+  else
+    {
+      /* No more -ggstruct specifications.  Do final checks. */
+      if (*spec != '\0')
+	error ("argument %qs to %<-gstruct%> not recognized", spec);
+      if (gstruct_ordinary[DINFO_USAGE_DIR_USE]
+		< gstruct_ordinary[DINFO_USAGE_IND_USE]
+	  || gstruct_generic[DINFO_USAGE_DIR_USE]
+		< gstruct_generic[DINFO_USAGE_IND_USE])
+	error ("%<-gstruct=dir:...%> must allow at least as much as %<-gstruct=ind:...%>");
+    }
+}
+
+/* Find the base name of a path, stripping off both directories and
+   a single final extension. */
+static int
+base_of_path (const char *path, const char **base_out)
+{
+  const char *base = path;
+  const char *dot = 0;
+  const char *p = path;
+  char c = *p;
+  while (c)
+    {
+      if (IS_DIR_SEPARATOR(c))
+        {
+          base = p + 1;
+          dot = 0;
+        }
+      else if (c == '.')
+        dot = p;
+      c = *++p;
+    }
+  if (!dot)
+    dot = p;
+  *base_out = base;
+  return dot - base;
+}
+
+/* Match the base name of a file to the base name of a compilation unit. */
+
+static const char *main_input_basename;
+static int main_input_baselength;
+
+static int
+matches_main_base (const char *path)
+{
+  /* Cache the last query. */
+  static const char *last_path = NULL;
+  static int last_match = 0;
+  if (path != last_path)
+    {
+      const char *base;
+      int length = base_of_path (path, &base);
+      last_path = path;
+      last_match = (length == main_input_baselength
+                    && memcmp (base, main_input_basename, length) == 0);
+    }
+  return last_match;
+}
+
+#ifdef DEBUG_GSTRUCT
+
+static int
+dump_struct_debug (tree type, enum debug_info_usage usage,
+		   enum debug_struct_file criterion, int generic,
+		   int matches, int result)
+{
+  /* Find the type name. */
+  tree type_decl = TYPE_STUB_DECL (type);
+  tree t = type_decl;
+  const char *name = 0;
+  if (TREE_CODE (t) == TYPE_DECL)
+    t = DECL_NAME (t);
+  if (t)
+    name = IDENTIFIER_POINTER (t);
+
+  fprintf (stderr, "	struct %d %s %s %s %s %d %p %s\n",
+	   criterion,
+           DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
+           matches ? "bas" : "hdr",
+           generic ? "gen" : "ord",
+           usage == DINFO_USAGE_DFN ? ";" :
+             usage == DINFO_USAGE_DIR_USE ? "." : "*",
+           result,
+           (void*) type_decl, name);
+  return result;
+}
+#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
+  dump_struct_debug (type, usage, criterion, generic, matches, result)
+
+#else
+
+#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
+  (result)
+
+#endif
+
+
+bool
+should_emit_struct_debug (tree type, enum debug_info_usage usage)
+{
+  enum debug_struct_file criterion;
+  tree type_decl;
+  bool generic = lang_hooks.types.generic_p (type);
+
+  if (generic)
+    criterion = gstruct_generic[usage];
+  else
+    criterion = gstruct_ordinary[usage];
+
+  if (criterion == DINFO_STRUCT_FILE_NONE)
+    return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
+  if (criterion == DINFO_STRUCT_FILE_ANY)
+    return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
+
+  type_decl = TYPE_STUB_DECL (type);
+
+  if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
+    return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
+
+  if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
+    return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
+  return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
+}
+
 /* Nonzero means use GNU-only extensions in the generated symbolic
    debugging information.  Currently, this only has an effect when
    write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG.  */
@@ -364,7 +609,11 @@
       if (opt[0] != '-' || opt[1] == '\0')
 	{
 	  if (main_input_filename == NULL)
+	    {
 	    main_input_filename = opt;
+	      main_input_baselength
+		= base_of_path (main_input_filename, &main_input_basename);
+	    }
 	  add_input_filename (opt);
 	  n = 1;
 	  continue;
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-any.C ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-any.C	2007-02-16 14:10:30.000000000 -0800
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=any" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "gstruct-any.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-any.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-any.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-any.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-any.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-any.h	2007-02-16 14:09:08.000000000 -0800
@@ -0,0 +1,42 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+    gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+    gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+    gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+    gstruct_head_tmpl_defn_fld_base< T >  field1_base_tmpl_defn_var_base_fld;
+    gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+    gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+    gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+    gstruct_base_tmpl_defn_fld_base< T >  field2_base_tmpl_defn_var_base_fld;
+};
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-base.C ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-base.C	2007-02-16 14:13:43.000000000 -0800
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=base" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "gstruct-base.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-base.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-base.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-base.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-base.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-base.h	2007-02-16 14:12:36.000000000 -0800
@@ -0,0 +1,42 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+    gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+    gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+    gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+    gstruct_head_tmpl_defn_fld_base< T >  field1_base_tmpl_defn_var_base_fld;
+    gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+    gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+    gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+    gstruct_base_tmpl_defn_fld_base< T >  field2_base_tmpl_defn_var_base_fld;
+};
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-none.C ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-none.C	2007-02-16 14:15:11.000000000 -0800
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=none" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "gstruct-none.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-none.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-none.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-none.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-none.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-none.h	2007-02-16 14:12:36.000000000 -0800
@@ -0,0 +1,42 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+    gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+    gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+    gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+    gstruct_head_tmpl_defn_fld_base< T >  field1_base_tmpl_defn_var_base_fld;
+    gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+    gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+    gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+    gstruct_base_tmpl_defn_fld_base< T >  field2_base_tmpl_defn_var_base_fld;
+};
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-plain.C ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-plain.C	2007-02-16 14:16:21.000000000 -0800
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "gstruct-plain.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-plain.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-plain.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-plain.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-plain.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-plain.h	2007-02-16 14:11:30.000000000 -0800
@@ -0,0 +1,42 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+    gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+    gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+    gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+    gstruct_head_tmpl_defn_fld_base< T >  field1_base_tmpl_defn_var_base_fld;
+    gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+    gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+    gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+    gstruct_base_tmpl_defn_fld_base< T >  field2_base_tmpl_defn_var_base_fld;
+};
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-sys.C ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-sys.C	2007-02-16 14:17:09.000000000 -0800
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=sys" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "gstruct-sys.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-sys.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-sys.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-sys.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-sys.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct-sys.h	2007-02-16 14:12:36.000000000 -0800
@@ -0,0 +1,42 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+    gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+    gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+    gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+    gstruct_head_tmpl_defn_fld_base< T >  field1_base_tmpl_defn_var_base_fld;
+    gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+    gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+    gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+    gstruct_base_tmpl_defn_fld_base< T >  field2_base_tmpl_defn_var_base_fld;
+};
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/g++.dg/other/gstruct.h	2007-02-15 18:10:02.000000000 -0800
@@ -0,0 +1,67 @@
+/*
+where from: base = matching base; head = other header
+what kind:  ordy = ordinary struct; tmpl = template struct
+definition: decl = incomplete declaration; defn = full definition
+how used:   not = not used; ref = by ref; ptr = through pointer;
+            fld = as field; var = as variable
+from where: base = from base; head = other header
+*/
+
+struct gstruct_head_ordy_decl_not;
+struct gstruct_head_ordy_defn_not { int field_head_ordy_defn_not; };
+
+struct gstruct_head_ordy_decl_ref_head;
+struct gstruct_head_ordy_defn_ref_head { int field_head_ordy_defn_ref_head; };
+struct gstruct_head_ordy_defn_ptr_head { int field_head_ordy_defn_ptr_head; };
+struct gstruct_head_ordy_defn_fld_head { int field_head_ordy_defn_fld_head; };
+struct gstruct_head_ordy_defn_var_head {
+    gstruct_head_ordy_decl_ref_head *field_head_ordy_defn_var_head_inc;
+    gstruct_head_ordy_defn_ref_head *field_head_ordy_defn_var_head_ref;
+    gstruct_head_ordy_defn_ptr_head *field_head_ordy_defn_var_head_ptr;
+    gstruct_head_ordy_defn_fld_head  field_head_ordy_defn_var_head_fld;
+};
+extern struct gstruct_head_ordy_defn_var_head head_var1;
+
+struct gstruct_head_ordy_decl_ref_base;
+struct gstruct_head_ordy_defn_ref_base { int field_head_ordy_defn_ref_base; };
+struct gstruct_head_ordy_defn_ptr_base { int field_head_ordy_defn_ptr_base; };
+struct gstruct_head_ordy_defn_fld_base { int field_head_ordy_defn_fld_base; };
+struct gstruct_head_ordy_defn_var_base { int field_head_ordy_defn_var_base; };
+
+template< typename T > struct gstruct_head_tmpl_decl_not;
+template< typename T > struct gstruct_head_tmpl_defn_not
+{ T field_head_tmpl_defn_not; };
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_head;
+template< typename T > struct gstruct_head_tmpl_defn_ref_head
+{ T field_head_tmpl_defn_ref_head; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_head
+{ T field_head_tmpl_defn_ptr_head; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_head
+{ T field_head_tmpl_defn_fld_head; };
+template< typename T > struct gstruct_head_tmpl_defn_var_head {
+    gstruct_head_tmpl_decl_ref_head< T > *field_head_tmpl_defn_var_head_inc;
+    gstruct_head_tmpl_defn_ref_head< T > *field_head_tmpl_defn_var_head_ref;
+    gstruct_head_tmpl_defn_ptr_head< T > *field_head_tmpl_defn_var_head_ptr;
+    gstruct_head_tmpl_defn_fld_head< T >  field_head_tmpl_defn_var_head_fld;
+};
+extern gstruct_head_tmpl_defn_var_head< int > head_var5;
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_base;
+template< typename T > struct gstruct_head_tmpl_defn_ref_base
+{ T field_head_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_base
+{ T field_head_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_base
+{ T field_head_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_head_tmpl_defn_var_base
+{ T field_head_tmpl_defn_var_base; };
+
+inline int head_function() {
+    return 0
++ head_var1.field_head_ordy_defn_var_head_ptr->field_head_ordy_defn_ptr_head
++ head_var1.field_head_ordy_defn_var_head_fld.field_head_ordy_defn_fld_head
++ head_var5.field_head_tmpl_defn_var_head_ptr->field_head_tmpl_defn_ptr_head
++ head_var5.field_head_tmpl_defn_var_head_fld.field_head_tmpl_defn_fld_head
+;
+}
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-any.c ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-any.c	2007-02-20 10:53:36.000000000 -0800
@@ -0,0 +1,84 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=any" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+# 1 "gstruct-any.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-any.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-any.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-any.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-any.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-any.h	2007-02-20 10:53:56.000000000 -0800
@@ -0,0 +1,19 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    struct gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    struct gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    struct gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    struct gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    struct gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    struct gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    struct gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    struct gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-base.c ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-base.c	2007-02-20 10:54:13.000000000 -0800
@@ -0,0 +1,83 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=base" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+# 1 "gstruct-base.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-base.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-base.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-base.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
+;
+}
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-base.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-base.h	2007-02-20 10:54:26.000000000 -0800
@@ -0,0 +1,19 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    struct gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    struct gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    struct gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    struct gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    struct gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    struct gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    struct gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    struct gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-none.c ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-none.c	2007-02-20 10:50:45.000000000 -0800
@@ -0,0 +1,84 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=none" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+# 1 "gstruct-none.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-none.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-none.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-none.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
+;
+}
+
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-none.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-none.h	2007-02-20 10:54:49.000000000 -0800
@@ -0,0 +1,19 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    struct gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    struct gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    struct gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    struct gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    struct gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    struct gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    struct gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    struct gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-plain.c ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-plain.c	2007-02-20 10:55:03.000000000 -0800
@@ -0,0 +1,83 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+# 1 "gstruct-plain.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-plain.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-plain.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-plain.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
+;
+}
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-plain.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-plain.h	2007-02-20 10:55:13.000000000 -0800
@@ -0,0 +1,19 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    struct gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    struct gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    struct gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    struct gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    struct gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    struct gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    struct gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    struct gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-sys.c ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-sys.c	2007-02-20 10:55:21.000000000 -0800
@@ -0,0 +1,83 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -gstruct=sys" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+# 1 "gstruct-sys.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "gstruct-sys.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+  {
+    long int tv_sec;
+    long int tv_nsec;
+  };
+
+struct itimerspec
+  {
+    struct timespec it_interval;
+    struct timespec it_value;
+  };
+
+# 6 "gstruct-sys.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "gstruct-sys.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+int base_function() {
+    return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
+;
+}
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-sys.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct-sys.h	2007-02-20 10:55:32.000000000 -0800
@@ -0,0 +1,19 @@
+#include "gstruct.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+    struct gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+    struct gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+    struct gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+    struct gstruct_head_ordy_defn_fld_base  field1_base_ordy_defn_var_base_fld;
+    struct gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+    struct gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+    struct gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+    struct gstruct_base_ordy_defn_fld_base  field2_base_ordy_defn_var_base_fld;
+};
==== (added) /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct.h ====
--- /dev/null	2006-05-22 07:25:23.000000000 -0700
+++ /usr/local/google/crowl/gstruct/gccsrc-update/gcctools/google_vendor_src_branch/gcc/trunk/gcc/testsuite/gcc.dg/gstruct.h	2007-02-20 10:55:47.000000000 -0800
@@ -0,0 +1,36 @@
+/*
+where from: base = matching base; head = other header
+what kind:  ordy = ordinary struct; tmpl = template struct
+definition: decl = incomplete declaration; defn = full definition
+how used:   not = not used; ref = by ref; ptr = through pointer;
+            fld = as field; var = as variable
+from where: base = from base; head = other header
+*/
+
+struct gstruct_head_ordy_decl_not;
+struct gstruct_head_ordy_defn_not { int field_head_ordy_defn_not; };
+
+struct gstruct_head_ordy_decl_ref_head;
+struct gstruct_head_ordy_defn_ref_head { int field_head_ordy_defn_ref_head; };
+struct gstruct_head_ordy_defn_ptr_head { int field_head_ordy_defn_ptr_head; };
+struct gstruct_head_ordy_defn_fld_head { int field_head_ordy_defn_fld_head; };
+struct gstruct_head_ordy_defn_var_head {
+    struct gstruct_head_ordy_decl_ref_head *field_head_ordy_defn_var_head_inc;
+    struct gstruct_head_ordy_defn_ref_head *field_head_ordy_defn_var_head_ref;
+    struct gstruct_head_ordy_defn_ptr_head *field_head_ordy_defn_var_head_ptr;
+    struct gstruct_head_ordy_defn_fld_head  field_head_ordy_defn_var_head_fld;
+};
+extern struct gstruct_head_ordy_defn_var_head head_var1;
+
+struct gstruct_head_ordy_decl_ref_base;
+struct gstruct_head_ordy_defn_ref_base { int field_head_ordy_defn_ref_base; };
+struct gstruct_head_ordy_defn_ptr_base { int field_head_ordy_defn_ptr_base; };
+struct gstruct_head_ordy_defn_fld_base { int field_head_ordy_defn_fld_base; };
+struct gstruct_head_ordy_defn_var_base { int field_head_ordy_defn_var_base; };
+
+inline int head_function() {
+    return 0
++ head_var1.field_head_ordy_defn_var_head_ptr->field_head_ordy_defn_ptr_head
++ head_var1.field_head_ordy_defn_var_head_fld.field_head_ordy_defn_fld_head
+;
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]