Commit Graph

103 Commits

Author SHA1 Message Date
Dodji Seketeli
31b6660832 Misc style fixes
* include/abg-ir.h (location_manager::_Impl): Rename this type
	into priv.
	* src/abg-ir.cc b/src/abg-ir.cc (location_manager::_Impl):
	Likewise.
	(location_manager::location_manager): Update for the renaming
	above.
	* src/abg-reader.cc (build_type_decl): Remove useless white space.
	(build_enum_type_decl, build_class_decl): Use the _sptr typedef in
	the return type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-17 15:44:24 +01:00
Dodji Seketeli
1b0f6b489a Fix apidoc markup
* include/abg-comparison.h (class var_diff): @ref var_decls ->
	@ref var_decl.
	* src/abg-comparison.cc (function_decl_diff::first_function_decl):
	@Return -> @return.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-17 15:44:24 +01:00
Jonathan Wakely
22f6a640e7 Fix checkout & build instructions
* CONTRIBUTING: Fix Git repository url.
	* doc/website/mainpage.txt: Add elfutils into the dependencies
	list and fix the repository directory name.  Also use autoreconf
	-i.
	* include/abg-fwd.h: Fix Git repository URL.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-14 15:39:34 +01:00
Dodji Seketeli
1377f9fb48 Optimize comparison & underlying type accessing
* include/abg-ir.h (qualified_type::get_underlying_type)
	(pointer_type_def::get_pointed_to_type)
	(reference_type_def::get_pointed_to_type)
	(typedef_decl::get_underlying_type): Avoid triggering refcount
	counter increasing/decreasing here, by returning a reference to
	the underlying type.  This showed up high on a profile.
	({scope_decl, type_decl, scope_type_decl, namespace_decl,
	qualified_type_def, pointer_type_def, reference_type_def,
	enum_type_decl, typedef_decl, var_decl, class_decl}::operator==):
	Avoid taking the exception-using path of dynamic_cast.  This
	showed up very high on a profile.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-13 17:36:20 +01:00
Dodji Seketeli
c4991c6444 Escape xml pre-defined entities in native (de-)serialization.
* include/abg-libxml-utils.h (escape_xml_string)
	(unescape_xml_string): Declare new functions.
	* src/abg-libxml-utils.cc (escape_xml_string)
	(unescape_xml_string): Define them.
	* src/abg-reader.cc (build_function_decl, build_var_decl)
	(build_type_decl, build_enum_type_decl, build_class_decl)
	(build_type_tparameter, build_non_type_tparameter)
	(build_template_tparameter, handle_namespace_decl)
	(handle_typedef_decl): Use unescape_xml_string.
	* src/abg-writer.cc (write_type_decl, write_function_decl)
	(write_class_decl, write_type_tparameter)
	(write_non_type_tparameter, write_template_tparameter): Use
	escape_xml_string.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-13 17:36:19 +01:00
Dodji Seketeli
5f97fc781c Implement hash caching
* include/abg-ir.h (decl_base::hash_): New member.
	(decl_base::{g,s}et_hash): New accessors.
	(type_base_::cached_hash): Forward-declare new hasher.
	(struct type_ptr_equal): New equality predicate.
	(type_shared_ptr_equal::operator()): Do not forget to test pointer
	equality.
	(type_base::cached_hash): Declare new hasher.
	* src/abg-hash.cc ({decl_base, type_decl, scope_type_decl,
	qualified_type_def, pointer_type_def, reference_type_def,
	enum_type_decl, typedef_decl, var_decl, function_decl,
	function_decl::parameter, class_decl::data_member,
	class_decl::member_function, class_decl, }:#️⃣:operator()):
	Implement caching.
	(type_base::cached_hash::operator()(const type_base*)): Define.
	(type_base::cached_hash::operator() (const type_base_sptr):
	Define.
	* src/abg-ir.cc (type_ptr_map): Make this map use
	type_base::cached_hash instead of type_base::ptr_hash now.
	(decl_base::decl_base): Initialize the new
	decl_base::hash_. member.
	(decl_base::{s,g}et_hash): Define.
	(decl_base::operator==(const decl_base& other)): Take the hash in
	account to speed up inequality detection.
	* src/abg-writer.cc (type_ptr_map): Renamed type_shared_ptr_map
	into this.  Make it use type_base::cached_hash and type_ptr_equal
	instead of type_base::shared_ptr_hash and type_shared_ptr_equal.
	(get_id_for_type): Add overload for type_base*.  Re-write the
	previous overload in terms of this one.
	(write_context::m_type_id_map): Use type_ptr_map as the type for
	this.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-13 17:36:19 +01:00
Dodji Seketeli
e66393d057 Do not canonicalize types anymore; it's slow and luckily not needed
* src/abg-ir.h (translation_unit::canonicalize_type): Remove.
	* src/abg-dwarf-reader.cc (canonicalize_and_add_type_to_ir)
	(canonicalize_and_insert_type_into_ir)
	(canonicalize_and_insert_type_into_ir_under_scope): Remove.
	(build_enum_type, build_class_type, build_ir_node_from_die):
	Update for removal of type canonicalization.
	* src/abg-ir.cc (translation_unit::canonicalize_type): Remove.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-13 17:36:19 +01:00
Dodji Seketeli
f42a59c3dd Fix class scope setting & member type de-serializing from dwarf
* include/abg-fwd.h (add_decl_to_scope, insert_decl_into_scope):
	return the decl added to the scope.
	(as_non_member_type, get_type_declaration): Declare new entry
	points.
	* include/abg-ir.h (class decl_base::insert_decl_into_scope):
	Update this friend declaration.
	(class scope_decl, class_decl): Update the friend add_decl_to_scope
	declaration.
	(scope_decl::add_member_decl): Return the added decl.
	(class_decl_sptr): Move this typedef befoer the class_decl class
	declaration.
	(class_decl::definition_of_declaration_): New member.
	(class_decl::{set_definition_of_declaration,
	get_definition_of_declaration}): New accessors.
	(class_decl::add_member_decl): Return the added member.
	(class_decl::insert_member_type): New member.
	(class_decl::member_base::access_specifier): Make this protected.
	(class_decl::member_type): Make this inherit from type_vase.
	(class_decl::member_type::type_): Remove this member.
	(class_decl::member_type::as_type): Remove this accessor.
	(class_decl::member_type::operator==(const type_base&)): New.
	(class_decl::member_type::operator shared_ptr<type_base>() const):
	Remove.
	(class_decl::member_type::get_underlying_type): New.
	(class_decl::member_type::operator==(const member_type&) const):
	New.
	* src/abg-comparison.cc
	(class_diff::{ensure_lookup_tables_populated, report}): Adjust for
	the removal of class_decl::member_type::as_type.
	* src/abg-dwarf-reader.cc (scope_stack_type): Change this as a
	typedef to stack<scope_decl*>.
	(current_scope): Change return type from scope_decl_sptr to
	scope_decl*.
	(insert_decl_into_scope): New.
	(build_namespace_decl_and_add_to_ir): Use insert_decl_into_scope
	in lieu of add_decl_to_scope.
	(build_class_type_and_add_to_ir): likewise.  Link a class
	definition to its declaration.  Push the current scope on the
	scope stack.  Use as_non_member_type.  Fix setting member types.
	(get_scope_for_die): Look through declaration-only classe to get
	its definition.
	(build_qualified_type, build_pointer_type_def)
	(build_reference_type, build_typedef_type, build_var_decl)
	(build_function_decl): Use as_non_member_type.
	(build_ir_node_from_die): Fix member variable & function adding.
	* src/abg-ir.cc (scope_decl::{add_member_decl,
	insert_member_decl}): Return the added member.
	(add_decl_to_scope): Likewise.
	(insert_decl_into_scope): Likewise.
	(get_top_most_scope_under): Fix logic.
	(get_type_declaration): New overload that return a decl_base*.
	(as_non_member_type): New definition.
	(class_decl::{get_definition_of_declaration,
	set_definition_of_declaration, insert_member_decl}): Likewise.
	(class_decl::add_member_decl): Re-write in terms of
	class::insert_member_decl.
	(class_decl::insert_member_type): New definition.
	(class_decl::add_member_type): Re-write in terms of
	class_decl::insert_member_type.
	(class_decl::remove_member_type): Update for the
	class_decl::member_type::as_type removal.
	(class_decl::{add_data_member, add_member_function,
	add_member_function_template, add_member_class_template}): Call
	scope_decl::add_member_decl.
	(class_decl::member_type::member_type): Update as the type now
	virtually inherits from type_base.
	(class_decl::member_type::{set,get}_access_specifier): New
	definitions.
	(class_decl::member_type::get_underlying_type): Likewise.
	(class_decl::member_type::set_scope): Update wrt
	class_decl::member_type::as_type -> get_underlying_type rename.
	(class_decl::member_type::operator==(const decl_base& other)):
	There is no more class_decl::member_type::as_type.
	(class_decl::member_type::operator==(const type_base& other)):
	New.
	(class_decl::member_type::get_pretty_representation): Update wrt
	class_decl::member_type::as_type -> get_underlying_type rename.
	* src/abg-reader.cc (build_class_decl): New that add
	add_member_decl adds even member types, no need to add it
	explicitly anymore.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-13 17:36:19 +01:00
Dodji Seketeli
2c9fb3e70d Support new 'abi-corpus' native XML format (.abi)
* include/abg-reader.h (read_corpus_from_native_xml)
	(read_corpus_from_native_xml_file): Declare new entry points.
	* include/abg-writer.h (write_corpus_to_native_xml)
	(write_corpus_to_native_xml_file): Likewise.
	* src/abg-reader.cc (read_translation_unit_from_input): Renamed
	read_input into this.  Support new 'path' attribute for
	'abi-instr' XML element.
	(read_corpus_from_input): New static function.
	(read_translation_unit_from_file)
	(read_translation_unit_from_buffer)
	(read_translation_unit_from_istream): Update wrt read_input ->
	read_translation_unit_from_input.
	(read_corpus_from_native_xml, read_corpus_from_native_xml)
	(read_corpus_from_native_xml_file): Define new entry points.
	* src/abg-writer.cc (write_translation_unit): Write 'path'
	attribute into the 'abi-instr' xml element.
	(write_corpus_to_native_xml, write_corpus_to_native_xml_file):
	Define new entry points.
	* tools/abg-tools-utils.h (file_type::{FILE_TYPE_XML_CORPUS,
	FILE_TYPE_ZIP_CORPUS}): New enumerators.
	* tools/abg-tools-utils.cc (guess_file_type): Support detection of
	the new xml file format containing a document root 'abi-corpus'
	root element.
	* tools/bidiff.cc (main): Support diffing xml corpus-es and zip
	corpus-es.
	* tools/bidw.cc (main): Recognize elf files before reading them.
	* tools/bilint.cc (main): Support reading xml/zip corpus-es too.
	* tests/data/test-read-write/test[0-23].xml: Update 'path'
	attribute.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-07 14:12:26 +01:00
Dodji Seketeli
4ca76c4658 Misc style fixes
* include/abg-writer.h (write_translation_unit): Re-indent parms.
	* src/abg-writer.cc (write_translation_unit): Likewise.
	* test/test-read-write.cc (main): Fix white space.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-07 14:07:14 +01:00
Dodji Seketeli
0d66442b8b Add support for global variables in corpus diffing
* include/abg-comparison.h (string_var_ptr_map, changed_var_ptr)
	(string_changed_var_ptr_map): New convenience typedefs.
	* src/abg-comparison.cc
	(corpus_diff::priv::{deleted_vars_,added_vars_,changed_vars_}):
	New members.
	(corpus_diff::priv::{lookup_tables_empty, clear_lookup_tables}):
	Update wrt the new variables related lookup tables.
	(corpus_diff::ensure_lookup_tables_populated): Update to populate
	variables related lookup tables.
	(corpus_diff::report): Update to display added/removed/changed
	variables.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-06 16:01:55 +01:00
Dodji Seketeli
a41b741118 Misc style fixlets
* include/abg-comparison.h (changed_function_ptr): Fix comment.
	* src/abg-comparison.cc (corpus_diff::report): Likewise.
	* src/abg-corpus.cc (corpus::is_empty): Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-01-06 15:52:25 +01:00
Dodji Seketeli
fbb6b1bc73 Initial support for diffing ABI corpus files
* include/abg-comparison.h (string_function_ptr_map)
	(changed_function_ptr, string_changed_function_ptr_map)
	(corpus_diff_sptr): New convenience typedefs.
	(translation_unit_diff): Add comments.
	(class corpus_diff): New type.
	(compute_diff): New overload for corpus_diff.
	* include/abg-corpus.h (corpus::{functions, variables}): New
	typedefs.
	(corpus::{operator==, get_functions, get_variables}): New members.
	* include/abg-diff-utils.h (struct deep_ptr_eq_functor): New
	functor.
	* include/abg-ir.h (translation_unit::operator==): New member
	equality operator.
	* src/abg-comparison.cc (struct corpus_diff::priv): New private
	struct holding the private members of corpus_diff.
	(corpus_diff::priv::{lookup_tables_empty, clear_lookup_tables,
	ensure_lookup_tables_populated}): Define new private member functions.
	(corpus_diff::{corpus_diff, first_corpus, second_corpus,
	function_changes, variable_changes, length, report}): New public members.
	(struct noop_deleter): New struct.
	(compute_diff): New implementation for corpus_diff.
	* src/abg-corpus.cc (struct corpus::priv): Renamed corpus::impl
	into this.  Add new fns, vars and is_symbol_table_built data
	members.
	(corpus::priv::build_symbol_table): New member function.
	(class symtab_build_visitor_type): New visitor type to build the
	symbol table.
	(struct func_comp, struct var_comp): New comparison functors.
	(corpus::priv::build_symbol_table): Define new member function.
	(corpus::{corpus, add, get_translation_units, operator==,
	get_functions, get_variables}): Define new members.
	* src/abg-ir.cc (translation_unit::operator==): Define new member
	equality operator.
	(operator==(translation_unit_sptr l, translation_unit_sptr r)):
	Define new equality operator.
	* tools/abg-tools-utils.h (enum file_type): New enum.
	(guess_file_type): Declare new function.
	* tools/abg-tools-utils.cc (guess_file_type): define new function.
	* tools/bidiff.cc (main): Guess the type of the files given in
	input and support elf files reading and diffing.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-23 14:05:19 +01:00
Dodji Seketeli
dbc0225415 Generalize use of equality operator in core diff algorithms
* include/abg-diff-utils.h (struct default_eq_functor): New
	equality functor.
	(end_of_fr_d_path_in_k, end_of_frr_d_path_in_k_plus_delta): Add a
	new equality functor template parameter and document it.  Use it
	to compare the elements of the sequences given in argument.
	(compute_middle_snake, ses_len, compute_diff): Add a new equality
	functor template parameter and document it.  Adjust call to
	end_of_frr_d_path_in_k_plus_delta, end_of_fr_d_path_in_k and
	compute_middle_snake.
	(ses_len, compute_diff): Add a new overload that uses a
	default_eq_functor as comparison functor, to avoid breaking
	existing client code.
	* src/abg-diff-utils.cc (compute_middle_snake): Adjust the call to
	the compute_middle_snake.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-23 13:40:14 +01:00
Dodji Seketeli
165434a9d7 Change ir node visitor interface work on pointer to nodes
* include/abg-ir.h (ir_traversable_base): New type to be the base
	of IR nodes that are to be traversed.  Extends traversable_base.
	Its ir_traversable_base::traversable() method takes an
	ir_node_visitor&.
	(ir_node_visitor::visit): Change these virtual overloads to take
	pointers to IR nodes, rather than references.  This will be useful
	to e.g, store these IR nodes in containers on the side for some
	algorithms to work.  That is going to be useful later to,
	e.g. build symbol tables on the side, using the visitor interface.
	(class decl_base): Make this inherit ir_traversable_base.
	* src/abg-ir.cc (*::traverse): Adjust comments and the call the
	ir_node_visitor::visit call.  Use the ir_traversable_base type
	rather than traversable_base.
	(ir_traversable_base::traverse): Define.
	(ir_node_visitor::visit): Change these overloads to take pointers
	rather than reference to ir nodes.
	* tests/test-walker.cc (name_printing_visitor::visit): Adjust to
	take pointers rather than references.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-23 13:25:32 +01:00
Dodji Seketeli
6d4015ec75 Support reading member functions and member types from DWARF
* include/abg-ir.h (method_type_sptr): New convenience typedef.
	* src/abg-dwarf-reader.cc (read_context::{dwarf_version,
	die_wip_classes_map}): New accessors.
	(die_is_virtual): Rename is_virtual into this.
	(is_type_tag, is_type_die, die_virtual_function_index): Define new
	static functions.
	(die_member_offset): Fix comment.
	(get_scope_for_die): Take the read context as argument.
	(canonicalize_and_add_type_to_ir): Likewise.  On NULL scope, get
	the current translation unit from the read context.
	(canonicalize_and_insert_type_into_ir_under_scope): Handle NULL
	context.
	(build_function_decl): Support creating method_decls from here
	when necessary.
	(build_class_type_and_add_to_ir): Rename build_class_type into
	this.  Handle adding the class to the IR and to the relevant maps.
	During the creation of the class, arrange for
	build_ir_node_from_die on the current DIE to return a
	declaration-only class, representing the declaration for the class
	that is being constructed.  This breaks circular dependencies
	induced by decls/types that refer to the class being built, before
	the class is fully built and has a (logical) type ID.  Once the
	class is created, make it refer to the class declaration that was
	previously handed for the requests to the class DIE.  Now requests
	to the class DIE will just yield the newly built class.  Add
	support for member functions and member types.
	(build_corpus): Support reading the dwarf version and stick it
	into the context.
	(build_ir_node_from_die): Adjust for change in
	canonicalize_and_add_type_to_ir and build_class_type signature
	change.
	* src/abg-ir.cc (class_decl::method_decl::get_type): Support
	returning NULL type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-20 16:19:58 +01:00
Dodji Seketeli
f47b1ffd6d Make decl_base::set_scope virtual, to work on class_decl::member_type
* include/abg-ir.h (decl_base::set_scope): Make this virtual.
	(class_decl::member_type::set_scope): Declare an overload here.
	* src/abg-ir.cc (class_decl::member_type::set_scope): Define new
	overload.  Make this set the scope of the underlying type of the
	member type as well.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-20 16:14:21 +01:00
Dodji Seketeli
118a5df30d Support artificial parameters
* include/abg-ir.h (function_decl::parameter::{get,
	set}_artificial): Add new accessors for an "artificial" flag.
	* src/abg-reader.cc (build_function_parameter): Support reading
	the artificial parameter flag.
	* src/abg-writer.cc (write_function_decl): Support writing the
	artificial parameter flag.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-20 16:08:32 +01:00
Dodji Seketeli
5be46a9615 Build & use a DIE -> parent map to avoid emitting useless types
* include/abg-ir.h (translation_unit::{mark_type_as_used,
	prune_unused_types}): Remove these declarations.
	* src/abg-ir.cc (translation_unit::priv::used_types_): Remove.
	(class subtype_marking_visitor): Likewise.
	(translation_unit::{mark_type_as_used, prune_unused_types):
	Likewise.
	(get_top_most_scope_under): Fix logic and add comment.
	* src/abg-dwarf-reader.cc (die_tu_map_type, offset_offset_map):
	New convenience typedefs.
	(read_context::{die_tu_map_, die_parent_map_}): New context
	members.
	(read_context::{die_tu_map, die_parent_map}): New accessors.
	(build_ir_node_from_die): New overload that takes the scope of the
	ir node in parameter.
	(die_signed_constant_attribute): Un-comment this.
	(build_die_parent_relations_under, build_die_parent_map)
	(get_parent_die, get_scope_for_die): New static functions.
	(build_translation_unit_and_add_to_ir): Renamed
	build_translation_unit into this. Populate the new
	read_context::die_tu_map() here.
	(canonicalize_and_add_type_to_ir)
	(canonicalize_and_insert_type_into_ir)
	(canonicalize_and_insert_type_into_ir_under_scope): Move these
	overloads over the top of the file.
	(build_namespace_decl_and_add_to_ir): Fix this by adding the
	namespace to the IR scope of the DIE (using the new
	get_scope_for_die()).  Update the read_context::die_decl_map()
	map.
	(build_function_decl): Support functions that return void.  Also,
	skip parameters that don't have type set.
	(build_corpus): Walk all the DIEs to build a DIE -> parent map.
	Adjust for the rename to build_translation_unit_and_add_to_ir.
	(build_ir_node_from_die): Add a scope parm.  Adjust back to
	building IR nodes only for public decls, unless the
	'called_from_public_decl' flag is set.  Adjust to stick the resulting
	IR node into the scope given in parameter.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-14 22:15:16 +01:00
Dodji Seketeli
96597e61ab Add missing virtual keywords for traverse() method
* include/abg-ir.h ({translation_unit, decl_base, scope_decl,
	type_decl, namespace_decl, qualified_type_decl, pointer_type_def,
	reference_type_def, enum_type_decl, typedef_decl, var_decl,
	function_tdecl, class_decl, class_decl::data_member,
	class_decl::member_function, class_decl::member_function_template,
	class_decl::member_class_template}::traverse): Add a virtual
	keyword at least to "document" that this method is virtual -- and
	thus remind the user that it overrides the
	traversable_base::traverse().

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-14 11:00:47 +01:00
Dodji Seketeli
d666251b42 Add a is_type overload
* include/abg-fwd.h (is_type): Declare new overload that takes a
	type reference.
	* src/abg-ir.cc (is_type): Define.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-14 10:03:09 +01:00
Dodji Seketeli
02b1b2a786 Prune types that are not ref'ed by public decls
* include/abg-fwd.h (remove_decl_from_scope): Declare new
	function.
	* include/abg-ir.h (type_base_sptr, decl_base_sptr): Move these
	convenience typedef before the translation_unit declaration.
	(translation_unit::{mark_type_as_used, prune_unused_types}):
	Declare new methods.
	(decl_base::remove_member_decl): Likewise.
	(class_decl::{remove_member_decl, remove_member_type): Likewise.
	* src/abg-dwarf-reader.cc (die_decl_map_type): Change this map
	type so that the value is now a DIE offset, rather than a DIE.
	This is because many times the lifetime of DIEs is shorter than
	the one of the reader_context.  Also, the die offset uniquely
	designates a physical DIE even if several different instances of
	logical DIE might point to it.
	(struct die_hash): Remove this as it's useless now that we store
	DIE offsets in the map.
	(build_translation_unit): Call build_ir_node_from_die w/o setting
	the called_from_public_decl flag.  Prune the types that are not
	used by any public decls.
	(build_namespace_decl_and_add_to_ir): all build_ir_node_from_die
	w/o setting the called_from_public_decl flag.
	(build_ir_node_from_die): Change the only_public_decl flag into a
	called_from_public_decl flag.  Mark types used by public decls as
	such.  Adjust for the parm changes of build_qualified_type
	build_pointer_type_def, build_reference_type, and
	build_typedef_type.
	(build_qualified_type, build_pointer_type_def)
	(build_reference_type, build_typedef_type): Take a new
	called_from_public_decl.  Pass it to build_ir_node_from_die.
	(build_var_decl): Call build_ir_node_from_die with the
	called_from_public_decl flag set to true to flag the types
	referenced by this variable as being used.
	(build_function_decl): Take a called_from_public_decl flag as
	well, as this function can now call build_function_decl itself to
	build a function decl out of the value of the DW_AT_specification
	attribute, for DIEs representing function definitions.  Also, flag
	the types referenced by public functions are being used.
	* src/abg-ir.cc (translation_unit::priv::used_types_): New map for
	the used types.
	(translation_unit::{mark_type_as_used, prune_unused_types}):
	Define new methods.
	(scope_decl::remove_member_decl): Likewise.
	(remove_decl_from_scope): Define new function.
	(class_decl::{remove_member_decl, remove_member_type}): Define new
	methods.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-13 18:11:46 +01:00
Dodji Seketeli
643b02fd6a Support reading namespaces
* include/abg-fwd.h (get_global_scope): Return a const
	global_scope.  Add a new overload that takes a naked pointer as
	parm.
	(insert_decl_into_scope, get_top_most_scope_under): Declare new
	entry points.
	* include/abg-ir.h (class decl_base, class scope_decl): Add
	insert_decl_into_scope as a friend of these classes.
	(scope_decl::{insert_decl_into_scope, find_iterator_for_member}):
	Declare new member.
	(scope_decl::get_member_decls): New non-const overload.
	* src/abg-dwarf-reader.cc (build_translation_unit): Remove the
	"recurse" parameter.  Adjust the call to build_ir_node_from_die to
	read just public decls that are at namespace scope.  Anything else
	should be dropped unless it's needed to emitting the public
	namespace-level decls.
	(build_namespace_decl_and_add_to_ir)
	(canonicalize_and_insert_type_into_ir): Define new static
	functions.
	(build_corpus): Adjust ad build_translation_unit doesn't have the
	"recurse" parameter anymore.
	(canonicalize_and_add_type_to_ir): Make this static.  Fix
	comments.
	(build_ir_node_from_die): Take a new "only_public_decl"
	parameter. For DW_TAG_base_type case, use the new
	canonicalize_and_insert_type_into_ir to insert the type at the
	right place in the global scope making sure it is seen before the
	current scope.  For pointer, references and qualified types, use
	canonicalize_and_insert_type_into_ir to add the type at the same
	scope as its underlying type.  Handle DW_TAG_{namespace,module}
	using the new build_namespace_decl_and_add_to_ir function.  Add
	some vertical spaces and some assertions.
	* src/abg-ir.cc (scope_decl::add_member_decl): Use scope_decl_sptr
	typedef.
	(scope_decl::{insert_member_decl,find_iterator_for_member}):
	Define new methods.
	(insert_decl_into_scope, get_top_most_scope_under): Define new
	functions.
	(get_global_scope): Constify the return type.
	(get_translation_unit): Adjust as get_global_scope now returns a
	const.
	* src/abg-reader.cc (get_translation_unit): Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-12 15:40:52 +01:00
Dodji Seketeli
f918fdb0f9 Fix function_decl::parameter::operator==
* include/abg-ir.h (function_decl::parameter::operator==): Support
	empty type, e.g, in presence of a variadic parameter.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-12 15:36:17 +01:00
Dodji Seketeli
faa9ae485c Misc style fixes
* include/abg-ir.h (decl_base::set_visibility): Remove useless
	white space.
	(class scope_decl): Remove useless white space.
	(scope_decl::add_member_decl): Use decl_base_sptr convenience
	typedef.
	(global_scope_sptr, namespace_decl_sptr): New convenience typedef.
	(class global_scope): Remove useless white space.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-12 15:35:09 +01:00
Dodji Seketeli
a789ed3ae8 Support pointer types
* include/abg-fwd.h (get_translation_unit, get_global_scope):
	Declare new overloads that act on a naked pointer to decl_base.
	* src/abg-dwarf-reader.cc (build_pointer_type_def): Define new
	static function.
	(canonicalize_and_add_type_to_ir): Take a naked pointer to
	scope_decl rather than a smart pointer.
	(build_ir_node_from_die): For DW_TAG_base_type, adjust.  Support
	DW_TAG_pointer_type case.  For DW_TAG_{const,volatile}_type case,
	make sure the qualified type is in the same scope as its
	underlying type.
	* src/abg-ir.cc (get_global_scope, get_translation_unit): Define
	new overloads that acts on a naked decl_base.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-11 20:28:18 +01:00
Dodji Seketeli
7350cfd893 Make bilint read input from stdin
* include/abg-libxml-utils.h (new_reader_from_istream): Declare
	new public entry point.
	* src/abg-libxml-utils.cc (xml_istream_input_read)
	(xml_istream_input_close): New static functions.
	(new_reader_from_istream): Define new public input function.
	* include/abg-reader.h (read_translation_unit_from_istream):
	Declare new entry points.
	* src/abg-reader.cc (read_translation_unit_from_istream): Define
	new entry points.
	* tools/bilint.cc (options::{read_from_stdin, noout}): New
	members.
	(display_usage): Document --stdin and --noout.
	(parse_command_line): Adjust to consider that no option on the
	command line means reading from stdin, just like --stdin.  Support
	the --noout option as well.
	(main): Support Read the abi instr from stdin; in that case, what
	was read is just serialized back to stdout, unless --noout was
	supplied.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-11 15:20:42 +01:00
Dodji Seketeli
d3929eaf23 Support the "address-size" attribute for <abi-instr> elements
* include/abg-ir.h (translation_unit::translation_unit): Take an
	address_size parameter.
	(translation_unit::{get_address_size, set_address_size}): New
	accessors.
	* src/abg-ir.cc (translation_unit::priv::address_size_): New
	private member.
	(translation_unit::translation_unit): Take an address_size
	parameter.
	(translation_unit::{get_address_size, set_address_size}): Define
	these new methods.
	* src/abg-reader.cc (read_input): Read the "address-size"
	attribute from the abi-instr element.
	* src/abg-writer.cc (write_translation_unit): Write the
	"address-size" attribute.
	* tests/data/test-read-write/test23.xml: New test input.
	* tests/test-read-write.cc (in_out_specs): Add the new test above
	to the list of files to read and write back.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-11 12:30:19 +01:00
Dodji Seketeli
bd1af4cd52 Initial support of reading an ABI Corpus from DWARF
* configure.ac: Check the presence of libdw.so and
	elfutils/libdwfl.h headers from elfutils and define the necessary
	linking flags.
	* include/abg-dwarf-reader.h: New header file
	* include/Makefile.am: Add the new header file to the source
	distribution.
	* src/abg-dwarf-reader.cc:: New file.
	* src/Makefile.am: Add the new file to the source distribution.
	* include/abg-fwd.h (dump): Add declarations for several overloads
	to allow dumping to a given output stream.
	* include/abg-ir.h (class translation_unit): Use a pimpl idiom for
	this now.
	(translation_unit::canonicalize_type): Declare new method.
	* src/abg-ir.cc (struct translation_unit::priv): New private type
	for the pimpl idiom for translation_unit.
	(translation_unit::{translation_unit, get_global_scope, get_path,
	set_path, get_loc_mgr}): Adjust for pimpl idiom.
	(translation_unit::canonicalize_type): Define this new method and
	one overload.
	* src/abg-writer.cc (dump): Define several overloads to dump IR
	nodes to given output streams.
	* tools/bidw.cc: New file for the new bidw tool.
	* tools/Makefile.am: Define rules to build the new bidw tools.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-07 08:07:54 +01:00
Dodji Seketeli
6258b5f824 Prepare serialization API for multiple backends
* include/abg-reader.h: New file with abigail::xml_reader APIs.
	* include/abg-writer.h: New file with abigail::xml_writer APIs.
	* include/Makefile.am: Add the new files above to the source
	distribution.
	* src/abg-reader.cc: Update top-file comments.
	(namespace xml_reader): Rename namespace
	reader into this.
	(read_to_translation_unit, read_corpus_from_archive): New static
	functions.
	(read_translation_unit_from_file)
	(read_translation_unit_from_file, read_corpus_from_file): New
	entry points.
	(struct array_deleter): New functor.
	(translation_unit::read): Remove this.
	* src/abg-writer.cc: Update top file comments.
	(namespace xml_writer): Rename namespace
	writer into this.
	(struct archive_write_ctxt): New internal type.
	(create_archive_write_context, write_translation_unit_to_archive)
	(write_translation_unit, write_corpus_to_archive): New low level
	static functions overloads.
	(write_corpus_to_archive, write_translation_unit): Public higher
	level overloads.
	(translation_unit::write): Remove.
	(dump): Update for new xml_writer namespace.
	* include/abg-ir.h (translation_unit::{read, write}): Remove these
	serialization methods.
	* include/abg-corpus.h (corpus_sptr): New convenience typedef.
	(corpus::{read, write}): Remove these methods.
	* src/abg-corpus.cc (corpus::{read, write})
	(corpus::impl::{serialized_tus, archive}): Remove these members.
	(corpus::impl::{get_archive, close_archive, write_tu_to_archive,
	read_to_translation_unit}): Remove these methods.
	* tests/test-bidiff.cc (main): Update for usage of the new
	xml_reader API.
	* tests/test-read-write.cc (main): Likewise. Update for the usage
	of the new xml_writer API, too.
	* tests/test-walker.cc (main): Update for the usage of the new
	xml_reader API.
	* tests/test-write-read-archive.cc (main): Likewise.  And for the
	xml_writer API, too.
	* tools/biar.cc (add_tus_to_archive, extract_tus_from_archive): Likewise.
	* tools/bidiff.cc (main): Likewise, for xml_reader APIs.
	* tools/bilint.cc (main): Likewise, for xml_writer APIs, too.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-12-04 20:26:38 +01:00
Dodji Seketeli
0d9ade8ce8 Add diff support for var_decl
* include/abg-comparison.h (class var_diff): New declaration.
	(var_diff_sptr): New convenience typedef.
	(compute_diff): New overloads for var_diff, decl_base and
	type_base.
	* src/abg-comparison.cc (try_to_diff): Renamed try_to_diff_types
	into this.
	(compute_diff_for_types): Adjust for the try_to_diff_types
	renaming.  Fix comments.
	(compute_diff_for_decls): Re-use try_to_diff.  Update for
	var_decl.
	(compute_diff): Define overloads for decl_base, type_base and
	var_decl.
	(diff_length_of_decl_bases, diff_length_of_type_bases): New static
	help functions.
	(report_name_size_and_alignment_changes): Renamed
	report_size_and_alignment_changes into this.  Make it report name
	changes as well.
	(var_diff::priv): New struct.
	(var_diff::{var_diff, first_var, second_var, type_diff, length,
	report}): Define methods.
	({qualified_type_diff, enum_diff, class_diff, scope_diff,
	function_decl_diff}::report): Do not report
	anything if the diff is empty.
	(type_decl_diff::length): Fix this.
	(type_decl_diff::report): Adjust for renaming to
	report_name_size_and_alignment_changes.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-28 15:05:30 +01:00
Dodji Seketeli
0b0dd479d1 Add enum_type_decl::get_pretty_representation()
* include/abg-ir.h (enum_type_decl::get_pretty_representation):
	Declare new virtual method override.
	* src/abg-ir.cc (enum_type_decl::get_pretty_representation):
	Define it.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-28 14:58:11 +01:00
Dodji Seketeli
2e704277e7 Change return type of abigail::is_type()
* include/abg-fwd.h (is_type): Change the return type from bool to
	type_base_sptr.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-28 14:51:23 +01:00
Dodji Seketeli
d186189b43 Support diff for enum_type_decl
* include/abg-ir.h (enum_type_decl_sptr): New typedef.
	(enum_type_decl::enumerator::enumerator): Make default constructor
	public so that enumerators can be stored in vectors.  Maybe I
	should have made stored pointers to enumerators instead ...
	(enum_type_decl::enumerator::get_qualified_name): Define new
	method.
	* include/abg-comparison.h (string_enumerator_map)
	(changed_enumerator, string_changed_enumerator_map)
	(enum_diff_sptr): New convenience typedefs.
	(class enum_diff): Declare new class.
	(compute_diff): New overload for enum_type_decl.
	* src/abg-comparison.cc (enum diff_kind, report_mem_header): Move
	these at the beginning of the file.
	(struct enum_diff::priv): Define this.
	(enum_diff::{clear_lookup_tables, lookup_tables_empty,
	ensure_lookup_tables_populated, enum_diff, first_enum,
	second_enum, underlying_type_diff, deleted_enumerators,
	inserted_enumerators, changed_enumerators, length, report}):
	Define these new methods.
	(compute_diff): New overload for enum_diff.
	(compute_diff_for_types): Add support enum_type_decl here.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-27 11:47:19 +01:00
Dodji Seketeli
abfc86ca6a Change enum_type_decl::enumerators from a list to a vector
* include/abg-ir.h (enum_type_decl::enumerators): Change this from
	a list to a vector.
	* src/abg-hash.cc (enum_type_decl:#️⃣:operator()): Use the
	typedef enum_type_decl::enumerators rather than std::list<blah>.
	* src/abg-ir.cc (enum_type_decl::get_enumerators): Use
	the enum_type_decl::enumerators typedef.
	(enum_type_decl::operator==): Likewise.
	* src/abg-reader.cc (build_enum_type_decl): Likewise.
	* src/abg-writer.cc (write_enum_type_decl): Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-26 09:30:22 +01:00
Dodji Seketeli
5ac1090324 Support diff between qualified types
* include/abg-ir.h (qualified_type_def_sptr): Declare new typedef.
	(class qualified_type_def): Add comment at the end.
	(operator<<(std::ostream&, qualified_type_def::CV)): Declare new
	streaming operator.
	* src/abg-ir.cc (operator<<(std::ostream&,
	qualified_type_def::CV)): Define this new streaming operator.
	* include/abg-comparison.h (class qualified_type): Declare new
	class.
	(compute_diff): Declare new overload for qualified_type_def_sptr.
	* src/abg-comparison.cc (struct qualified_type_diff::priv): Define
	new type.
	(qualified_type_diff::{qualified_type_diff, first_qualified_type,
	second_qualified_type, underlying_type_diff, length}):
	Define new methods.
	(get_leaf_type): Define new static function.
	(compute_diff): Define overload for qualified_type_def_sptr.
	(compute_diff_for_types): Add support for
	diffing qualified_type_def here.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-25 23:25:13 +01:00
Dodji Seketeli
76a6b8b5bc Ensure diff types can only be created by compute_diff
* include/abg-comparison.h (diff::diff): Make constructor
	protected.
	(pointer_diff::pointer_diff): Likewise.
	(pointer_diff::{first_pointer, second_pointer}): Constify the
	return type.
	(compute_diff): Make this a friend of class pointer_diff.
	(reference_diff::reference_diff): Make this constructor protected.
	(compute_diff): Make this a friend of class reference_diff.
	(class_diff::class_diff): Make this constructor protected.
	(compute_diff): Make this a friend of class class_diff.
	(scope_diff::scope_diff): Make this constructor protected.
	(compute_diff): Make this a friend of class scope_diff.
	(function_decl_diff::function_decl_diff): Make this constructor
	protected.
	(type_decl_diff::type_decl_diff): Likewise.
	(typedef_diff::typedef_diff): Likewise.
	(translation_unit_diff::translation_unit_diff): Likewise.
	(compute_diff): Make this a friend of class translation_unit_diff.
	* src/abg-comparison.cc (pointer_diff::{first_pointer,
	second_pointer}): Constify return type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-25 23:25:05 +01:00
Dodji Seketeli
d0de718c14 Misc diff reporting nits
* include/abg-ir.h (type_decl::get_pretty_representation): New
	overload.
	* abg-ir.cc (type_decl::get_pretty_representation): Implement it.
	* src/abg-comparison.cc (represent, class_diff::report): Quote the
	pretty representation of abi artifacts in the report.
	(type_decl_diff::report): Better wording to express type_decl
	change.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-21 15:41:39 +01:00
Dodji Seketeli
663c455521 Support reporting changed data member in class
* include/abg-ir.h (operator<<(std::ostream&, decl_base::binding))
	(operator<<(std::ostream&, class_decl::access_specifier)): Declare
	new streaming operators.
	(class_decl::member_type::get_pretty_representation): New virtual
	overload.
	* src/abg-ir.cc (operator<<(std::ostream&, decl_base::binding)):
	(operator<<(std::ostream&, class_decl::access_specifier)): Define
	new streaming operators.
	(class_decl::member_type::get_pretty_representation): Define new method.
	* src/abg-comparison.cc (represent): Make the existing overloads
	end by a newline. Add a new overload that represents the changes
	that happened a given data member.
	(enum diff_kind): New.
	(report_mem_header): Renamed report_num_dels_or_ins into this.
	Make it support introducing changed members as well as
	deletions/insertions.
	(class_diff::report): Adjust for the report_num_dels_or_ins ->
	report_mem_header change.  Use the new represent() overload to
	report about changed data members.  Adjust logic now that
	represent() emits a newline at its end.  Also adjust logic as far
	as representing base classes and member types changes is
	concerned.
	(type_decl_diff::report): Remove useless white space.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-20 19:27:36 +01:00
Dodji Seketeli
c1274d3db1 Ensure that *::report adds just one empty line to its content
* include/abg-comparison.h (diff::report): Add a comment saying
	that each the diff::report interface must leave one empty line at
	the end of the report.
	* src/abg-comparison.cc ({pointer_diff, reference_diff,
	class_diff, scope_diff, function_decl_diff, type_decl_diff,
	typedef_diff}::report): Leave just one
	empty line after content.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-20 12:47:29 +01:00
Dodji Seketeli
e78cf50a39 Various doxygen doc additions and fixes
* include/abg-comparison.h: Lots of doc string additions & fixes,
	especially for typedefs.
	* include/abg-ir.h: Likewise.
	* src/abg-comparison.cc: Likewise.
	* src/abg-ir.cc: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-20 10:54:15 +01:00
Dodji Seketeli
1473506850 Better support changed base classes and member types
* include/abg-comparison.h (class_diff::{clear_lookup_tables,
	lookup_tables_empty, ensure_lookup_tables_populated}): Declare new
	methods.
	(compute_diff): Make this a friend of class_diff.
	* src/abg-comparison.cc (class_diff::priv::{deleted_bases_,
	inserted_bases_, changed_bases_, deleted_member_types_,
	inserted_member_types_, changed_member_types_,
	deleted_data_members_, inserted_data_members_,
	changed_data_members_, deleted_member_class_tmpls_,
	inserted_member_class_tmpls_, changed_member_class_tmpls_}):
	Define new members.
	(class_diff::priv::{base_has_changed, member_type_has_changed,
	data_member_has_changed}): Declare and define new methods.
	(class_diff::{clear_lookup_tables, lookup_tables_empty,
	ensure_lookup_tables_populated}): Define new methods.
	(class_diff::report): Detect and report when a base class or a
	member type has changed, as opposed to just saying that it has
	been removed and inserted.  Fix the rest of the function to avoid
	emitting useless vertical space and avoid saying that the class
	has "zero" insertion/deletion of a given kind of member.
	(scope_diff::report): avoid saying that the scope has "zero"
	insertion/deletion of a given kind of member.  Avoid useless
	vertical spaces.
	(type_decl_diff::report): Avoid useless vertical spaces.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-20 09:34:54 +01:00
Dodji Seketeli
1cdc283b1d Add diff support for typedef_decl and type_decl
* include/abg-ir.h (operator<<(std::ostream&,
	decl_base::visibility)): Declare new streaming operator.
	* src/abg-ir.cc (operator<<(std::ostream&,
	decl_base::visibility)): Define it.
	(type_decl::{operator==, get_pretty_representation}): Likewise,
	define these new overloads.
	(decl_base::{operator==, get_pretty_representation}): New overloads.
	* include/abg-comparison.h (type_decl_diff type_decl_diff_sptr,
	typedef_diff, typedef_diff_sptr): Declare new classes and
	typedefs.
	* src/abg-comparison.cc (type_decl_diff::{type_decl_diff,
	first_type_decl, second_type_decl, length, report}): New methods
	definitions.
	(compute_diff): New function definition that takes pointers of
	type_decl.
	(typedef_diff::{typedef_diff, first_typedef_decl,
	second_typedef_decl, underlying_type_diff, length, report}): New
	methods.
	(compute_diff): New function definition that takes pointers of
	typedef_decl.
	(try_to_diff_types): New template function, factorized out of ...
	(compute_diff_for_types): ... this.  Add support diffing type_decl
	and typedef_decl.
	(pointer_diff::report): Fix indentation of emitted report.
	* tools/bidiff.cc (parse_command_line): Fix style.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:28:00 +01:00
Dodji Seketeli
a03d9c0e64 Avoid missing member types while reading bi files
* include/abg-fwd.h (get_type_declaration): Declare function.
	* include/abg-ir.h (class decl_base): Add class_decl as a friend.
	This to be able to call decl_base::set_scope from class_decl.
	(scope_decl::add_member_decl): Make this virtual protected, so
	that it can be called (virtually) from e.g, class_decl.
	(type_decl_sptr, typedef_decl_sptr): New convenience typedefs.
	(class_decl::add_member_decl): New virtual overload for
	scope_decl::add_member_decl.
	(class_decl::{add_member_type, add_data_member,
	add_member_function}): New overloads.
	* src/abg-ir.cc (add_decl_to_scope): Benign style cleanup.
	(get_type_declaration): Define new function.
	(class_decl::add_member_decl): New method.
	(class_decl::add_member_type): Avoid silently added a new member
	type when that member type has already been (perhaps
	inadvertently) added to a scope already.  Rather, put a strict
	assert in place there.  Also add a new overload that constructs
	the member type out of a classic type and adds it to the class.
	(class_decl::{add_data_member, add_member_function}): Likewise.
	(class_decl::{add_member_function_template,
	add_member_class_template}): Avoid silently added a new member
	template when that template has already been (perhaps
	inadvertently) added to a scope already.  Rather, put a strict
	assert in place there.
	* src/abg-reader.cc (push_decl_to_current_scope): Take a an extra
	flag saying if the current decl should be added to the current
	scope as well (in addition to being pushed onto the stack of
	scopes maintained in the reader context).
	(push_and_key_type_decl): Likewise, take that extra flag and pass
	it to push_decl_to_current_scope.
	(build_function_decl, build_var_decl, build_type_decl)
	(build_qualified_type_decl, build_pointer_type_def)
	(build_reference_type_def, build_enum_type_decl, build_typedef_decl)
	(build_function_tdecl, build_class_tdecl): Likewise.
	(build_class_decl): Likewise.  When building member data, types,
	and functions, make sure /not/ to add the data, type of function to
	the current scope before adding it to the class_decl.  This was
	making the member not being added to the class because it already
	had a scope.
	(build_type_tparameter, build_type_composition)
	(build_non_type_tparameter, build_template_tparameter)
	(build_type): Adjust to add the template parm to the current scope
	explicitly, like previously.
	(handle_type_decl): Use build_type_decl function. Add the
	type_decl to the current scope, like previously.
	(handle_namespace_decl, handle_qualified_type_decl)
	(handle_pointer_type_def, handle_reference_type_def)
	(handle_enum_type_decl, handle_typedef_decl, handle_var_decl)
	(handle_function_decl, handle_class_decl, handle_function_tdecl)
	(handle_class_tdecl): Adjust to add the decl to the current scope,
	like previously.
	* tests/data/test-read-write/test21.xml: New test input with
	member type(def).

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:27:49 +01:00
Dodji Seketeli
e34a610c2e Avoid tabs and add const/virtual/offsets to class member diff reports
* include/abg-ir.h (class_decl::get_num_virtual_functions): New
	declaration.
	* src/abg-ir.cc (class_decl::get_num_virtual_functions): New
	definition.
	(function_decl::get_pretty_representation): Represent
	destructors and const member functions.
	* src/abg-writer.cc (write_cdtor_const_static): Take a new bool
	parm for constness and serialize it.
	(write_class_decl): Serialize member functions & function template
	const-ness.
	* src/abg-reader.cc (read_cdtor_const): Read the "const" xml
	attribute, rather than "is_const".

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:27:44 +01:00
Dodji Seketeli
2095a79319 Serialize vtable offset for virtual functions
* include/abg-ir.h
	(class_decl::member_function::get_vtable_offset): Renamed
	class_decl::member_function::get_vtable_offset_in_bits into this.
	The offset is an index into a table; it's not a value in bits.
	* src/abg-hash.cc (class_decl::member_function::hash): Update wrt
	function name change above.
	* src/abg-ir.cc (class_decl::member_function::operator==):
	Likewise.
	* src/abg-reader.cc (build_class_decl): Rename the attribute
	vtable-offset-in-bits into vtable-offset.
	* src/abg-writer.cc (write_voffset): New function.
	(write_class_decl): Use the new write_voffset.  Cleanup.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:27:32 +01:00
Dodji Seketeli
d506105c68 White space and style fixes
* include/abg-ir.h (class_decl::member_function::member_function):
	Align function parameters.
	* src/abg-ir.cc (type_decl::operator==): Remove useless white spaces

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:27:27 +01:00
Dodji Seketeli
581ddd9c6e Support reporting removed types/decls
* include/abg-comparison.h (scope_diff::{removed_types,
	removed_decls, added_types, added_decls}): New accessor methods
	declarations.
	* src/abg-comparison.cc (scope_diff::{removed_types,
	removed_decls, added_types, added_decls}): New accessor methods
	definitions.
	(scope_diff::report): Report removed & added types/decls.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:27:10 +01:00
Dodji Seketeli
8ac9973a1e Pretty representation for variables and types by default
* include/abg-ir.h (var_decl::get_pretty_representation): New
	method declaration.
	* src/abg-ir.cc (decl_base::get_pretty_representation): Prefix
	types with the "type " string.
	(var_decl::get_pretty_representation): New method definition.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:26:24 +01:00
Dodji Seketeli
9be945584a Re-write middle snakes management in core diff algorithms
* include/abg-diff-utils.h (point::set): New overload..
	(point::{add, operator<, operator>, operator<=, operator>=}): New
	methods.
	(point::operator!=): Constify.
	(point::operator==): Constify. Cleanup.
	(point::operator=): Keep emptiness.
	(class snake): New class definition
	(d_path_vec::{over_bounds, offset}): New methods.
	(d_path_vec::check_index_against_bound): Don't take a bound
	parameter anymore.  Use the new over_bound method above.  Fix up
	error reporting.
	(d_path_vec::d_path_vec): Fix d_path_vec size allocation.
	(d_path_vec::operator[]): Use the d_path_vec::at method to check
	all accesses against the bounds.  This is slower, but at least we
	can expect to have something that is more robust.  We can remove
	the bound checking later when we are sure the code has been tested
	enough.  Also use the new offset() method.
	(d_path_vec::at): Take long long.
	(ends_of_furthest_d_paths_overlap): Constify input parameters.
	(end_of_fr_d_path_in_k, end_of_frr_d_path_in_k_plus_delta): Take
	an instance of the new snake in parameter, rather than a bare end
	point that wasn't carrying enough information about the snake.
	Record the snake which consists of up to four points: a begin
	point, an intermediate point, a diagonal start point and an end
	point.  Return that snake upon successful completion.
	(compute_middle_snake): Take an instance of snake, rather than the
	two points that were supposed to represent a snake and with which
	we were loosing information before.  Revisit/simplify the logic of
	this function; this literally goes forward or in reverse, gets the
	resulting snake returned by the end_of_fr_d_path_in_k and
	end_of_frr_d_path_in_k_plus_delta functions, detect if these snakes
	overlap and just return the current snake.  Much simpler.  The
	caller now gets a snake, which has much more information than the
	previous snake approximation made of just two points.  Bonus
	point, this follows almost to the word, what the paper says.
	(maybe_record_match_point, find_snake_start_point): Remove these
	as there are not used by compute_middle_snake anymore.
	(print_snake, ses_len): Update these to take/handle a snake.
	(snake_end_points): New declaration.
	(compute_diff): When we are getting an empty first sequence, this
	means that we are inserting the second sequence *before* the
	beginning of the first sequence; keep this information by setting
	the insertion point index to -1, rather than zero.  Update this to
	get/handle snakes, rather than free points vaguely representing
	snakes.  Now that compute_middle_snake returns real snakes, handle
	the information we are getting.  Basically for edit scripts of
	length equal to 1, as the snake carries all the necessary
	information about the non-diagonal edge (as well as the diagonal
	edges), we (can) now precisely update the current edit script (as
	well as the longest common sub-sequence).  For edit scripts of
	length greater than 1, better at which points to divide the
	problem and consequently, at which points to conquer it back --
	better following The Paper to the letter.
	(display_edit_script): Update this for the use of instances of
	snake.
	* src/abg-diff-utils.cc (ends_of_furthest_d_paths_overlap): Update
	for constification of inputs.
	(snake_end_points): Define new function.
	(compute_middle_snake): Adapt for the taking an instance of snake.
	* tests/test-diff2.cc (main): Update for using instances of snake.
	* tests/test-core-diff.cc: Add new tests.
	* tests/data/test-core-diff/report0.txt: Update for output
	adaptation.
	* tests/data/test-core-diff/report6.txt: Likewise.
	* tests/data/test-core-diff/report7.txt: Likewise.
	* tests/data/test-core-diff/report8.txt: New test data.
	* tests/data/test-core-diff/report9.txt: Likewise.
	* tests/data/test-core-diff/report10.txt: Likewise.
	* tests/data/test-core-diff/report11.txt: Likewise.
	* tests/data/test-core-diff/report12.txt: Likewise.
	* tests/data/test-core-diff/report3.txt: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2013-11-19 11:25:47 +01:00