// -*- Mode: C++ -*- // // Copyright (C) 2013-2015 Red Hat, Inc. // // This file is part of the GNU Application Binary Interface Generic // Analysis and Instrumentation Library (libabigail). This library is // free software; you can redistribute it and/or modify it under the // terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 3, or (at your option) any // later version. // This library is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Lesser Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this program; see the file COPYING-LGPLV3. If // not, see . /// @file #ifndef __ABG_IRFWD_H__ #define __ABG_IRFWD_H__ #include #include #include #include #include #include #include #include // for std::rel_ops, at least. #include #include "abg-interned-str.h" #include "abg-hash.h" /// Toplevel namespace for libabigail. namespace abigail { /** @mainpage libabigail This is the API documentation of the Application Binary Interface Generic Analysis and Instrumentation Library, aka, libabigail. Check out the project homepage! The current libabigail source code can be browsed at http://sourceware.org/git/gitweb.cgi?p=libabigail.git It can be checked out with: git clone git://sourceware.org/git/libabigail.git The mailing list to send messages and patches to is libabigail@sourceware.org. You can hang out with libabigail developers and users on irc at irc://irc.oftc.net\#libabigail. */ // Inject some types. using std::tr1::shared_ptr; using std::tr1::weak_ptr; using std::string; using std::vector; // Pull in relational operators. using namespace std::rel_ops; namespace ir { // Forward declarations for corpus. class corpus; // Forward declarations for ir. class environment; class location; class location_manager; class corpus; class translation_unit; class class_decl; class class_tdecl; class type_or_decl_base; class decl_base; class enum_type_decl; class function_decl; class function_tdecl; class function_type; class global_scope; class node_visitor; class location; class location_manager; class method_type; class namespace_decl; class pointer_type_def; class qualified_type_def; class reference_type_def; class scope_decl; class scope_type_decl; class template_decl; class template_parameter; class non_type_tparameter; class type_tparameter; class template_tparameter; class type_composition; class type_base; class type_decl; class typedef_decl; class var_decl; class array_type_def; class subrange_type; struct type_shared_ptr_equal; struct traversable_base; shared_ptr add_decl_to_scope(shared_ptr, scope_decl*); shared_ptr add_decl_to_scope (shared_ptr, shared_ptr); const global_scope* get_global_scope(const decl_base&); const global_scope* get_global_scope(const decl_base*); const global_scope* get_global_scope(const shared_ptr); translation_unit* get_translation_unit(const decl_base&); translation_unit* get_translation_unit(const decl_base*); translation_unit* get_translation_unit(const shared_ptr); bool is_global_scope(const scope_decl&); const global_scope* is_global_scope(const scope_decl*); bool is_global_scope(const shared_ptr); bool is_at_global_scope(const decl_base&); bool is_at_global_scope(const shared_ptr); bool is_at_class_scope(const shared_ptr); bool is_at_class_scope(const decl_base*); bool is_at_class_scope(const decl_base&); bool is_at_template_scope(const shared_ptr); bool is_template_parameter(const shared_ptr); function_decl* is_function_decl(const decl_base*); shared_ptr is_function_decl(shared_ptr); bool is_function_decl(const decl_base&); decl_base* is_decl(const type_or_decl_base*); shared_ptr is_decl(const shared_ptr&); bool is_type(const type_or_decl_base&); type_base* is_type(const type_or_decl_base*); shared_ptr is_type(const shared_ptr& tod); bool is_type(const decl_base&); shared_ptr is_type(const shared_ptr); type_base* is_type(decl_base*); bool is_anonymous_type(type_base*); bool is_anonymous_type(const shared_ptr&); shared_ptr is_type_decl(const shared_ptr); shared_ptr is_typedef(const shared_ptr); shared_ptr is_typedef(const shared_ptr); const typedef_decl* is_typedef(const type_base*); typedef_decl* is_typedef(type_base*); shared_ptr is_enum_type(const shared_ptr&); shared_ptr is_enum_type(const shared_ptr&); class_decl* is_class_type(const decl_base*); class_decl* is_class_type(const type_base*); shared_ptr is_class_type(const shared_ptr); shared_ptr is_class_type(const shared_ptr); shared_ptr is_compatible_with_class_type(const shared_ptr); shared_ptr is_compatible_with_class_type(const shared_ptr); pointer_type_def* is_pointer_type(type_base*); const pointer_type_def* is_pointer_type(const type_base*); shared_ptr is_pointer_type(const shared_ptr); reference_type_def* is_reference_type(type_base*); const reference_type_def* is_reference_type(const type_base*); shared_ptr is_reference_type(const shared_ptr); qualified_type_def* is_qualified_type(const type_base*); shared_ptr is_qualified_type(const shared_ptr); shared_ptr is_function_type(const shared_ptr); function_type* is_function_type(type_base*); const function_type* is_function_type(const type_base*); shared_ptr is_method_type(const shared_ptr); const method_type* is_method_type(const type_base*); method_type* is_method_type(type_base*); shared_ptr look_through_decl_only_class(shared_ptr); var_decl* is_var_decl(const type_or_decl_base*); shared_ptr is_var_decl(const shared_ptr); shared_ptr is_namespace(const shared_ptr&); namespace_decl* is_namespace(const decl_base*); bool is_template_parm_composition_type(const shared_ptr); bool is_template_decl(const shared_ptr); bool is_function_template_pattern(const shared_ptr); shared_ptr add_decl_to_scope(shared_ptr, scope_decl*); shared_ptr add_decl_to_scope(shared_ptr, shared_ptr); shared_ptr insert_decl_into_scope(shared_ptr, vector >::iterator, scope_decl*); shared_ptr insert_decl_into_scope(shared_ptr, vector >::iterator, shared_ptr); bool has_scope(const decl_base&); bool has_scope(const shared_ptr); bool is_member_decl(const shared_ptr); bool is_member_decl(const decl_base*); bool is_member_decl(const decl_base&); scope_decl* is_scope_decl(decl_base*); bool is_member_type(const shared_ptr); void remove_decl_from_scope(shared_ptr); bool get_member_is_static(const decl_base&); bool get_member_is_static(const decl_base*); bool get_member_is_static(const shared_ptr&); void set_member_is_static(decl_base&, bool); void set_member_is_static(const shared_ptr&, bool); bool is_data_member(const var_decl&); bool is_data_member(const var_decl*); bool is_data_member(const shared_ptr); shared_ptr is_data_member(const shared_ptr&); array_type_def* is_array_type(const type_base* decl); shared_ptr is_array_type(const shared_ptr decl); void set_data_member_offset(shared_ptr, size_t); size_t get_data_member_offset(const var_decl&); size_t get_data_member_offset(const shared_ptr); size_t get_data_member_offset(const shared_ptr); void set_data_member_is_laid_out(shared_ptr, bool); bool get_data_member_is_laid_out(const var_decl&); bool get_data_member_is_laid_out(const shared_ptr); bool is_member_function(const function_decl&); bool is_member_function(const function_decl*); bool is_member_function(const shared_ptr&); bool get_member_function_is_ctor(const function_decl&); bool get_member_function_is_ctor(const shared_ptr&); void set_member_function_is_ctor(const function_decl&, bool); void set_member_function_is_ctor(const shared_ptr&, bool); bool get_member_function_is_dtor(const function_decl&); bool get_member_function_is_dtor(const shared_ptr&); void set_member_function_is_dtor(function_decl&, bool); void set_member_function_is_dtor(const shared_ptr&, bool); bool get_member_function_is_const(const function_decl&); bool get_member_function_is_const(const shared_ptr&); void set_member_function_is_const(function_decl&, bool); void set_member_function_is_const(const shared_ptr&, bool); size_t get_member_function_vtable_offset(const function_decl&); size_t get_member_function_vtable_offset(const shared_ptr&); void set_member_function_vtable_offset(const function_decl& f, size_t s); void set_member_function_vtable_offset(const shared_ptr &f, size_t s); bool get_member_function_is_virtual(const function_decl&); bool get_member_function_is_virtual(const shared_ptr&); bool get_member_function_is_virtual(const function_decl*); void set_member_function_is_virtual(function_decl&, bool); void set_member_function_is_virtual(const shared_ptr&, bool); shared_ptr strip_typedef(const shared_ptr); shared_ptr peel_typedef_type(const shared_ptr&); const type_base* peel_typedef_type(const type_base*); shared_ptr peel_pointer_type(const shared_ptr&); const type_base* peel_pointer_type(const type_base*); shared_ptr peel_reference_type(const shared_ptr&); const type_base* peel_reference_type(const type_base*); const shared_ptr peel_array_type(const shared_ptr&); const type_base* peel_array_type(const type_base*); const type_base* peel_qualified_type(const type_base*); const shared_ptr peel_qualified_type(const shared_ptr&); shared_ptr peel_typedef_pointer_or_reference_type(const shared_ptr); type_base* peel_typedef_pointer_or_reference_type(const type_base*); string get_name(const shared_ptr&, bool qualified = true); scope_decl* get_type_scope(type_base*); scope_decl* get_type_scope(const shared_ptr&); interned_string get_type_name(const shared_ptr, bool qualified = true, bool internal = false); interned_string get_type_name(const type_base*, bool qualified = true, bool internal = false); interned_string get_type_name(const type_base&, bool qualified = true, bool internal = false); interned_string get_function_type_name(const shared_ptr&, bool internal = false); interned_string get_function_type_name(const function_type*, bool internal = false); interned_string get_function_type_name(const function_type&, bool internal = false); interned_string get_method_type_name(const shared_ptr&, bool internal = false); interned_string get_method_type_name(const method_type*, bool internal = false); interned_string get_method_type_name(const method_type&, bool internal = false); string get_pretty_representation(const decl_base*, bool internal = false); string get_pretty_representation(const type_base*, bool internal = false); string get_pretty_representation(const type_or_decl_base*,bool internal = false); string get_pretty_representation(const shared_ptr&, bool internal = false); string get_pretty_representation(const shared_ptr&, bool internal = false); string get_pretty_representation(const shared_ptr&, bool internal = false); string get_pretty_representation(const function_type&, bool internal = false); string get_pretty_representation(const function_type*, bool internal = false); string get_pretty_representation(const shared_ptr&, bool internal = false); string get_pretty_representation(const method_type&, bool internal = false); string get_pretty_representation(const method_type*, bool internal = false); string get_pretty_representation(const shared_ptr&, bool internal = false); const decl_base* get_type_declaration(const type_base*); decl_base* get_type_declaration(type_base*); shared_ptr get_type_declaration(const shared_ptr); bool types_are_compatible(const shared_ptr, const shared_ptr); bool types_are_compatible(const shared_ptr, const shared_ptr); const scope_decl* get_top_most_scope_under(const decl_base*, const scope_decl*); const scope_decl* get_top_most_scope_under(const shared_ptr, const scope_decl*); const scope_decl* get_top_most_scope_under(const shared_ptr, const shared_ptr); void fqn_to_components(const std::string&, std::list&); string components_to_type_name(const std::list&); const shared_ptr lookup_type_in_corpus(const string&, const corpus&); const shared_ptr lookup_class_type_in_corpus(const string&, const corpus&); const shared_ptr lookup_function_type_in_corpus(const function_type&, const corpus&); const shared_ptr lookup_type_in_translation_unit(const string&, const translation_unit&); const shared_ptr lookup_type_in_translation_unit(const std::list&, const translation_unit&); const shared_ptr lookup_class_type_in_translation_unit(const std::list& fqn, const translation_unit& tu); const shared_ptr lookup_class_type_in_translation_unit(const string& fqn, const translation_unit& tu); const shared_ptr lookup_type_in_translation_unit(const shared_ptr, const translation_unit&); shared_ptr lookup_function_type_in_translation_unit(const function_type&, const translation_unit&); shared_ptr synthesize_type_from_translation_unit(const shared_ptr& type, translation_unit& tu); shared_ptr synthesize_function_type_from_translation_unit(const function_type&, translation_unit&); shared_ptr lookup_function_type_in_translation_unit(const shared_ptr&, const translation_unit&); shared_ptr lookup_function_type_in_corpus(const shared_ptr&, corpus&); shared_ptr lookup_type_in_corpus(const shared_ptr&, corpus&); const shared_ptr lookup_type_in_scope(const string&, const shared_ptr&); const shared_ptr lookup_type_in_scope(const std::list&, const shared_ptr&); const shared_ptr lookup_var_decl_in_scope(const string&, const shared_ptr&); const shared_ptr lookup_var_decl_in_scope(const std::list&, const shared_ptr&); string demangle_cplus_mangled_name(const string&); shared_ptr type_or_void(const shared_ptr, const environment*); shared_ptr canonicalize(shared_ptr); type_base* type_has_non_canonicalized_subtype(shared_ptr t); bool type_has_sub_type_changes(shared_ptr t_v1, shared_ptr t_v2); void keep_type_alive(shared_ptr t); size_t hash_type_or_decl(const type_or_decl_base *); size_t hash_type_or_decl(const shared_ptr&); } // end namespace ir using namespace abigail::ir; namespace suppr { class suppression_base; /// Convenience typedef for a shared pointer to a @ref suppression. typedef shared_ptr suppression_sptr; /// Convenience typedef for a vector of @ref suppression_sptr typedef vector suppressions_type; } // end namespace comparison void dump(const shared_ptr, std::ostream&); void dump(const shared_ptr); void dump(const shared_ptr, std::ostream&); void dump(const shared_ptr); void dump(const shared_ptr, std::ostream&); void dump(const shared_ptr); void dump(const translation_unit&, std::ostream&); void dump(const translation_unit&); void dump(const shared_ptr, std::ostream&); void dump(const shared_ptr); void dump_decl_location(const decl_base&); void dump_decl_location(const decl_base*); void dump_decl_location(const shared_ptr&); } // end namespace abigail #endif // __ABG_IRFWD_H__