libabigail/include
Dodji Seketeli c940a229c9 Implement a poor-man's RTTI for performance
Profiling showed that a number of use of dynamic_cast are a speed
bottleneck.

This patch implements a poor-man's RTTI that allows us to implement a
form of dynamic_cast that is specific to the types of the internal
reprenstation that are in the namespace abigail::ir.  It speeds up
things greatly.

Basically, the base type of all ABI artifacts
(abigail::ir::type_or_decl_base) now contains three new data members.
The first one contains a bitmap that identifies the type of artifact.
The second one contains a pointer to the dynamic type sub-object of
the current instance of the artifact.  The last one contains either a
pointer to the type_base sub-object of the current instance of ABI
artifact if it's a type, or a pointer to the type_decl sub-object of
the current instance.

Together these three data members allow the patch to implement the
abigail::ir::{is_type(), is_decl(), is_<type_kind>_type} functions
that we need to make the code base noticeably faster when using abidw
on a big vmlinux binary.

	* include/abg-fwd.h (is_type_decl): Replace the overloads
	that takes a type_base* and/or a decl_base* by one that takes a
	type_or_decl_base*.
	* include/abg-ir.h (type_or_decl_base::type_or_decl_kind): Define
	new enum.
	(type_or_decl_base::{kind, runtime_type_instance,
	type_or_decl_base_pointer}): Declare new accessors.
	(operator{|,|=,&,&=): Declare new operators for the new
	type_or_decl_base::type_or_decl_kind enum.
	(global_scope::global_scope): Move the definition of this
	constructor to ...
	* src/abg-ir.cc (global_scope::global_scope): ... here.
	(type_or_decl_base::priv::{kind_, rtti_, type_or_decl_ptr_}):
	Add new data members.
	(type_or_decl_base::priv::priv): Take a
	type_or_decl_base::type_or_decl_kind enum.
	(type_or_decl_base::priv::kind): Define new accessors.
	(operator{|,|=,&,&=): Define new operators for the new
	type_or_decl_base::type_or_decl_kind enum.
	(type_or_decl_base::type_or_decl_base): Take a
	type_or_decl_base::type_or_decl_kind enum.
	(type_or_decl_base::{kind, runtime_type_instance,
	type_or_decl_base_pointer}): Define new accessors.
	(decl_base::decl_base, scope_decl::scope_decl)
	(type_base::type_base, scope_type_decl::scope_type_decl)
	(class_or_union::class_or_union) : Adjust to set the runtime type
	identifier of the instances of these types.
	(global_scope::global_scope, type_decl::type_decl)
	(qualified_type_def::qualified_type_def)
	(pointer_type_def::pointer_type_def)
	(reference_type_def::reference_type_def
	array_type_def::subrange_type::subrange_type)
	(array_type_def::array_type_def, enum_type_decl::enum_type_decl)
	(typedef_decl::typedef_decl, var_decl::var_decl)
	(function_type::function_type, method_type::method_type)
	(function_decl::function_decl)
	(function_decl::parameter::parameter, method_decl::method_decl)
	(class_decl::class_decl, class_decl::base_spec::base_spec)
	(union_decl::union_decl, template_decl::template_decl)
	(type_tparameter::type_tparameter)
	(non_type_tparameter::non_type_tparameter)
	(template_tparameter::template_tparameter)
	(type_composition::type_composition)
	(function_tdecl::function_tdecl, function_tdecl::function_tdecl)
	(class_tdecl::class_tdecl):
	Likewise and call runtime_type_instance() here to set the runtime
	type instance pointers of the current instance.
	(is_decl, is_type, is_class_type, is_pointer_type): Adjust to use
	the new poor-man's rtti machinery.
	(is_type_decl): Replace the overloads that takes a type_base*
	and/or a decl_base* by one that takes a type_or_decl_base*.
	(pointer_type_def::operator==, class_decl::operator==): Use the
	poor-man's rtti machinery to replace dynamic_cast.
	hash_type_or_decl: Replace dynamic_cast<const type_base> by
	is_type() and dynamic_cast<const decl_base*> by is_decl().

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2019-07-08 16:52:59 +02:00
..
abg-comp-filter.h Bug 24731 - Wrongly reporting union members order change 2019-06-26 11:09:43 +02:00
abg-comparison.h Bug 24731 - Wrongly reporting union members order change 2019-06-26 11:09:43 +02:00
abg-config.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-corpus.h Bug 24552 - abidiff fails comparing a corpus against a corpus group 2019-05-16 18:10:08 +02:00
abg-diff-utils.h diff-utils: point: fix postfix decrement/increment operator 2019-04-16 16:11:01 +02:00
abg-dwarf-reader.h Avoid over-suppressing fns & vars when analysing the Kernel 2019-02-19 17:42:56 +01:00
abg-fwd.h Implement a poor-man's RTTI for performance 2019-07-08 16:52:59 +02:00
abg-hash.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-ini.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-interned-str.h Take anonymous scopes into account when comparing decls 2019-06-13 17:54:45 +02:00
abg-ir.h Implement a poor-man's RTTI for performance 2019-07-08 16:52:59 +02:00
abg-libxml-utils.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-libzip-utils.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-reader.h Separate public types of first binary from those of the second 2019-01-16 12:27:45 +01:00
abg-reporter.h abg-reporter.h: add missing includes / using declarations 2019-06-17 15:25:18 +02:00
abg-sptr-utils.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-suppression.h Bug 24139 - Support suppressing some enumerator changes 2019-01-31 09:20:06 +01:00
abg-tools-utils.h Fully account for anonymous-ness of scopes when comparing decl names 2019-06-21 11:42:44 +02:00
abg-traverse.h add missing virtual destructors 2019-04-16 16:11:01 +02:00
abg-version.h.in Add --version option to several libabigail tools 2015-11-16 12:54:10 +01:00
abg-viz-common.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-viz-dot.h viz-dot: remove unused members from dot 2019-04-16 16:11:01 +02:00
abg-viz-svg.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-workers.h Update copyright for 2019 2019-01-07 14:54:47 +01:00
abg-writer.h abg-writer: drop deprecated API 2019-05-22 14:33:45 +02:00
Makefile.am Allow several kinds of reports to be emitted 2017-10-06 12:33:50 +02:00