Find a file
Lawrence Crowl 5d59b5e18a This patch implements generic type query and conversion functions,
and applies them to the use of cgraph_node, varpool_node, and symtab_node.

The functions are:

bool is_a <TYPE> (pointer)
  Tests whether the pointer actually points to a more derived TYPE.

TYPE *as_a <TYPE> (pointer)
  Converts pointer to a TYPE*.

TYPE *dyn_cast <TYPE> (pointer)
  Converts pointer to TYPE* if and only if "is_a <TYPE> pointer".
  Otherwise, returns NULL.
  This function is essentially a checked down cast.

These functions reduce compile time and increase type safety when treating a
generic item as a more specific item.  In essence, the code change is from

  if (symtab_function_p (node))
    {
      struct cgraph_node *cnode = cgraph (node);
      ....
    }

to

  if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
    {
      ....
    }

The necessary conditional test defines a variable that holds a known good
pointer to the specific item and avoids subsequent conversion calls and
the assertion checks that may come with them.

When, the property test is embedded within a larger condition, the variable
declaration gets pulled out of the condition.  (This leaves some room for
using the variable inappropriately.)

  if (symtab_variable_p (node)
      && varpool (node)->finalized)
    varpool_analyze_node (varpool (node));

becomes

  varpool_node *vnode = dyn_cast <varpool_node> (node);
  if (vnode && vnode->finalized)
    varpool_analyze_node (vnode);

Note that we have converted two sets of assertions in the calls to varpool
into safe and efficient use of a variable.


There are remaining calls to symtab_function_p and symtab_variable_p that
do not involve a pointer to a more specific type.  These have been converted
to calls to a functions is_a <cgraph_node> and is_a <varpool_node>.  The
original predicate functions have been removed.

The cgraph.h header defined both a struct and a function with the name
varpool_node.  This name overloading can cause some unintuitive error messages
when, as is common in C++, one omits the struct keyword when using the type.
I have renamed the function to varpool_node_for_decl.

Tested on x86_64.


Index: gcc/ChangeLog

2012-10-31  Lawrence Crowl  <crowl@google.com>

	* is-a.h: New.
	(is_a <T> (U*)): New.  Test for is-a relationship.
	(as_a <T> (U*)): New.  Treat as a derived type.
	(dyn_cast <T> (U*)): New.  Conditionally cast based on is_a.
	* cgraph.h (varpool_node): Rename to varpool_node_for_decl.
	Adjust callers to match.
	(is_a_helper <cgraph_node>::test (symtab_node_def *)): New.
	(is_a_helper <varpool_node>::test (symtab_node_def *)): New.
	(symtab_node_def::try_function): New.  Change most calls to
	symtab_function_p with calls to dyn_cast <cgraph_node> (p).
	(symtab_node_def::try_variable): New.  Change most calls to
	symtab_variable_p with calls to dyn_cast <varpool_node> (p).
	(symtab_function_p): Remove.  Change callers to use
        is_a <cgraph_node> (p) instead.
	(symtab_variable_p): Remove.  Change callers to use
        is_a <varpool_node> (p) instead.
	* cgraph.c (cgraph_node_for_asm): Remove redundant call to
	symtab_node_for_asm.
	* cgraphunit.c (symbol_finalized_and_needed): New.
	(symbol_finalized): New.
	(cgraph_analyze_functions): Split complicated conditionals out into
	above new functions.
	* Makefile.in (CGRAPH_H): Add is-a.h as used by cgraph.h.

From-SVN: r193051
2012-10-31 23:15:10 +00:00
boehm-gc * configure: Regenerated. 2012-09-14 19:25:07 -04:00
config gthr.m4: New. 2012-10-15 13:10:30 +00:00
contrib validate_failures.py: Fix parsing of summary lines. 2012-10-31 12:37:06 -04:00
fixincludes It is October, not September. :) 2012-10-29 16:58:16 +00:00
gcc This patch implements generic type query and conversion functions, 2012-10-31 23:15:10 +00:00
gnattools Remove obsolete IRIX 6.5 support 2012-03-14 16:33:37 +00:00
include Allow dynamic initialization of thread_locals. 2012-10-08 10:45:37 -04:00
INSTALL README: Also refer to the online installation instructions. 2012-08-25 20:48:20 +00:00
intl Fix unportable shell quoting. 2010-09-27 20:19:41 +00:00
libada Makefile.in (GNATLIBCFLAGS_FOR_C): Remove $(PIC_FLAG_FOR_TARGET). 2012-06-11 15:24:12 +00:00
libatomic AArch64 [6/10] 2012-10-23 17:22:48 +00:00
libbacktrace mmap.c (backtrace_vector_release): Correct last patch: add aligned, not size. 2012-10-29 18:42:05 +00:00
libcpp AArch64 [7/10] 2012-10-23 17:24:58 +00:00
libdecnumber warnings.m4 (ACX_PROG_CC_WARNING_OPTS): Avoid leading dash in expr call. 2011-12-20 16:54:12 +00:00
libffi linux64_closure.S: Add new ABI support. 2012-10-31 14:15:34 +10:30
libgcc config.host (m32r-*-rtems*): Include crtinit.o and crtfinit.o as extra_parts. 2012-10-31 03:17:37 +01:00
libgfortran bessel.m4: Remove useless statement. 2012-10-28 17:54:44 +01:00
libgo runtime/goc2c: Drop gc support, change int to intgo. 2012-10-31 20:49:53 +00:00
libgomp * semantics.c (finish_omp_threadprivate): Call complete_type. 2012-10-25 11:53:40 -04:00
libiberty Allow dynamic initialization of thread_locals. 2012-10-08 10:45:37 -04:00
libitm Detect assembler support for RTM 2012-10-30 21:46:20 -07:00
libjava config.gcc: Match arm*-*-linux-* for ARM Linux/GNU. 2012-10-15 21:12:23 +00:00
libmudflap * configure: Regenerated. 2012-09-14 19:37:57 -04:00
libobjc rs6000-cpus.def (POWERPC_MASKS): Don't assume OPTION_MASK_STRICT_ALIGN is defined. 2012-10-19 19:10:03 +00:00
libquadmath complex.c (csqrtq): NaN and INF fixes. 2012-10-31 16:46:59 +01:00
libssp * configure: Regenerated. 2012-09-14 19:40:25 -04:00
libstdc++-v3 os_defines.h: Do not define anymore _GLIBCXX_HAVE_BROKEN_VSWPRINTF. 2012-10-31 11:36:45 +00:00
lto-plugin * configure: Regenerated. 2012-09-14 19:42:24 -04:00
maintainer-scripts crontab: Disable snapshots from gcc-4_5-branch. 2012-07-02 09:16:29 +00:00
zlib * configure: Regenerated. 2012-09-14 19:43:33 -04:00
ABOUT-NLS
ChangeLog Add myself to MAINTAINERS 2012-10-30 08:30:21 +00:00
ChangeLog.tree-ssa
compile
config-ml.in MAINTAINERS (crx port, [...]): Remove. 2011-03-22 19:58:18 +00:00
config.guess oops - omitted from previous delta. 2011-06-06 10:34:35 +00:00
config.rpath Remove freebsd1 from libtool.m4 macros and config.rpath. 2011-02-13 11:45:53 +00:00
config.sub Update config.sub to 2012-04-18 version from official repo. 2012-04-25 15:48:28 +00:00
configure re PR bootstrap/54820 (ada: cannot find -lstdc++ since 4.8.0 20121002) 2012-10-23 22:57:43 +00:00
configure.ac re PR bootstrap/54820 (ada: cannot find -lstdc++ since 4.8.0 20121002) 2012-10-23 22:57:43 +00:00
COPYING
COPYING.LIB
COPYING.RUNTIME
COPYING3
COPYING3.LIB
depcomp
install-sh
libtool-ldflags
libtool.m4 re PR bootstrap/38607 (AIX error messages about TOC during build) 2012-09-14 19:23:41 -04:00
ltgcc.m4
ltmain.sh backport: ltmain.sh (relink): Use absolute path when hardcoding with -L. 2011-01-13 18:51:10 +00:00
ltoptions.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
ltsugar.m4
ltversion.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
lt~obsolete.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
MAINTAINERS Add myself to MAINTAINERS 2012-10-30 08:30:21 +00:00
Makefile.def libgo: Use libbacktrace rather than debug/elf registration. 2012-09-28 14:48:30 +00:00
Makefile.in re PR bootstrap/54820 (ada: cannot find -lstdc++ since 4.8.0 20121002) 2012-10-22 07:27:21 +00:00
Makefile.tpl re PR bootstrap/54820 (ada: cannot find -lstdc++ since 4.8.0 20121002) 2012-10-22 07:27:21 +00:00
missing
mkdep
mkinstalldirs
move-if-change Import move-if-change script from gnulib. 2011-02-12 15:48:30 +00:00
README * README: Document use of ranges of years in copyright notices. 2012-07-16 15:01:34 +01:00
symlink-tree
ylwrap

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.