libabigail
abg-ir.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2// -*- Mode: C++ -*-
3//
4// Copyright (C) 2013-2023 Red Hat, Inc.
5//
6// Author: Dodji Seketeli
7
8/// @file
9///
10/// Types of the main internal representation of libabigail.
11///
12/// This internal representation abstracts the artifacts that make up
13/// an application binary interface.
14
15#ifndef __ABG_IR_H__
16#define __ABG_IR_H__
17
18#include <assert.h>
19#include <stdint.h>
20#include <cstdlib>
21#include <functional>
22#include <set>
23#include <unordered_map>
24#include "abg-cxx-compat.h"
25#include "abg-fwd.h"
26#include "abg-hash.h"
27#include "abg-traverse.h"
28#include "abg-config.h"
29
30/// @file
31///
32/// This file contains the declarations of the Internal Representation
33/// of libabigail.
34
35/// @defgroup Memory Memory management
36/// @{
37///
38/// How objects' lifetime is handled in libabigail.
39///
40/// For memory management and garbage collection of libabigail's IR
41/// artifacts, we use std::shared_ptr and std::weak_ptr.
42///
43/// When manipulating these IR artifacts, there are a few rules to keep in
44/// mind.
45///
46/// <b>The declaration for a type is owned by only one scope </b>
47///
48/// This means that for each instance of abigail::type_base (a type) there
49/// is an instance of abigail::scope_decl that owns a @ref
50/// abigail::decl_base_sptr (a shared pointer to an abigail::decl_base)
51/// that points to the declaration of that type. The
52/// abigail::type_base_sptr is added to the scope using the function
53/// abigail::add_decl_to_scope().
54///
55/// There is a kind of type that is usually not syntactically owned by
56/// a scope: it's function type. In libabigail, function types are
57/// represented by abigail::function_type and abigail::method_type.
58/// These types must be owned by the translation unit they originate
59/// from. Adding them to the translation unit must be done by a call
60/// to the method function
61/// abigail::translation::bind_function_type_life_time().
62///
63/// <b> A declaration that has a type does NOT own the type </b>
64///
65/// This means that, for instance, in an abigail::var_decl (a variable
66/// declaration), the type of the declaration is not owned by the
67/// declaration. In other (concrete) words, the variable declaration
68/// doesn't have a shared pointer to the type. Rather, it has a *weak*
69/// pointer to its type. That means that it has a data member of type
70/// abigail::type_base_wptr that contains the type of the declaration.
71///
72/// But then abigail::var_decl::get_type() returns a shared pointer that
73/// is constructed from the internal weak pointer to the type. That way,
74/// users of the type of the var can own a temporary reference on it and
75/// be assured that the type's life time is long enough for their need.
76///
77/// Likewise, data members, function and template parameters similarly
78/// have weak pointers on their type.
79///
80/// If, for a reason, you really need to keep a type alive for the
81/// entire lifetime of the type system, then you can bind the life
82/// time of that type to the life time of the @ref environment that is
83/// supposed to outlive the type system. You do that by passing the
84/// type to the function environment::keep_type_alive().
85///
86/// @}
87
88namespace abigail
89{
90
91/// The namespace of the internal representation of ABI artifacts like
92/// types and decls.
93namespace ir
94{
95
96// Inject some std types in here.
97using std::unordered_map;
98
99/// A convenience typedef for an unordered set of pointer values
100typedef unordered_set<uintptr_t> pointer_set;
101
102/// Functor to hash a canonical type by using its pointer value.
104{
105 size_t operator()(const type_base_sptr& l) const;
106 size_t operator()(const type_base *l) const;
107}; //end struct canonical_type_hash
108
109/// Helper typedef for an unordered set of type_base_sptr which uses
110/// pointer value to tell its members appart, because the members are
111/// canonical types.
112typedef unordered_set<type_base_sptr,
114
115/// Helper typedef for a vector of pointer to type_base.
116typedef vector<type_base*> type_base_ptrs_type;
117
118/// Helper typedef for a vector of shared pointer to a type_base.
119typedef vector<type_base_sptr> type_base_sptrs_type;
120
121void
123 vector<type_base_sptr>& result);
124
125/// This is an abstraction of the set of resources necessary to manage
126/// several aspects of the internal representations of the Abigail
127/// library.
128///
129/// An environment can be seen as the boundaries in which all related
130/// Abigail artifacts live. So before doing anything using this
131/// library, the first thing to create is, well, you know it now, an
132/// environment.
133///
134/// Note that the lifetime of environment objects must be longer than
135/// the lifetime of any other type in the Abigail system. So a given
136/// instance of @ref environment must stay around as long as you are
137/// using libabigail. It's only when you are done using the library
138/// that you can de-allocate the environment instance.
140{
141public:
142 struct priv;
143 std::unique_ptr<priv> priv_;
144
145 /// A convenience typedef for a map of canonical types. The key is
146 /// the pretty representation string of a particular type and the
147 /// value is the vector of canonical types that have the same pretty
148 /// representation string.
149 typedef std::unordered_map<string, std::vector<type_base_sptr> >
151
152 environment();
153
154 virtual ~environment();
155
158
161
162 const type_base_sptr&
163 get_void_type() const;
164
165 const type_base_sptr&
166 get_void_pointer_type() const;
167
168 const type_base_sptr&
170
171 static string&
173
174 bool
176
177 void
179
180 bool
182
183 void
185
186 bool
188
189 void
191
192 bool
193 is_void_type(const type_base_sptr&) const;
194
195 bool
196 is_void_type(const type_base*) const;
197
198 bool
199 is_void_pointer_type(const type_base_sptr&) const;
200
201 bool
202 is_void_pointer_type(const type_base*) const;
203
204 bool
206
207 bool
208 is_variadic_parameter_type(const type_base_sptr&) const;
209
211 intern(const string&) const;
212
213 const config&
214 get_config() const;
215
216 bool
218
219 void
221
222 bool
224
225#ifdef WITH_DEBUG_SELF_COMPARISON
226 void
227 set_self_comparison_debug_input(const corpus_sptr& corpus);
228
229 void
230 get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
231 corpus_sptr& second_corpus);
232
233 void
234 self_comparison_debug_is_on(bool);
235
236 bool
237 self_comparison_debug_is_on() const;
238#endif
239
240#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
241 void
242 debug_type_canonicalization_is_on(bool flag);
243
244 bool
245 debug_type_canonicalization_is_on() const;
246
247 void
248 debug_die_canonicalization_is_on(bool flag);
249
250 bool
251 debug_die_canonicalization_is_on() const;
252#endif
253
254 vector<type_base_sptr>* get_canonical_types(const char* name);
255
256 type_base* get_canonical_type(const char* name, unsigned index);
257
258#ifdef WITH_DEBUG_SELF_COMPARISON
259 const unordered_map<string, uintptr_t>&
260 get_type_id_canonical_type_map() const;
261
262 unordered_map<string, uintptr_t>&
263 get_type_id_canonical_type_map();
264
265 const unordered_map<uintptr_t, string>&
266 get_pointer_type_id_map() const;
267
268 unordered_map<uintptr_t, string>&
269 get_pointer_type_id_map();
270
271 string
272 get_type_id_from_pointer(uintptr_t ptr) const;
273
274 string
275 get_type_id_from_type(const type_base *ptr) const;
276
277 uintptr_t
278 get_canonical_type_from_type_id(const char*) const;
279#endif
280
281 friend class class_or_union;
282 friend class class_decl;
283 friend class function_type;
284
285 friend void keep_type_alive(type_base_sptr);
286}; // end class environment
287
288class location_manager;
289/// @brief The source location of a token.
290///
291/// This represents the location of a token coming from a given
292/// translation unit. This location is actually an abstraction of
293/// cursor in the table of all the locations of all the tokens of the
294/// translation unit. That table is managed by the @ref location_manager
295/// type. To get the file path, line and column numbers associated to
296/// a given instance of @ref location, you need to use the
297/// location_manager::expand_location method.
299{
300 unsigned value_;
301 // The location manager to use to decode the value above. There is
302 // one location manager per translation unit, and the location
303 // manager's life time is managed by its translation unit.
304 location_manager* loc_manager_;
305 // Whether the location is artificial. Being artificial means that
306 // the location wasn't generated by the original emitter of the
307 // metadata (i.e, the compiler if the metadata is debug info). For
308 // instance, implicit location derived from the position of XML
309 // elements in the abixml file is represented as artificial
310 // locations.
311 bool is_artificial_;
312
313 location(unsigned v, location_manager* m)
314 : value_(v), loc_manager_(m), is_artificial_(false)
315 {}
316
317 /// Get the location manager to use to decode the value of this
318 /// location.
319 ///
320 /// @return the location manager for the current location value.
322 get_location_manager() const
323 {return loc_manager_;}
324
325public:
326
327 /// Test if the location is artificial.
328 ///
329 /// Being artificial means that the location wasn't generated by the
330 /// original emitter of the metadata (i.e, the compiler if the
331 /// metadata is debug info). For instance, the implicit location
332 /// derived from the position of a given XML element in the abixml
333 /// file is represented as artificial locations. The same XML
334 /// element might carry a non-artificial (natural?) location that was
335 /// originally emitted by the compiler that generated the original
336 /// debug info the abixml file is derived from.
337 ///
338 /// @return true iff the location is artificial.
339 bool
341 {return is_artificial_;}
342
343 /// Set the artificial-ness of the location.
344 ///
345 /// Being artificial means that the location wasn't generated by the
346 /// original emitter of the metadata (i.e, the compiler if the
347 /// metadata is debug info). For instance, the implicit location
348 /// derived from the position of a given XML element in the abixml
349 /// file is represented as artificial locations. The same XML
350 /// element might carry a non-artificial (natural?) location that
351 /// was originally emitted by the compiler that generated the
352 /// original debug info the abixml file is derived from.
353 ///
354 /// @param f the new artificial-ness state.
355 void
357 {is_artificial_ = f;}
358
359 /// Copy constructor of the location.
360 ///
361 /// @param l the location to copy from.
363 : value_(l.value_),
364 loc_manager_(l.loc_manager_),
365 is_artificial_(l.is_artificial_)
366 {}
367
368 /// Assignment operator of the location.
369 ///
370 /// @param l the location to assign to the current one.
371 location&
373 {
374 value_ = l.value_;
375 loc_manager_ = l.loc_manager_;
376 is_artificial_ = l.is_artificial_;
377 return *this;
378 }
379
380 /// Default constructor for the @ref location type.
382 : value_(), loc_manager_(), is_artificial_()
383 {}
384
385 /// Get the value of the location.
386 unsigned
387 get_value() const
388 {return value_;}
389
390 /// Convert the location into a boolean.
391 ///
392 /// @return true iff the value of the location is different from
393 /// zero.
394 operator bool() const
395 {return !!value_;}
396
397 /// Equality operator of the @ref location type.
398 ///
399 /// @param other the other location to compare against.
400 ///
401 /// @return true iff both locations are equal.
402 bool
403 operator==(const location &other) const
404 {return value_ == other.value_;}
405
406 /// "Less than" operator of the @ref location type.
407 ///
408 /// @parm other the other location type to compare against.
409 ///
410 /// @return true iff the current instance is less than the @p other
411 /// one.
412 bool
413 operator<(const location &other) const
414 {return value_ < other.value_;}
415
416 /// Expand the current location into a tripplet file path, line and
417 /// column number.
418 ///
419 /// @param path the output parameter this function sets the expanded
420 /// path to.
421 ///
422 /// @param line the output parameter this function sets the expanded
423 /// line number to.
424 ///
425 /// @param column the output parameter this function sets the
426 /// expanded column number to.
427 void
428 expand(std::string& path, unsigned& line, unsigned& column) const;
429
430 string
431 expand(void) const;
432
433 friend class location_manager;
434}; // end class location
435
436/// @brief The entry point to manage locations.
437///
438/// This type keeps a table of all the locations for tokens of a
439/// given translation unit.
441{
442 struct priv;
443 std::unique_ptr<priv> priv_;
444
445public:
446
448
450
452 create_new_location(const std::string& fle, size_t lne, size_t col);
453
454 void
455 expand_location(const location& location, std::string& path,
456 unsigned& line, unsigned& column) const;
457};
458
459/// The base of an entity of the intermediate representation that is
460/// to be traversed.
462{
463 /// Traverse a given IR node and its children, calling an visitor on
464 /// each node.
465 ///
466 /// @param v the visitor to call on each traversed node.
467 ///
468 /// @return true if the all the IR node tree was traversed.
469 virtual bool
471}; // end class ir_traversable_base
472
473/// The hashing functor for using instances of @ref type_or_decl_base
474/// as values in a hash map or set.
476{
477
478 /// Function-call Operator to hash the string representation of an
479 /// ABI artifact.
480 ///
481 /// @param artifact the ABI artifact to hash.
482 ///
483 /// @return the hash value of the string representation of @p
484 /// artifact.
485 size_t
486 operator()(const type_or_decl_base *artifact) const
487 {
488 string repr = get_pretty_representation(artifact);
489 std::hash<string> do_hash;
490 return do_hash(repr);
491 }
492
493 /// Function-call Operator to hash the string representation of an
494 /// ABI artifact.
495 ///
496 /// @param artifact the ABI artifact to hash.
497 ///
498 /// @return the hash value of the string representation of @p
499 /// artifact.
500 size_t
501 operator()(const type_or_decl_base_sptr& artifact) const
502 {return operator()(artifact.get());}
503}; // end struct type_or_decl_hash
504
505/// The comparison functor for using instances of @ref
506/// type_or_decl_base as values in a hash map or set.
508{
509
510 /// The function-call operator to compare the string representations
511 /// of two ABI artifacts.
512 ///
513 /// @param l the left hand side ABI artifact operand of the
514 /// comparison.
515 ///
516 /// @param r the right hand side ABI artifact operand of the
517 /// comparison.
518 ///
519 /// @return true iff the string representation of @p l equals the one
520 /// of @p r.
521 bool
523 {
524 string repr1 = get_pretty_representation(l);
525 string repr2 = get_pretty_representation(r);
526
527 return repr1 == repr2;
528 }
529
530 /// The function-call operator to compare the string representations
531 /// of two ABI artifacts.
532 ///
533 /// @param l the left hand side ABI artifact operand of the
534 /// comparison.
535 ///
536 /// @param r the right hand side ABI artifact operand of the
537 /// comparison.
538 ///
539 /// @return true iff the string representation of @p l equals the one
540 /// of @p r.
541 bool
543 const type_or_decl_base_sptr &r) const
544 {return operator()(l.get(), r.get());}
545}; // end type_or_decl_equal
546
547/// A convenience typedef for a hash set of type_or_decl_base_sptr
548typedef unordered_set<type_or_decl_base_sptr,
551
552/// A convenience typedef for a hash set of const type_or_decl_base*
553typedef unordered_set<const type_or_decl_base*,
556
557/// A convenience typedef for a map which key is a string and which
558/// value is a @ref type_base_wptr.
559typedef unordered_map<string, type_base_wptr> string_type_base_wptr_map_type;
560
561/// A convenience typedef for a map which key is a string and which
562/// value is a @ref type_base_sptr.
563typedef unordered_map<string, type_base_sptr> string_type_base_sptr_map_type;
564
565/// A convenience typedef for a map which key is an @ref
566/// interned_string and which value is a @ref type_base_wptr.
567typedef unordered_map<interned_string, type_base_wptr, hash_interned_string>
569
570/// A convenience typedef for a map which key is an @ref
571/// interned_string and which value is a @ref type_base_wptr.
572typedef unordered_map<interned_string,
576
577typedef unordered_map<interned_string,
578 const function_decl*,
579 hash_interned_string> istring_function_decl_ptr_map_type;
580
581typedef unordered_map<interned_string,
582 const var_decl*,
583 hash_interned_string> istring_var_decl_ptr_map_type;
584
585/// This is a type that aggregates maps of all the kinds of types that
586/// are supported by libabigail.
587///
588/// For instance, the type_maps contains a map of string to basic
589/// type, a map of string to class type, a map of string to union
590/// types, etc. The key of a map entry is the pretty representation
591/// of the type, and the value of the map entry is the type.
593{
594 struct priv;
595 std::unique_ptr<priv> priv_;
596
597public:
598
599 type_maps();
600
601 ~type_maps();
602
603 bool
604 empty() const;
605
607 basic_types() const;
608
610 basic_types();
611
613 class_types() const;
614
616 class_types();
617
619 union_types();
620
622 union_types() const;
623
625 enum_types();
626
628 enum_types() const;
629
632
634 typedef_types() const;
635
638
640 qualified_types() const;
641
644
646 pointer_types() const;
647
650
652 ptr_to_mbr_types() const;
653
656
658 reference_types() const;
659
661 array_types();
662
664 array_types() const;
665
667 subrange_types() const;
668
671
674
676 function_types() const;
677
678 const vector<type_base_wptr>&
680}; // end class type_maps;
681
682/// This is the abstraction of the set of relevant artefacts (types,
683/// variable declarations, functions, templates, etc) bundled together
684/// into a translation unit.
686{
687 struct priv;
688 std::unique_ptr<priv> priv_;
689
690 // Forbidden
691 translation_unit() = delete;
692
693public:
694 /// Convenience typedef for a shared pointer on a @ref global_scope.
695 typedef shared_ptr<scope_decl> global_scope_sptr;
696
697 /// The language of the translation unit.
699 {
700 LANG_UNKNOWN = 0,
701 LANG_Cobol74,
702 LANG_Cobol85,
703 LANG_C89,
704 LANG_C99,
705 LANG_C11,
706 LANG_C,
707 LANG_C_plus_plus_03,
708 LANG_C_plus_plus_11,
709 LANG_C_plus_plus_14,
710 LANG_C_plus_plus,
711 LANG_ObjC,
712 LANG_ObjC_plus_plus,
713 LANG_Fortran77,
714 LANG_Fortran90,
715 LANG_Fortran95,
716 LANG_Ada83,
717 LANG_Ada95,
718 LANG_Pascal83,
719 LANG_Modula2,
720 LANG_Java,
721 LANG_PLI,
722 LANG_UPC,
723 LANG_D,
724 LANG_Python,
725 LANG_Go,
726 LANG_Rust,
727 LANG_Mips_Assembler
728 };
729
730public:
732 const std::string& path,
733 char address_size = 0);
734
735 virtual ~translation_unit();
736
737 const environment&
738 get_environment() const;
739
741 get_language() const;
742
743 void
745
746 const std::string&
747 get_path() const;
748
749 void
750 set_path(const string&);
751
752 const std::string&
754
755 void
756 set_compilation_dir_path(const std::string&);
757
758 const std::string&
759 get_absolute_path() const;
760
761 void
763
764 const corpus*
765 get_corpus() const;
766
767 corpus*
768 get_corpus();
769
770 const scope_decl_sptr&
771 get_global_scope() const;
772
775
776 const type_maps&
777 get_types() const;
778
779 type_maps&
780 get_types();
781
782 const vector<function_type_sptr>&
783 get_live_fn_types() const;
784
786 get_loc_mgr();
787
788 const location_manager&
789 get_loc_mgr() const;
790
791 bool
792 is_empty() const;
793
794 char
795 get_address_size() const;
796
797 void
798 set_address_size(char);
799
800 bool
801 is_constructed() const;
802
803 void
804 set_is_constructed(bool);
805
806 bool
807 operator==(const translation_unit&) const;
808
809 bool
810 operator!=(const translation_unit&) const;
811
812 void
814
815 virtual bool
817
818 friend function_type_sptr
819 lookup_function_type_in_translation_unit(const function_type& t,
820 const translation_unit& tu);
821
822 friend function_type_sptr
824 translation_unit& tu);
825
826 friend type_base_sptr
827 synthesize_type_from_translation_unit(const type_base_sptr& type,
828 translation_unit& tu);
829};//end class translation_unit
830
831/// A comparison functor to compare translation units based on their
832/// absolute paths.
834{
835 /// Compare two translations units based on their absolute paths.
836 ///
837 /// @param lhs the first translation unit to consider for the
838 /// comparison.
839 ///
840 /// @param rhs the second translatin unit to consider for the
841 /// comparison.
842 bool
844 const translation_unit_sptr& rhs) const
845 {return lhs->get_absolute_path() < rhs->get_absolute_path();}
846}; // end struct shared_translation_unit_comp
847
848/// Convenience typedef for an ordered set of @ref
849/// translation_unit_sptr.
850typedef std::set<translation_unit_sptr,
852
853string
855
858
859bool
861
862bool
864
865bool
867
868bool
870
871bool
873
874bool
876
877/// Access specifier for class members.
879{
880 no_access,
881 public_access,
882 protected_access,
883 private_access,
884};
885
886class elf_symbol;
887/// A convenience typedef for a shared pointer to elf_symbol.
888typedef shared_ptr<elf_symbol> elf_symbol_sptr;
889
890/// A convenience typedef for a weak pointer to elf_symbol.
891typedef weak_ptr<elf_symbol> elf_symbol_wptr;
892
893/// Convenience typedef for a map which key is a string and which
894/// value if the elf symbol of the same name.
895typedef std::unordered_map<string, elf_symbol_sptr>
897
898/// Convenience typedef for a shared pointer to an
899/// string_elf_symbol_sptr_map_type.
900typedef shared_ptr<string_elf_symbol_sptr_map_type>
902
903/// Convenience typedef for a vector of elf_symbol
904typedef std::vector<elf_symbol_sptr> elf_symbols;
905
906/// Convenience typedef for a map which key is a string and which
907/// value is a vector of elf_symbol.
908typedef std::unordered_map<string, elf_symbols>
910
911/// Convenience typedef for a shared pointer to
912/// string_elf_symbols_map_type.
913typedef shared_ptr<string_elf_symbols_map_type> string_elf_symbols_map_sptr;
914
915/// Abstraction of an elf symbol.
916///
917/// This is useful when a given corpus has been read from an ELF file.
918/// In that case, a given decl might be associated to its underlying
919/// ELF symbol, if that decl is publicly exported in the ELF file. In
920/// that case, comparing decls might involve comparing their
921/// underlying symbols as well.
923{
924public:
925 /// The type of a symbol.
926 enum type
927 {
928 NOTYPE_TYPE = 0,
929 OBJECT_TYPE,
930 FUNC_TYPE,
931 SECTION_TYPE,
932 FILE_TYPE,
933 COMMON_TYPE,
934 TLS_TYPE,
935 GNU_IFUNC_TYPE
936 };
937
938 /// The binding of a symbol.
940 {
941 LOCAL_BINDING = 0,
942 GLOBAL_BINDING,
943 WEAK_BINDING,
944 GNU_UNIQUE_BINDING
945 };
946
947 /// The visibility of the symbol.
949 {
950 DEFAULT_VISIBILITY,
951 PROTECTED_VISIBILITY,
952 HIDDEN_VISIBILITY,
953 INTERNAL_VISIBILITY,
954 };
955
956 /// Inject the elf_symbol::version here.
957 class version;
958
959private:
960 struct priv;
961 std::unique_ptr<priv> priv_;
962
963 elf_symbol();
964
965 elf_symbol(const environment& e,
966 size_t i,
967 size_t s,
968 const string& n,
969 type t,
970 binding b,
971 bool d,
972 bool c,
973 const version& ve,
974 visibility vi,
975 bool is_in_ksymtab = false,
976 const abg_compat::optional<uint32_t>& crc = {},
978 bool is_suppressed = false);
979
980 elf_symbol(const elf_symbol&);
981
982 elf_symbol&
983 operator=(const elf_symbol& s);
984
985public:
986
987 static elf_symbol_sptr
988 create(const environment& e,
989 size_t i,
990 size_t s,
991 const string& n,
992 type t,
993 binding b,
994 bool d,
995 bool c,
996 const version& ve,
997 visibility vi,
998 bool is_in_ksymtab = false,
999 const abg_compat::optional<uint32_t>& crc = {},
1000 const abg_compat::optional<std::string>& ns = {},
1001 bool is_suppressed = false);
1002
1003 const environment&
1004 get_environment() const;
1005
1006 size_t
1007 get_index() const;
1008
1009 void
1010 set_index(size_t);
1011
1012 const string&
1013 get_name() const;
1014
1015 void
1016 set_name(const string& n);
1017
1018 type
1019 get_type() const;
1020
1021 void
1022 set_type(type t);
1023
1024 size_t
1025 get_size() const;
1026
1027 void
1028 set_size(size_t);
1029
1030 binding
1031 get_binding() const;
1032
1033 void
1035
1036 version&
1037 get_version() const;
1038
1039 void
1040 set_version(const version& v);
1041
1042 void
1044
1046 get_visibility() const;
1047
1048 bool
1049 is_defined() const;
1050
1051 void
1052 is_defined(bool d);
1053
1054 bool
1055 is_public() const;
1056
1057 bool
1058 is_function() const;
1059
1060 bool
1061 is_variable() const;
1062
1063 bool
1064 is_in_ksymtab() const;
1065
1066 void
1068
1070 get_crc() const;
1071
1072 void
1074
1076 get_namespace() const;
1077
1078 void
1080
1081 bool
1082 is_suppressed() const;
1083
1084 void
1086
1087 const elf_symbol_sptr
1088 get_main_symbol() const;
1089
1092
1093 bool
1094 is_main_symbol() const;
1095
1097 update_main_symbol(const std::string&);
1098
1100 get_next_alias() const;
1101
1102 bool
1103 has_aliases() const;
1104
1105 int
1106 get_number_of_aliases() const;
1107
1108 void
1109 add_alias(const elf_symbol_sptr&);
1110
1111 bool
1112 is_common_symbol() const;
1113
1114 bool
1116
1119
1120 void
1122
1123 const string&
1124 get_id_string() const;
1125
1127 get_alias_from_name(const string& name) const;
1128
1130 get_alias_which_equals(const elf_symbol& other) const;
1131
1133 get_alias_with_default_symbol_version() const;
1134
1135 string
1137 bool include_symbol_itself = true) const;
1138
1139 string
1140 get_aliases_id_string(bool include_symbol_itself = true) const;
1141
1142 static bool
1143 get_name_and_version_from_id(const string& id,
1144 string& name,
1145 string& ver);
1146
1147 bool
1148 operator==(const elf_symbol&) const;
1149
1150 bool
1151 does_alias(const elf_symbol&) const;
1152}; // end class elf_symbol.
1153
1154std::ostream&
1155operator<<(std::ostream& o, elf_symbol::type t);
1156
1157std::ostream&
1158operator<<(std::ostream& o, elf_symbol::binding t);
1159
1160std::ostream&
1161operator<<(std::ostream& o, elf_symbol::visibility t);
1162
1163bool
1165
1166bool
1168
1169bool
1171
1172bool
1174
1175bool
1177
1178bool
1179operator==(const elf_symbol_sptr& lhs, const elf_symbol_sptr& rhs);
1180
1181bool
1182operator!=(const elf_symbol_sptr& lhs, const elf_symbol_sptr& rhs);
1183
1184bool
1185elf_symbols_alias(const elf_symbol& s1, const elf_symbol& s2);
1186
1187void
1188compute_aliases_for_elf_symbol(const elf_symbol& symbol,
1189 const string_elf_symbols_map_type& symtab,
1190 vector<elf_symbol_sptr>& alias_set);
1191
1192/// The abstraction of the version of an ELF symbol.
1194{
1195 struct priv;
1196 std::unique_ptr<priv> priv_;
1197
1198public:
1199 version();
1200
1201 version(const string& v,
1202 bool is_default);
1203
1204 version(const version& v);
1205
1206 ~version();
1207
1208 operator const string&() const;
1209
1210 const string&
1211 str() const;
1212
1213 void
1214 str(const string& s);
1215
1216 bool
1217 is_default() const;
1218
1219 void
1220 is_default(bool f);
1221
1222 bool
1223 is_empty() const;
1224
1225 bool
1226 operator==(const version& o) const;
1227
1228 bool
1229 operator!=(const version& o) const;
1230
1231 version&
1232 operator=(const version& o);
1233};// end class elf_symbol::version
1234
1235class context_rel;
1236/// A convenience typedef for shared pointers to @ref context_rel
1237typedef shared_ptr<context_rel> context_rel_sptr;
1238
1239/// The abstraction of the relationship between an entity and its
1240/// containing scope (its context). That relationship can carry
1241/// properties like access rights (if the parent is a class_decl),
1242/// etc.
1243///
1244/// But importantly, this relationship carries a pointer to the
1245/// actualy parent.
1247{
1248protected:
1249 scope_decl* scope_;
1250 enum access_specifier access_;
1251 bool is_static_;
1252
1253public:
1254 context_rel()
1255 : scope_(0),
1256 access_(no_access),
1257 is_static_(false)
1258 {}
1259
1261 : scope_(s),
1262 access_(no_access),
1263 is_static_(false)
1264 {}
1265
1268 bool f)
1269 : scope_(s),
1270 access_(a),
1271 is_static_(f)
1272 {}
1273
1274 scope_decl*
1275 get_scope() const
1276 {return scope_;}
1277
1279 get_access_specifier() const
1280 {return access_;}
1281
1282 void
1283 set_access_specifier(access_specifier a)
1284 {access_ = a;}
1285
1286 bool
1287 get_is_static() const
1288 {return is_static_;}
1289
1290 void
1291 set_is_static(bool s)
1292 {is_static_ = s;}
1293
1294 void
1295 set_scope(scope_decl* s)
1296 {scope_ = s;}
1297
1298 bool
1299 operator==(const context_rel& o)const
1300 {
1301 return (access_ == o.access_
1302 && is_static_ == o.is_static_);
1303 }
1304
1305 /// Inequality operator.
1306 ///
1307 /// @param o the other instance of @ref context_rel to compare the
1308 /// current instance against.
1309 ///
1310 /// @return true iff the current instance of @ref context_rel is
1311 /// different from @p o.
1312 bool
1313 operator!=(const context_rel& o) const
1314 {return !operator==(o);}
1315
1316 virtual ~context_rel();
1317};// end class context_rel
1318
1319/// A bitfield that gives callers of abigail::ir::equals() some
1320/// insight about how different two internal representation artifacts
1321/// are.
1323{
1324 NO_CHANGE_KIND = 0,
1325
1326 /// This means that a given IR artifact has a local type change.
1328
1329 /// This means that a given IR artifact has a local non-type change.
1330 /// That is a change that is carried by the artifact itself, not by
1331 /// its type.
1333
1334 /// Testing (anding) against this mask means that a given IR artifact has
1335 /// local differences, with respect to the other artifact it was compared
1336 /// against. A local change is a change that is carried by the artifact
1337 /// itself (or its type), rather than by one off its sub-types.
1339
1340 /// This means that a given IR artifact has changes in some of its
1341 /// sub-types, with respect to the other artifact it was compared
1342 /// against.
1344};// end enum change_kind
1345
1348
1351
1354
1357
1358bool
1360 const decl_base& r,
1361 change_kind* k);
1362
1363bool
1364equals(const decl_base&, const decl_base&, change_kind*);
1365
1366/// The base class of both types and declarations.
1368{
1369 struct priv;
1370 mutable std::unique_ptr<priv> priv_;
1371
1374
1375protected:
1376
1377 /// This is a bitmap type which instance is meant to contain the
1378 /// runtime type of a given ABI artifact. Bits of the identifiers
1379 /// of the type of a given artifact as well as the types it inherits
1380 /// from are to be set to 1.
1382 {
1383 ABSTRACT_TYPE_OR_DECL,
1384 ABSTRACT_DECL_BASE = 1,
1385 ABSTRACT_SCOPE_DECL = 1 << 1,
1386 GLOBAL_SCOPE_DECL = 1 << 2,
1387 NAMESPACE_DECL = 1 << 3,
1388 VAR_DECL = 1 << 4,
1389 FUNCTION_DECL = 1 << 5,
1390 FUNCTION_PARAMETER_DECL = 1 << 6,
1391 METHOD_DECL = 1 << 7,
1392 TEMPLATE_DECL = 1 << 8,
1393 ABSTRACT_TYPE_BASE = 1 << 9,
1394 ABSTRACT_SCOPE_TYPE_DECL = 1 << 10,
1395 BASIC_TYPE = 1 << 11,
1396 SUBRANGE_TYPE = 1 << 12,
1397 QUALIFIED_TYPE = 1 << 13,
1398 POINTER_TYPE = 1 << 14,
1399 REFERENCE_TYPE = 1 << 15,
1400 POINTER_TO_MEMBER_TYPE = 1 << 16,
1401 ARRAY_TYPE = 1 << 17,
1402 ENUM_TYPE = 1 << 18,
1403 TYPEDEF_TYPE = 1 << 19,
1404 CLASS_TYPE = 1 << 20,
1405 UNION_TYPE = 1 << 21,
1406 FUNCTION_TYPE = 1 << 22,
1407 METHOD_TYPE = 1 << 23,
1408 }; // end enum type_or_decl_kind
1409
1411 kind() const;
1412
1413 void
1414 kind(enum type_or_decl_kind);
1415
1416 const void*
1417 runtime_type_instance() const;
1418
1419 void*
1421
1422 void
1423 runtime_type_instance(void*);
1424
1425 const void*
1427
1428 void*
1430
1431 bool hashing_started() const;
1432
1433 void hashing_started(bool) const;
1434
1436 operator=(const type_or_decl_base&);
1437
1438public:
1439
1441 enum type_or_decl_kind k = ABSTRACT_TYPE_OR_DECL);
1442
1443 virtual ~type_or_decl_base();
1444
1445 bool
1446 get_is_artificial() const;
1447
1448 void
1449 set_is_artificial(bool);
1450
1451 const environment&
1452 get_environment() const;
1453
1454 void
1456
1457 location&
1459
1460 bool
1462
1463 const corpus*
1464 get_corpus() const;
1465
1466 corpus*
1467 get_corpus();
1468
1469 void
1471
1472 const translation_unit*
1473 get_translation_unit() const;
1474
1477
1478 virtual bool
1480
1481 virtual string
1482 get_pretty_representation(bool internal = false,
1483 bool qualified_name = true) const = 0;
1484
1488
1492
1496
1500
1501 friend class_decl*
1503
1504 friend type_base*
1505 is_type(const type_or_decl_base*);
1506
1507 friend decl_base*
1508 is_decl(const type_or_decl_base* d);
1509}; // end class type_or_decl_base
1510
1514
1518
1522
1526
1527bool
1529
1530bool
1532
1533bool
1535
1536/// The base type of all declarations.
1537class decl_base : public virtual type_or_decl_base
1538{
1539 // Forbidden
1540 decl_base();
1541
1542 struct priv;
1543
1544protected:
1545
1546 const interned_string&
1547 peek_qualified_name() const;
1548
1549 void
1551
1552 void
1553 set_qualified_name(const interned_string&) const;
1554
1555 const interned_string&
1557
1558 void
1560
1561public:
1562 // This is public because some internals of the library need to
1563 // update it. But it's opaque to client code anyway, so no big
1564 // deal. Also, it's not handled by a shared_ptr because accessing
1565 // the data members of the priv struct for this decl_base shows up
1566 // on performance profiles when dealing with big binaries with a lot
1567 // of types; dereferencing the shared_ptr involves locking of some
1568 // sort and that is slower than just dereferencing a pointer likere
1569 // here. There are other types for which the priv pointer is
1570 // managed using shared_ptr just fine, because those didn't show up
1571 // during our performance profiling.
1572 priv* priv_;
1573
1574 /// Facility to hash instances of decl_base.
1575 struct hash;
1576
1577 /// ELF visibility
1579 {
1580 VISIBILITY_NONE,
1581 VISIBILITY_DEFAULT,
1582 VISIBILITY_PROTECTED,
1583 VISIBILITY_HIDDEN,
1584 VISIBILITY_INTERNAL
1585 };
1586
1587 /// ELF binding
1589 {
1590 BINDING_NONE,
1591 BINDING_LOCAL,
1592 BINDING_GLOBAL,
1593 BINDING_WEAK
1594 };
1595
1596 virtual void
1598
1599protected:
1600 const context_rel*
1601 get_context_rel() const;
1602
1605
1606 void
1607 set_context_rel(context_rel *c);
1608 decl_base(const decl_base&);
1609
1610public:
1611 decl_base(const environment& e,
1612 const string& name,
1613 const location& locus,
1614 const string& mangled_name = "",
1615 visibility vis = VISIBILITY_DEFAULT);
1616
1617 decl_base(const environment& e,
1618 const interned_string& name,
1619 const location& locus,
1620 const interned_string& mangled_name = interned_string(),
1621 visibility vis = VISIBILITY_DEFAULT);
1622
1623 decl_base(const environment&, const location&);
1624
1625 virtual bool
1626 operator==(const decl_base&) const;
1627
1628 virtual bool
1629 operator!=(const decl_base&) const;
1630
1631 virtual bool
1633
1634 virtual ~decl_base();
1635
1636 virtual size_t
1637 get_hash() const;
1638
1639 virtual string
1640 get_pretty_representation(bool internal = false,
1641 bool qualified_name = true) const;
1642
1643 virtual void
1644 get_qualified_name(interned_string& qualified_name,
1645 bool internal = false) const;
1646
1647 virtual const interned_string&
1648 get_qualified_name(bool internal = false) const;
1649
1650 virtual const interned_string&
1651 get_scoped_name() const;
1652
1653 bool
1655
1656 void
1658
1659 const location&
1660 get_location() const;
1661
1662 void
1663 set_location(const location& l);
1664
1665 const interned_string&
1666 get_name() const;
1667
1668 const interned_string&
1670
1671 void
1672 set_name(const string& n);
1673
1674 bool
1675 get_is_anonymous() const;
1676
1677 void
1678 set_is_anonymous(bool);
1679
1680 bool
1682
1683 bool
1685
1687 get_naming_typedef() const;
1688
1689 void
1691
1692 const interned_string&
1693 get_linkage_name() const;
1694
1695 virtual void
1696 set_linkage_name(const string& m);
1697
1698 scope_decl*
1699 get_scope() const;
1700
1702 get_visibility() const;
1703
1704 void
1706
1707 const decl_base_sptr
1709
1710 void
1711 set_earlier_declaration(const decl_base_sptr&);
1712
1713 const decl_base_sptr
1715
1716 void
1717 set_definition_of_declaration(const decl_base_sptr&);
1718
1719 const decl_base*
1721
1722 bool
1724
1725 void
1727
1728 friend bool
1729 equals(const decl_base&, const decl_base&, change_kind*);
1730
1731 friend bool
1732 equals(const var_decl&, const var_decl&, change_kind*);
1733
1734 friend bool
1736
1737 friend bool
1739 const decl_base& r,
1740 change_kind* k);
1741
1742 friend decl_base_sptr
1743 add_decl_to_scope(decl_base_sptr decl, scope_decl* scpe);
1744
1745 friend void
1746 remove_decl_from_scope(decl_base_sptr);
1747
1748 friend decl_base_sptr
1749 insert_decl_into_scope(decl_base_sptr,
1750 vector<shared_ptr<decl_base> >::iterator,
1751 scope_decl*);
1752
1753 friend enum access_specifier
1755
1756 friend enum access_specifier
1757 get_member_access_specifier(const decl_base_sptr& d);
1758
1759 friend void
1762
1763 friend bool
1765
1766 friend bool
1767 get_member_is_static(const decl_base_sptr& d);
1768
1769 friend void
1770 set_member_is_static(const decl_base_sptr& d, bool s);
1771
1772 friend void
1773 set_member_is_static(decl_base& d, bool s);
1774
1775 friend bool
1777
1778 friend void
1780
1781 friend class class_or_union;
1782 friend class class_decl;
1783 friend class scope_decl;
1784};// end class decl_base
1785
1786bool
1787operator==(const decl_base_sptr&, const decl_base_sptr&);
1788
1789bool
1790operator!=(const decl_base_sptr&, const decl_base_sptr&);
1791
1792bool
1793operator==(const type_base_sptr&, const type_base_sptr&);
1794
1795bool
1796operator!=(const type_base_sptr&, const type_base_sptr&);
1797
1798std::ostream&
1799operator<<(std::ostream&, decl_base::visibility);
1800
1801std::ostream&
1802operator<<(std::ostream&, decl_base::binding);
1803
1804bool
1805equals(const scope_decl&, const scope_decl&, change_kind*);
1806
1807/// A declaration that introduces a scope.
1808class scope_decl : public virtual decl_base
1809{
1810 struct priv;
1811 std::unique_ptr<priv> priv_;
1812
1813public:
1814
1815 /// Convenience typedef for a vector of @ref decl_base_sptr.
1816 typedef std::vector<decl_base_sptr > declarations;
1817 /// Convenience typedef for a vector of @ref function_type_sptr.
1818 typedef std::vector<function_type_sptr > function_types;
1819 /// Convenience typedef for a vector of @ref scope_decl_sptr.
1820 typedef std::vector<scope_decl_sptr> scopes;
1821
1822 scope_decl();
1823
1824protected:
1825 virtual decl_base_sptr
1826 add_member_decl(const decl_base_sptr& member);
1827
1828 decl_base_sptr
1829 insert_member_decl(decl_base_sptr member, declarations::iterator before);
1830
1831 virtual void
1832 remove_member_decl(decl_base_sptr member);
1833
1834public:
1835 struct hash;
1836
1837 scope_decl(const environment& env,
1838 const string& name, const location& locus,
1839 visibility vis = VISIBILITY_DEFAULT);
1840
1841 scope_decl(const environment& env, location& l);
1842
1843 virtual size_t
1844 get_hash() const;
1845
1846 virtual bool
1847 operator==(const decl_base&) const;
1848
1850 get_canonical_types() const;
1851
1854
1857
1858 const declarations&
1859 get_member_decls() const;
1860
1863
1864 const declarations&
1866
1867 virtual size_t
1869
1870 virtual size_t
1872
1873 virtual size_t
1875
1876 scopes&
1878
1879 const scopes&
1880 get_member_scopes() const;
1881
1882 bool
1883 is_empty() const;
1884
1885 bool
1886 find_iterator_for_member(const decl_base*, declarations::iterator&);
1887
1888 bool
1889 find_iterator_for_member(const decl_base_sptr, declarations::iterator&);
1890
1891 void
1892 insert_member_type(type_base_sptr t,
1893 declarations::iterator before);
1894
1895 void
1896 add_member_type(type_base_sptr t);
1897
1898 type_base_sptr
1899 add_member_type(type_base_sptr t, access_specifier a);
1900
1901 void
1902 remove_member_type(type_base_sptr t);
1903
1905 get_member_types() const;
1906
1909
1910 type_base_sptr
1911 find_member_type(const string& name) const;
1912
1913 virtual bool
1915
1916 virtual ~scope_decl();
1917
1918 friend decl_base_sptr
1919 add_decl_to_scope(decl_base_sptr decl, scope_decl* scope);
1920
1921 friend decl_base_sptr
1922 insert_decl_into_scope(decl_base_sptr decl,
1923 scope_decl::declarations::iterator before,
1924 scope_decl* scope);
1925
1926 friend void
1927 remove_decl_from_scope(decl_base_sptr decl);
1928};//end class scope_decl
1929
1930bool
1932
1933bool
1935
1936/// Hasher for the @ref scope_decl type.
1938{
1939 size_t
1940 operator()(const scope_decl& d) const;
1941
1942 size_t
1943 operator()(const scope_decl* d) const;
1944};
1945
1946/// This abstracts the global scope of a given translation unit.
1947///
1948/// Only one instance of this class must be present in a given
1949/// translation_unit. That instance is implicitely created the first
1950/// time translatin_unit::get_global_scope is invoked.
1952{
1953 translation_unit* translation_unit_;
1954
1956
1957public:
1958
1959 friend class translation_unit;
1960
1962 get_translation_unit() const
1963 {return translation_unit_;}
1964
1965 virtual ~global_scope();
1966};
1967
1968bool
1969equals(const type_base&, const type_base&, change_kind*);
1970
1971/// An abstraction helper for type declarations
1972class type_base : public virtual type_or_decl_base
1973{
1974 struct priv;
1975
1976public:
1977 // This priv pointer is not handled by a shared_ptr because
1978 // accessing the data members of the priv struct for this type_base
1979 // shows up on performance profiles when dealing with big binaries
1980 // with a lot of types; dereferencing the shared_ptr involves
1981 // locking of some sort and that is slower than just dereferencing a
1982 // pointer likere here. There are other types for which the priv
1983 // pointer is managed using shared_ptr just fine, because those
1984 // didn't show up during our performance profiling.
1985 priv* priv_;
1986
1987private:
1988 // Forbid this.
1989 type_base();
1990
1991 static type_base_sptr
1992 get_canonical_type_for(type_base_sptr);
1993
1994protected:
1995 virtual void
1997
1998public:
1999
2000 /// A hasher for type_base types.
2001 struct hash;
2002
2003 /// A hasher for types. It gets the dynamic type of the current
2004 /// instance of type and hashes it accordingly. Note that the hashing
2005 /// function of this hasher must be updated each time a new kind of
2006 /// type is added to the IR.
2007 struct dynamic_hash;
2008
2009 /// A hasher for shared_ptr<type_base> that will hash it based on the
2010 /// runtime type of the type pointed to.
2011 struct shared_ptr_hash;
2012
2013 type_base(const environment& e, size_t s, size_t a);
2014
2015 friend type_base_sptr canonicalize(type_base_sptr);
2016
2017 type_base_sptr
2018 get_canonical_type() const;
2019
2020 type_base*
2022
2023 const interned_string&
2024 get_cached_pretty_representation(bool internal = false) const;
2025
2026 virtual bool
2027 operator==(const type_base&) const;
2028
2029 virtual bool
2030 operator!=(const type_base&) const;
2031
2032 virtual bool
2034
2035 virtual ~type_base();
2036
2037 virtual void
2038 set_size_in_bits(size_t);
2039
2040 virtual size_t
2041 get_size_in_bits() const;
2042
2043 virtual void
2044 set_alignment_in_bits(size_t);
2045
2046 virtual size_t
2047 get_alignment_in_bits() const;
2048};//end class type_base
2049
2050/// Hash functor for instances of @ref type_base.
2052{
2053 size_t
2054 operator()(const type_base& t) const;
2055
2056 size_t
2057 operator()(const type_base* t) const;
2058
2059 size_t
2060 operator()(const type_base_sptr t) const;
2061}; // end struct type_base::hash
2062
2063/// A predicate for deep equality of instances of
2064/// type_base*
2066{
2067 bool
2068 operator()(const type_base* l, const type_base* r) const
2069 {
2070 if (!!l != !!r)
2071 return false;
2072
2073 if (l == r)
2074 return true;
2075
2076 if (l)
2077 return *l == *r;
2078
2079 return true;
2080 }
2081};
2082
2083/// A predicate for deep equality of instances of
2084/// shared_ptr<type_base>
2086{
2087 bool
2088 operator()(const type_base_sptr l, const type_base_sptr r) const
2089 {
2090 if (!!l != !!r)
2091 return false;
2092
2093 if (l.get() == r.get())
2094 return true;
2095
2096 if (l)
2097 return *l == *r;
2098
2099 return true;
2100 }
2101};
2102
2103bool
2104equals(const type_decl&, const type_decl&, change_kind*);
2105
2106/// A basic type declaration that introduces no scope.
2107class type_decl : public virtual decl_base, public virtual type_base
2108{
2109 // Forbidden.
2110 type_decl();
2111
2112public:
2113
2114 /// Facility to hash instance of type_decl
2115 struct hash;
2116
2117 type_decl(const environment& env,
2118 const string& name,
2119 size_t size_in_bits,
2120 size_t alignment_in_bits,
2121 const location& locus,
2122 const string& mangled_name = "",
2123 visibility vis = VISIBILITY_DEFAULT);
2124
2125 virtual bool
2126 operator==(const type_base&) const;
2127
2128 virtual bool
2129 operator==(const decl_base&) const;
2130
2131 virtual bool
2132 operator==(const type_decl&) const;
2133
2134 virtual bool
2135 operator!=(const type_base&)const;
2136
2137 virtual bool
2138 operator!=(const decl_base&)const;
2139
2140 virtual bool
2141 operator!=(const type_decl&)const;
2142
2143 virtual void
2144 get_qualified_name(interned_string& qualified_name,
2145 bool internal = false) const;
2146
2147 virtual const interned_string&
2148 get_qualified_name(bool internal = false) const;
2149
2150 virtual string
2151 get_pretty_representation(bool internal = false,
2152 bool qualified_name = true) const;
2153
2154 virtual bool
2156
2157 virtual ~type_decl();
2158};// end class type_decl.
2159
2160bool
2162
2163bool
2165
2166bool
2168
2169/// A type that introduces a scope.
2170class scope_type_decl : public scope_decl, public virtual type_base
2171{
2173
2174public:
2175
2176 /// Hasher for instances of scope_type_decl
2177 struct hash;
2178
2179 scope_type_decl(const environment& env, const string& name,
2180 size_t size_in_bits, size_t alignment_in_bits,
2181 const location& locus, visibility vis = VISIBILITY_DEFAULT);
2182
2183 virtual bool
2184 operator==(const decl_base&) const;
2185
2186 virtual bool
2187 operator==(const type_base&) const;
2188
2189 virtual bool
2191
2192 virtual ~scope_type_decl();
2193};
2194
2195/// The abstraction of a namespace declaration
2197{
2198public:
2199
2200 namespace_decl(const environment& env, const string& name,
2201 const location& locus, visibility vis = VISIBILITY_DEFAULT);
2202
2203 virtual string
2204 get_pretty_representation(bool internal = false,
2205 bool qualified_name = true) const;
2206
2207 virtual bool
2208 operator==(const decl_base&) const;
2209
2210 virtual bool
2212
2213 virtual ~namespace_decl();
2214
2216};// end class namespace_decl
2217
2218/// A convenience typedef for vectors of @ref namespace_decl_sptr
2219typedef vector<namespace_decl_sptr> namespaces_type;
2220
2221bool
2223
2224/// The abstraction of a qualified type.
2225class qualified_type_def : public virtual type_base, public virtual decl_base
2226{
2227 class priv;
2228 std::unique_ptr<priv> priv_;
2229
2230 // Forbidden.
2232
2233protected:
2234 string build_name(bool, bool internal = false) const;
2235 virtual void on_canonical_type_set();
2236
2237public:
2238
2239 /// A Hasher for instances of qualified_type_def
2240 struct hash;
2241
2242 /// Bit field values representing the cv qualifiers of the
2243 /// underlying type.
2244 enum CV
2245 {
2246 CV_NONE = 0,
2247 CV_CONST = 1,
2248 CV_VOLATILE = 1 << 1,
2249 CV_RESTRICT = 1 << 2
2250 };
2251
2252 qualified_type_def(type_base_sptr type, CV quals, const location& locus);
2253
2254 qualified_type_def(const environment& env, CV quals, const location& locus);
2255
2256 virtual size_t
2257 get_size_in_bits() const;
2258
2259 virtual bool
2260 operator==(const decl_base&) const;
2261
2262 virtual bool
2263 operator==(const type_base&) const;
2264
2265 virtual bool
2266 operator==(const qualified_type_def&) const;
2267
2268 CV
2269 get_cv_quals() const;
2270
2271 void
2272 set_cv_quals(CV cv_quals);
2273
2274 string
2276
2277 type_base_sptr
2278 get_underlying_type() const;
2279
2280 void
2281 set_underlying_type(const type_base_sptr&);
2282
2283 virtual void
2284 get_qualified_name(interned_string& qualified_name,
2285 bool internal = false) const;
2286
2287 virtual const interned_string&
2288 get_qualified_name(bool internal = false) const;
2289
2290 virtual bool
2292
2293 virtual ~qualified_type_def();
2294}; // end class qualified_type_def.
2295
2296bool
2297operator==(const qualified_type_def_sptr&, const qualified_type_def_sptr&);
2298
2299bool
2300operator!=(const qualified_type_def_sptr&, const qualified_type_def_sptr&);
2301
2304
2307
2310
2313
2316
2317std::ostream&
2318operator<<(std::ostream&, qualified_type_def::CV);
2319
2320string
2322
2324get_name_of_qualified_type(const type_base_sptr& underlying_type,
2326 bool qualified = true, bool internal = false);
2327
2328qualified_type_def_sptr
2329lookup_qualified_type(const type_base_sptr&,
2331 const translation_unit&);
2332bool
2334
2335/// The abstraction of a pointer type.
2336class pointer_type_def : public virtual type_base, public virtual decl_base
2337{
2338 struct priv;
2339 std::unique_ptr<priv> priv_;
2340
2341 // Forbidden.
2343
2344protected:
2345 virtual void on_canonical_type_set();
2346
2347public:
2348
2349 /// A hasher for instances of pointer_type_def
2350 struct hash;
2351
2352 pointer_type_def(const type_base_sptr& pointed_to_type, size_t size_in_bits,
2353 size_t alignment_in_bits, const location& locus);
2354
2355 pointer_type_def(const environment& env, size_t size_in_bits,
2356 size_t alignment_in_bits, const location& locus);
2357
2358 void
2359 set_pointed_to_type(const type_base_sptr&);
2360
2361 virtual bool
2362 operator==(const decl_base&) const;
2363
2364 virtual bool
2365 operator==(const type_base&) const;
2366
2367 bool
2368 operator==(const pointer_type_def&) const;
2369
2370 const type_base_sptr
2371 get_pointed_to_type() const;
2372
2373 type_base*
2375
2376 virtual void
2377 get_qualified_name(interned_string&, bool internal = false) const;
2378
2379 virtual const interned_string&
2380 get_qualified_name(bool internal = false) const;
2381
2382 virtual bool
2384
2385 virtual ~pointer_type_def();
2386}; // end class pointer_type_def
2387
2388bool
2390
2391bool
2393
2394bool
2396
2397
2398/// Abstracts a reference type.
2399class reference_type_def : public virtual type_base, public virtual decl_base
2400{
2401 struct priv;
2402 std::unique_ptr<priv> priv_;
2403
2404 // Forbidden.
2406
2407protected:
2408 virtual void on_canonical_type_set();
2409
2410public:
2411
2412 /// Hasher for intances of reference_type_def.
2413 struct hash;
2414
2415 reference_type_def(const type_base_sptr pointed_to_type,
2416 bool lvalue, size_t size_in_bits,
2417 size_t alignment_in_bits, const location& locus);
2418
2419 reference_type_def(const environment& env, bool lvalue, size_t size_in_bits,
2420 size_t alignment_in_bits, const location& locus);
2421
2422 void
2423 set_pointed_to_type(type_base_sptr& pointed_to_type);
2424
2425 virtual bool
2426 operator==(const decl_base&) const;
2427
2428 virtual bool
2429 operator==(const type_base&) const;
2430
2431 bool
2432 operator==(const reference_type_def&) const;
2433
2434 type_base_sptr
2435 get_pointed_to_type() const;
2436
2437 bool
2438 is_lvalue() const;
2439
2440 virtual void
2441 get_qualified_name(interned_string& qualified_name,
2442 bool internal = false) const;
2443
2444 virtual const interned_string&
2445 get_qualified_name(bool internal = false) const;
2446
2447 virtual string
2448 get_pretty_representation(bool internal = false,
2449 bool qualified_name = true) const;
2450
2451 virtual bool
2453
2454 virtual ~reference_type_def();
2455}; // end class reference_type_def
2456
2457bool
2459
2460bool
2462
2463/// The abstraction of a pointer-to-member type.
2464class ptr_to_mbr_type : public virtual type_base,
2465 public virtual decl_base
2466{
2467 struct priv;
2468 std::unique_ptr<priv> priv_;
2469
2470 // Forbidden
2471 ptr_to_mbr_type() = delete;
2472
2473 public:
2474 ptr_to_mbr_type(const environment& env,
2475 const type_base_sptr& member_type,
2476 const type_base_sptr& containing_type,
2477 size_t size_in_bits,
2478 size_t alignment_in_bits,
2479 const location& locus);
2480
2481 const type_base_sptr&
2482 get_member_type() const;
2483
2484 const type_base_sptr&
2485 get_containing_type() const;
2486
2487 bool
2488 operator==(const ptr_to_mbr_type&) const;
2489
2490 virtual bool
2491 operator==(const type_base&) const;
2492
2493 virtual bool
2494 operator==(const decl_base&) const;
2495
2496 virtual void
2497 get_qualified_name(interned_string& qualified_name,
2498 bool internal = false) const;
2499
2500 virtual const interned_string&
2501 get_qualified_name(bool internal = false) const;
2502
2503 virtual bool
2505
2506 virtual ~ptr_to_mbr_type();
2507}; // end class ptr_to_mbr_type
2508
2509bool
2510equals(const ptr_to_mbr_type&,
2511 const ptr_to_mbr_type&,
2512 change_kind*);
2513
2514bool
2516
2517/// The abstraction of an array type.
2518class array_type_def : public virtual type_base, public virtual decl_base
2519{
2520 struct priv;
2521 std::unique_ptr<priv> priv_;
2522
2523 // Forbidden.
2525
2526 void update_size();
2527
2528public:
2529
2530 /// Hasher for intances of array_type_def.
2531 struct hash;
2532
2533 class subrange_type;
2534
2535 /// Convenience typedef for a shared pointer on a @ref
2536 /// function_decl::subrange
2537 typedef shared_ptr<subrange_type> subrange_sptr;
2538
2539 /// Convenience typedef for a vector of @ref subrange_sptr
2540 typedef std::vector<subrange_sptr> subranges_type;
2541
2542 /// Abstraction for an array range type, like in Ada, or just for an
2543 /// array dimension like in C or C++.
2544 class subrange_type : public virtual type_base, public virtual decl_base
2545 {
2546 struct priv;
2547 std::unique_ptr<priv> priv_;
2548
2549 // Forbidden.
2550 subrange_type();
2551 public:
2552
2553 virtual ~subrange_type();
2554 /// This class is to hold the value of the bound of a subrange.
2555 /// The value can be either signed or unsigned, at least when it
2556 /// comes from DWARF. The class keeps the sign information, but
2557 /// allows users to access the value as signed or unsigned as they
2558 /// see fit.
2560 {
2561 public:
2562 enum signedness
2563 {
2564 UNSIGNED_SIGNEDNESS,
2565 SIGNED_SIGNEDNESS
2566 };
2567
2568 private:
2569 signedness s_;
2570
2571 public:
2572 union
2573 {
2574 uint64_t unsigned_;
2575 int64_t signed_;
2576 } v_;
2577 bound_value();
2578 bound_value(uint64_t);
2579 bound_value(int64_t);
2580 enum signedness get_signedness() const;
2581 void set_signedness(enum signedness s);
2582 int64_t get_signed_value() const;
2583 uint64_t get_unsigned_value();
2584 void set_unsigned(uint64_t v);
2585 void set_signed(int64_t v);
2586 bool operator==(const bound_value&) const;
2587 }; //end class bound_value
2588
2589 /// Hasher for an instance of array::subrange
2590 struct hash;
2591
2592 subrange_type(const environment& env,
2593 const string& name,
2594 bound_value lower_bound,
2595 bound_value upper_bound,
2596 const type_base_sptr& underlying_type,
2597 const location& loc,
2598 translation_unit::language l = translation_unit::LANG_C11);
2599
2600 subrange_type(const environment& env,
2601 const string& name,
2602 bound_value lower_bound,
2603 bound_value upper_bound,
2604 const location& loc,
2605 translation_unit::language l = translation_unit::LANG_C11);
2606
2607 subrange_type(const environment& env,
2608 const string& name,
2609 bound_value upper_bound,
2610 const location& loc,
2611 translation_unit::language l = translation_unit::LANG_C11);
2612
2613 type_base_sptr
2614 get_underlying_type() const;
2615
2616 void
2617 set_underlying_type(const type_base_sptr &);
2618
2619 int64_t
2620 get_upper_bound() const;
2621
2622 int64_t
2623 get_lower_bound() const;
2624
2625 void
2626 set_upper_bound(int64_t ub);
2627
2628 void
2629 set_lower_bound(int64_t lb);
2630
2631 uint64_t
2632 get_length() const;
2633
2634 bool
2635 is_non_finite() const;
2636
2637 void
2638 is_non_finite(bool);
2639
2641 get_language() const;
2642
2643 virtual bool
2644 operator==(const decl_base&) const;
2645
2646 virtual bool
2647 operator==(const type_base&) const;
2648
2649 bool
2650 operator==(const subrange_type& o) const;
2651
2652 bool
2653 operator!=(const decl_base& o) const;
2654
2655 bool
2656 operator!=(const type_base& o) const;
2657
2658 bool
2659 operator!=(const subrange_type& o) const;
2660
2661 string
2662 as_string() const;
2663
2664 static string
2665 vector_as_string(const vector<subrange_sptr>&);
2666
2667 virtual string
2668 get_pretty_representation(bool internal = false,
2669 bool qualified_name = true) const;
2670
2671 virtual bool
2673 }; // end class subrange_type
2674
2675 array_type_def(const type_base_sptr type,
2676 const std::vector<subrange_sptr>& subs,
2677 const location& locus);
2678
2679 array_type_def(const environment& env,
2680 const std::vector<subrange_sptr>& subs,
2681 const location& locus);
2682
2684 get_language() const;
2685
2686 virtual bool
2687 operator==(const decl_base&) const;
2688
2689 virtual bool
2690 operator==(const type_base&) const;
2691
2692 virtual void
2693 get_qualified_name(interned_string& qualified_name,
2694 bool internal = false) const;
2695
2696 virtual const interned_string&
2697 get_qualified_name(bool internal = false) const;
2698
2699 const type_base_sptr
2700 get_element_type() const;
2701
2702 void
2703 set_element_type(const type_base_sptr& element_type);
2704
2705 virtual void
2706 append_subranges(const std::vector<subrange_sptr>& subs);
2707
2708 virtual int
2709 get_dimension_count() const;
2710
2711 virtual bool
2712 is_non_finite() const;
2713
2714 virtual string
2715 get_pretty_representation(bool internal = false,
2716 bool qualified_name = true) const;
2717
2718 virtual string
2719 get_subrange_representation() const;
2720
2721 virtual bool
2723
2724 const location&
2725 get_location() const;
2726
2727 const std::vector<subrange_sptr>&
2728 get_subranges() const;
2729
2730 virtual ~array_type_def();
2731
2732}; // end class array_type_def
2733
2736
2739
2740bool
2743 change_kind*);
2744
2745bool
2747
2748/// Abstracts a declaration for an enum type.
2749class enum_type_decl : public virtual type_base, public virtual decl_base
2750{
2751 class priv;
2752 std::unique_ptr<priv> priv_;
2753
2754 // Forbidden
2756
2757public:
2758
2759 /// A hasher for an enum_type_decl.
2760 struct hash;
2761
2762 /// Enumerator Datum.
2763 class enumerator;
2764
2765 /// Convenience typedef for a list of @ref enumerator.
2766 typedef std::vector<enumerator> enumerators;
2767
2768 /// Constructor of an enum type declaration.
2769 ///
2770 /// @param name the name of the enum
2771 ///
2772 /// @param locus the locus at which the enum appears in the source
2773 /// code.
2774 ///
2775 /// @param underlying_type the underlying type of the enum
2776 ///
2777 /// @param enms a list of enumerators for this enum.
2778 ///
2779 /// @param mangled_name the mangled name of the enum type.
2780 ///
2781 /// @param vis the visibility of instances of this type.
2782 enum_type_decl(const string& name,
2783 const location& locus,
2784 type_base_sptr underlying_type,
2785 enumerators& enms,
2786 const string& mangled_name = "",
2787 visibility vis = VISIBILITY_DEFAULT);
2788
2789 type_base_sptr
2790 get_underlying_type() const;
2791
2792 const enumerators&
2793 get_enumerators() const;
2794
2795 const enumerators&
2796 get_sorted_enumerators() const;
2797
2800
2801 virtual string
2802 get_pretty_representation(bool internal = false,
2803 bool qualified_name = true) const;
2804
2805 virtual bool
2806 operator==(const decl_base&) const;
2807
2808 virtual bool
2809 operator==(const type_base&) const;
2810
2811 virtual bool
2813
2814 virtual ~enum_type_decl();
2815
2816 friend bool
2818 const enum_type_decl& r,
2819 change_kind* k);
2820}; // end class enum_type_decl
2821
2822bool
2824
2825bool
2827
2828bool
2830 const enum_type_decl& r,
2831 change_kind* k);
2832
2833/// The abstraction of an enumerator
2835{
2836 class priv;
2837 std::unique_ptr<priv> priv_;
2838
2839public:
2840
2841 enumerator();
2842
2843 ~enumerator();
2844
2845 enumerator(const string& name, int64_t value);
2846
2847 enumerator(const enumerator&);
2848
2849 enumerator&
2850 operator=(const enumerator&);
2851
2852 bool
2853 operator==(const enumerator& other) const;
2854
2855 bool
2856 operator!=(const enumerator& other) const;
2857
2858 const string&
2859 get_name() const;
2860
2861 const string&
2862 get_qualified_name(bool internal = false) const;
2863
2864 void
2865 set_name(const string& n);
2866
2867 int64_t
2868 get_value() const;
2869
2870 void
2871 set_value(int64_t v);
2872
2874 get_enum_type() const;
2875
2876 void
2878}; // end class enum_type_def::enumerator
2879
2880bool
2882 const enum_type_decl &enom);
2883
2884bool
2886
2887/// The abstraction of a typedef declaration.
2888class typedef_decl : public virtual type_base, public virtual decl_base
2889{
2890 struct priv;
2891 std::unique_ptr<priv> priv_;
2892
2893 // Forbidden
2894 typedef_decl();
2895
2896public:
2897
2898 /// Hasher for the typedef_decl type.
2899 struct hash;
2900
2901 typedef_decl(const string& name,
2902 const type_base_sptr underlying_type,
2903 const location& locus,
2904 const string& mangled_name = "",
2905 visibility vis = VISIBILITY_DEFAULT);
2906
2907 typedef_decl(const string& name,
2908 const environment& env,
2909 const location& locus,
2910 const string& mangled_name = "",
2911 visibility vis = VISIBILITY_DEFAULT);
2912
2913 virtual size_t
2914 get_size_in_bits() const;
2915
2916 virtual size_t
2917 get_alignment_in_bits() const;
2918
2919 virtual bool
2920 operator==(const decl_base&) const;
2921
2922 virtual bool
2923 operator==(const type_base&) const;
2924
2925 virtual string
2926 get_pretty_representation(bool internal = false,
2927 bool qualified_name = true) const;
2928
2929 type_base_sptr
2930 get_underlying_type() const;
2931
2932 void
2933 set_underlying_type(const type_base_sptr&);
2934
2935 virtual void
2936 get_qualified_name(interned_string& qualified_name,
2937 bool internal = false) const;
2938
2939 virtual const interned_string&
2940 get_qualified_name(bool internal = false) const;
2941
2942 virtual bool
2944
2945 virtual ~typedef_decl();
2946};// end class typedef_decl
2947
2948/// The abstraction for a data member context relationship. This
2949/// relates a data member to its parent class.
2950///
2951/// The relationship carries properties like the offset of the data
2952/// member, if applicable.
2954{
2955protected:
2956 struct priv;
2957 std::unique_ptr<priv> priv_;
2958
2959public:
2961
2963 bool is_laid_out,
2964 size_t offset_in_bits,
2966 bool is_static);
2967
2969
2970 bool
2971 get_is_laid_out() const;
2972
2973 void
2974 set_is_laid_out(bool f);
2975
2976 size_t
2977 get_offset_in_bits() const;
2978
2979 void
2980 set_offset_in_bits(size_t o);
2981
2982 const var_decl*
2984
2985 void
2987
2988 bool
2989 operator==(const dm_context_rel& o) const;
2990
2991 bool
2992 operator!=(const dm_context_rel& o) const;
2993
2994 virtual ~dm_context_rel();
2995};// end class class_decl::dm_context_rel
2996
2997bool
2998equals(const var_decl&, const var_decl&, change_kind*);
2999
3000bool
3002
3003bool
3005
3006/// Abstracts a variable declaration.
3007class var_decl : public virtual decl_base
3008{
3009 struct priv;
3010 std::unique_ptr<priv> priv_;
3011
3012 // Forbidden
3013 var_decl();
3014
3015 virtual void
3016 set_scope(scope_decl*);
3017
3018public:
3019
3020 /// Hasher for a var_decl type.
3021 struct hash;
3022
3023 /// Equality functor to compare pointers to variable_decl.
3024 struct ptr_equal;
3025
3026 var_decl(const string& name,
3027 type_base_sptr type,
3028 const location& locus,
3029 const string& mangled_name,
3030 visibility vis = VISIBILITY_DEFAULT,
3031 binding bind = BINDING_NONE);
3032
3033 virtual bool
3034 operator==(const decl_base&) const;
3035
3036 const type_base_sptr
3037 get_type() const;
3038
3039 void
3040 set_type(type_base_sptr&);
3041
3042 const type_base*
3043 get_naked_type() const;
3044
3045 binding
3046 get_binding() const;
3047
3048 void
3050
3051 void
3052 set_symbol(const elf_symbol_sptr& sym);
3053
3054 const elf_symbol_sptr&
3055 get_symbol() const;
3056
3058 clone() const;
3059
3061 get_id() const;
3062
3063 virtual const interned_string&
3064 get_qualified_name(bool internal = false) const;
3065
3066 virtual size_t
3067 get_hash() const;
3068
3069 virtual string
3070 get_pretty_representation(bool internal = false,
3071 bool qualified_name = true) const;
3072
3073 string
3074 get_anon_dm_reliable_name(bool qualified = true) const;
3075
3076 virtual bool
3078
3079 virtual ~var_decl();
3080
3081 friend void
3083
3084 friend uint64_t
3086
3087 friend uint64_t
3089
3090 friend uint64_t
3092
3093 friend uint64_t
3095
3096 friend void
3098
3099 friend bool
3101
3102 friend bool
3104}; // end class var_decl
3105
3106bool
3108
3109/// Abstraction for a function declaration.
3110class function_decl : public virtual decl_base
3111{
3112 struct priv;
3113 // This priv pointer is not handled by a shared_ptr because
3114 // accessing the data members of the priv struct for this
3115 // function_decl shows up on performance profiles when dealing with
3116 // big binaries with a lot of types; dereferencing the shared_ptr
3117 // involves locking of some sort and that is slower than just
3118 // dereferencing a pointer likere here. There are other types for
3119 // which the priv pointer is managed using shared_ptr just fine,
3120 // because those didn't show up during our performance profiling.
3121 priv* priv_;
3122
3123public:
3124 /// Hasher for function_decl
3125 struct hash;
3126
3127 /// Equality functor to compare pointers to function_decl
3128 struct ptr_equal;
3129
3130 /// Abstraction for the parameter of a function.
3131 class parameter;
3132
3133 /// Convenience typedef for a shared pointer on a @ref
3134 /// function_decl::parameter
3135 typedef shared_ptr<parameter> parameter_sptr;
3136
3137 /// Convenience typedef for a vector of @ref parameter_sptr
3138 typedef std::vector<parameter_sptr> parameters;
3139
3140 function_decl(const string& name,
3142 bool declared_inline,
3143 const location& locus,
3144 const string& mangled_name,
3145 visibility vis,
3146 binding bind);
3147
3148 function_decl(const string& name,
3149 type_base_sptr fn_type,
3150 bool declared_inline,
3151 const location& locus,
3152 const string& mangled_name = "",
3153 visibility vis = VISIBILITY_DEFAULT,
3154 binding bind = BINDING_GLOBAL);
3155
3156 virtual string
3157 get_pretty_representation(bool internal = false,
3158 bool qualified_name = true) const;
3159
3160 string
3161 get_pretty_representation_of_declarator (bool internal = false) const;
3162
3163 const std::vector<parameter_sptr >&
3164 get_parameters() const;
3165
3166 void
3168
3169 void
3170 append_parameters(std::vector<parameter_sptr >& parms);
3171
3172 parameters::const_iterator
3174
3175 const function_type_sptr
3176 get_type() const;
3177
3178 const function_type*
3179 get_naked_type() const;
3180
3181 const type_base_sptr
3182 get_return_type() const;
3183
3184 void
3185 set_type(const function_type_sptr& fn_type);
3186
3187 void
3188 set_symbol(const elf_symbol_sptr& sym);
3189
3190 const elf_symbol_sptr&
3191 get_symbol() const;
3192
3193 bool
3194 is_declared_inline() const;
3195
3196 binding
3197 get_binding() const;
3198
3200 clone() const;
3201
3202 virtual bool
3203 operator==(const decl_base& o) const;
3204
3205 /// Return true iff the function takes a variable number of
3206 /// parameters.
3207 ///
3208 /// @return true if the function taks a variable number
3209 /// of parameters.
3210 bool
3211 is_variadic() const;
3212
3213 virtual size_t
3214 get_hash() const;
3215
3217 get_id() const;
3218
3219 virtual bool
3221
3222 virtual ~function_decl();
3223}; // end class function_decl
3224
3225bool
3227
3228bool
3230
3231bool
3233
3234bool
3237 change_kind*);
3238
3239/// A comparison functor to compare pointer to instances of @ref
3240/// type_or_decl_base.
3242{
3243 /// Comparison operator for ABI artifacts.
3244 ///
3245 /// @param f the first ABI artifact to consider for the comparison.
3246 ///
3247 /// @param s the second ABI artifact to consider for the comparison.
3248 ///
3249 /// @return true iff @p f is lexicographically less than than @p s.
3250 bool
3252 const type_or_decl_base *s)
3253 {
3254 function_decl *f_fn = is_function_decl(f), *s_fn = is_function_decl(s);
3255 if (f_fn && s_fn)
3256 return function_decl_is_less_than(*f_fn, *s_fn);
3257
3258 var_decl *f_var = is_var_decl(f), *s_var = is_var_decl(s);
3259 if (f_var && s_var)
3260 return get_name(f_var) < get_name(s_var);
3261
3262 string l_repr = get_pretty_representation(f),
3263 r_repr = get_pretty_representation(s);
3264
3265 return l_repr < r_repr;
3266 }
3267
3268 /// Comparison operator for ABI artifacts.
3269 ///
3270 /// @param f the first ABI artifact to consider for the comparison.
3271 ///
3272 /// @param s the second ABI artifact to consider for the comparison.
3273 ///
3274 /// @return true iff @p f is lexicographically less than than @p s.
3275 bool
3277 const type_or_decl_base_sptr& s)
3278 {return operator()(f.get(), s.get());}
3279}; // end struct type_or_decl_base_comp
3280
3281/// Abstraction of a function parameter.
3283{
3284 struct priv;
3285 std::unique_ptr<priv> priv_;
3286
3287public:
3288
3289 /// Hasher for an instance of function::parameter
3290 struct hash;
3291
3292 parameter(const type_base_sptr type,
3293 unsigned index,
3294 const string& name,
3295 const location& loc,
3296 bool variadic_marker = false);
3297
3298 parameter(const type_base_sptr type,
3299 unsigned index,
3300 const string& name,
3301 const location& loc,
3302 bool variadic_marker,
3303 bool is_artificial);
3304
3305 parameter(const type_base_sptr type,
3306 const string& name,
3307 const location& loc,
3308 bool variadic_marker = false,
3309 bool is_artificial = false);
3310
3311 parameter(const type_base_sptr type,
3312 unsigned index = 0,
3313 bool variadic_marker = false);
3314
3315 virtual ~parameter();
3316
3317 const type_base_sptr
3318 get_type()const;
3319
3321 get_type_name() const;
3322
3323 const string
3325
3327 get_name_id() const;
3328
3329 unsigned
3330 get_index() const;
3331
3332 void
3333 set_index(unsigned i);
3334
3335 bool
3336 get_variadic_marker() const;
3337
3338 bool
3339 operator==(const parameter& o) const;
3340
3341 virtual bool
3342 operator==(const decl_base&) const;
3343
3344 virtual bool
3346
3347 virtual size_t
3348 get_hash() const;
3349
3350 virtual void
3351 get_qualified_name(interned_string& qualified_name,
3352 bool internal = false) const;
3353
3354 virtual string
3355 get_pretty_representation(bool internal = false,
3356 bool qualified_name = true) const;
3357}; // end class function_decl::parameter
3358
3359bool
3362
3363/// A hashing functor for a function_decl::parameter.
3365{
3366 size_t
3367 operator()(const function_decl::parameter&) const;
3368
3369 size_t
3370 operator()(const function_decl::parameter*) const;
3371
3372 size_t
3373 operator()(const function_decl::parameter_sptr) const;
3374}; // end struct function_decl::parameter::hash
3375
3378
3381
3382bool
3384
3385/// Abstraction of a function type.
3386class function_type : public virtual type_base
3387{
3388protected:
3389 virtual void on_canonical_type_set();
3390
3391public:
3392 /// Hasher for an instance of function_type
3393 struct hash;
3394
3395 /// Convenience typedef for a shared pointer on a @ref
3396 /// function_decl::parameter
3397 typedef shared_ptr<function_decl::parameter> parameter_sptr;
3398 /// Convenience typedef for a vector of @ref parameter_sptr
3399 typedef std::vector<parameter_sptr> parameters;
3400
3401 struct priv;
3402 std::unique_ptr<priv> priv_;
3403
3404private:
3405 function_type();
3406
3407public:
3408
3409 function_type(type_base_sptr return_type,
3410 const parameters& parms,
3411 size_t size_in_bits,
3412 size_t alignment_in_bits);
3413
3414 function_type(type_base_sptr return_type,
3415 size_t size_in_bits,
3416 size_t alignment_in_bits);
3417
3418 function_type(const environment& env,
3419 size_t size_in_bits,
3420 size_t alignment_in_bits);
3421
3422 type_base_sptr
3423 get_return_type() const;
3424
3425 void
3426 set_return_type(type_base_sptr t);
3427
3428 const parameters&
3429 get_parameters() const;
3430
3431 const parameter_sptr
3433
3434 void
3435 set_parameters(const parameters &p);
3436
3437 void
3439
3440 bool
3441 is_variadic() const;
3442
3443 parameters::const_iterator
3445
3446 parameters::const_iterator
3447 get_first_parm() const;
3448
3449 const interned_string&
3450 get_cached_name(bool internal = false) const;
3451
3452 virtual bool
3453 operator==(const type_base&) const;
3454
3455 virtual string
3456 get_pretty_representation(bool internal = false,
3457 bool qualified_name = true) const;
3458
3459 virtual bool
3461
3462 virtual ~function_type();
3463
3464 friend bool
3466};//end class function_type
3467
3468/// The hashing functor for @ref function_type.
3470{
3471 size_t
3472 operator()(const function_type& t) const;
3473
3474 size_t
3475 operator()(const function_type* t) const;
3476
3477 size_t
3478 operator()(const function_type_sptr t) const;
3479};// end struct function_type::hash
3480
3481/// Abstracts the type of a class member function.
3483{
3484 struct priv;
3485 std::unique_ptr<priv> priv_;
3486
3487 method_type();
3488
3489public:
3490
3491 /// Hasher for intances of method_type
3492 struct hash;
3493
3494 method_type(type_base_sptr return_type,
3495 class_or_union_sptr class_type,
3496 const std::vector<function_decl::parameter_sptr>& parms,
3497 bool is_const,
3498 size_t size_in_bits,
3499 size_t alignment_in_bits);
3500
3501 method_type(type_base_sptr return_type,
3502 type_base_sptr class_type,
3503 const std::vector<function_decl::parameter_sptr>& parms,
3504 bool is_const,
3505 size_t size_in_bits,
3506 size_t alignment_in_bits);
3507
3508 method_type(class_or_union_sptr class_type,
3509 bool is_const,
3510 size_t size_in_bits,
3511 size_t alignment_in_bits);
3512
3513 method_type(const environment& env,
3514 size_t size_in_bits,
3515 size_t alignment_in_bits);
3516
3517 class_or_union_sptr
3518 get_class_type() const;
3519
3520 void
3521 set_class_type(const class_or_union_sptr& t);
3522
3523 void set_is_const(bool);
3524
3525 bool get_is_const() const;
3526
3527 virtual ~method_type();
3528
3529 virtual string
3530 get_pretty_representation(bool internal = false,
3531 bool qualified_name = true) const;
3532
3533 friend interned_string
3534 get_method_type_name(const method_type& fn_type, bool internal);
3535};// end class method_type.
3536
3537/// The base class of templates.
3538class template_decl : public virtual decl_base
3539{
3540 class priv;
3541 std::unique_ptr<priv> priv_;
3542
3543 template_decl();
3544
3545public:
3546
3547 /// Hasher.
3548 struct hash;
3549
3550 template_decl(const environment& env,
3551 const string& name,
3552 const location& locus,
3553 visibility vis = VISIBILITY_DEFAULT);
3554
3555 void
3557
3558 const std::list<template_parameter_sptr>&
3560
3561 virtual bool
3562 operator==(const decl_base& o) const;
3563
3564 virtual bool
3565 operator==(const template_decl& o) const;
3566
3567 virtual ~template_decl();
3568};//end class template_decl
3569
3570/// Base class for a template parameter. Client code should use the
3571/// more specialized type_template_parameter,
3572/// non_type_template_parameter and template_template_parameter below.
3574{
3575 class priv;
3576 std::unique_ptr<priv> priv_;
3577
3578 // Forbidden
3580
3581 public:
3582
3583 /// Hashers.
3584 struct hash;
3585 struct dynamic_hash;
3586 struct shared_ptr_hash;
3587
3588 template_parameter(unsigned index,
3589 template_decl_sptr enclosing_tdecl);
3590
3591 virtual bool
3592 operator==(const template_parameter&) const;
3593
3594 bool
3595 operator!=(const template_parameter&) const;
3596
3597 unsigned
3598 get_index() const;
3599
3600 const template_decl_sptr
3601 get_enclosing_template_decl() const;
3602
3603 bool
3604 get_hashing_has_started() const;
3605
3606 void
3607 set_hashing_has_started(bool f) const;
3608
3609 virtual ~template_parameter();
3610};//end class template_parameter
3611
3613{
3614 size_t
3615 operator()(const template_decl& t) const;
3616};// end struct template_decl::hash
3617
3618/// Abstracts a type template parameter.
3619class type_tparameter : public template_parameter, public virtual type_decl
3620{
3621 class priv;
3622 std::unique_ptr<priv> priv_;
3623
3624 // Forbidden
3626
3627public:
3628
3629 /// Hasher.
3630 struct hash;
3631
3632 type_tparameter(unsigned index,
3633 template_decl_sptr enclosing_tdecl,
3634 const string& name,
3635 const location& locus);
3636
3637 virtual bool
3638 operator==(const type_base&) const;
3639
3640 virtual bool
3641 operator==(const type_decl&) const;
3642
3643 virtual bool
3644 operator==(const decl_base&) const;
3645
3646 virtual bool
3647 operator==(const template_parameter&) const;
3648
3649 virtual bool
3650 operator==(const type_tparameter&) const;
3651
3652 virtual ~type_tparameter();
3653};// end class type_tparameter.
3654
3655/// Abstracts non type template parameters.
3657{
3658 class priv;
3659 std::unique_ptr<priv> priv_;
3660
3661 type_base_wptr type_;
3662
3663 // Forbidden
3665
3666public:
3667 /// Hasher.
3668 struct hash;
3669
3670 non_type_tparameter(unsigned index,
3671 template_decl_sptr enclosing_tdecl,
3672 const string& name,
3673 type_base_sptr type,
3674 const location& locus);
3675 virtual size_t
3676 get_hash() const;
3677
3678 virtual bool
3679 operator==(const decl_base&) const;
3680
3681 virtual bool
3682 operator==(const template_parameter&) const;
3683
3684 const type_base_sptr
3685 get_type() const;
3686
3687 virtual ~non_type_tparameter();
3688};// end class non_type_tparameter
3689
3690/// Hasher for the @ref non_type_tparameter type.
3692{
3693 size_t
3694 operator()(const non_type_tparameter& t) const;
3695
3696 size_t
3697 operator()(const non_type_tparameter* t) const;
3698};
3699
3701
3702/// Abstracts a template template parameter.
3704{
3705 class priv;
3706 std::unique_ptr<priv> priv_;
3707
3708 // Forbidden
3710
3711public:
3712
3713 /// A hasher for instances of template_tparameter
3714 struct hash;
3715
3716 template_tparameter(unsigned index,
3717 template_decl_sptr enclosing_tdecl,
3718 const string& name,
3719 const location& locus);
3720
3721 virtual bool
3722 operator==(const type_base&) const;
3723
3724 virtual bool
3725 operator==(const decl_base&) const;
3726
3727 virtual bool
3728 operator==(const template_parameter&) const;
3729
3730 virtual bool
3731 operator==(const template_decl&) const;
3732
3733 virtual ~template_tparameter();
3734};
3735
3736/// This abstracts a composition of types based on template type
3737/// parameters. The result of the composition is a type that can be
3738/// referred to by a template non-type parameter. Instances of this
3739/// type can appear at the same level as template parameters, in the
3740/// scope of a template_decl.
3741class type_composition : public template_parameter, public virtual decl_base
3742{
3743 class priv;
3744 std::unique_ptr<priv> priv_;
3745
3747
3748public:
3749 struct hash;
3750
3751 type_composition(unsigned index,
3752 template_decl_sptr tdecl,
3753 type_base_sptr composed_type);
3754
3755 const type_base_sptr
3756 get_composed_type() const;
3757
3758 void
3759 set_composed_type(type_base_sptr t);
3760
3761 virtual size_t
3762 get_hash() const;
3763
3764 virtual ~type_composition();
3765};
3766
3767/// Hasher for the @ref type_composition type.
3769{
3770 size_t
3771 operator()(const type_composition& t) const;
3772
3773 size_t
3774 operator()(const type_composition* t) const;
3775
3776}; //struct type_composition::hash
3777
3778/// Abstract a function template declaration.
3780{
3781 class priv;
3782 std::unique_ptr<priv> priv_;
3783
3784 // Forbidden
3786
3787public:
3788
3789 /// Hash functor for function templates.
3790 struct hash;
3791 struct shared_ptr_hash;
3792
3793 function_tdecl(const environment& env,
3794 const location& locus,
3795 visibility vis = VISIBILITY_DEFAULT,
3796 binding bind = BINDING_NONE);
3797
3799 const location& locus,
3800 visibility vis = VISIBILITY_DEFAULT,
3801 binding bind = BINDING_NONE);
3802
3803 virtual bool
3804 operator==(const decl_base&) const;
3805
3806 virtual bool
3807 operator==(const template_decl&) const;
3808
3809 virtual bool
3810 operator==(const function_tdecl&) const;
3811
3812 void
3813 set_pattern(shared_ptr<function_decl> p);
3814
3815 shared_ptr<function_decl>
3816 get_pattern() const;
3817
3818 binding
3819 get_binding() const;
3820
3821 virtual bool
3823
3824 virtual ~function_tdecl();
3825}; // end class function_tdecl.
3826
3827/// Abstract a class template.
3829{
3830 class priv;
3831 std::unique_ptr<priv> priv_;
3832
3833 // Forbidden
3834 class_tdecl();
3835
3836public:
3837
3838 /// Hashers.
3839 struct hash;
3840 struct shared_ptr_hash;
3841
3842 class_tdecl(const environment& env, const location& locus,
3843 visibility vis = VISIBILITY_DEFAULT);
3844
3846 const location& locus,
3847 visibility vis = VISIBILITY_DEFAULT);
3848
3849 virtual bool
3850 operator==(const decl_base&) const;
3851
3852 virtual bool
3853 operator==(const template_decl&) const;
3854
3855 virtual bool
3856 operator==(const class_tdecl&) const;
3857
3858 void
3860
3861 shared_ptr<class_decl>
3862 get_pattern() const;
3863
3864 virtual bool
3866
3867 virtual ~class_tdecl();
3868};// end class class_tdecl
3869
3870/// The base class for member types, data members and member
3871/// functions. Its purpose is mainly to carry the access specifier
3872/// (and possibly other properties that might be shared by all class
3873/// members) for the member.
3875{
3876protected:
3877 enum access_specifier access_;
3878 bool is_static_;
3879
3880private:
3881 // Forbidden
3882 member_base();
3883
3884public:
3885 /// Hasher.
3886 struct hash;
3887
3888 member_base(access_specifier a, bool is_static = false)
3889 : access_(a), is_static_(is_static)
3890 {}
3891
3892 /// Getter for the access specifier of this member.
3893 ///
3894 /// @return the access specifier for this member.
3897 {return access_;}
3898
3899 /// Setter for the access specifier of this member.
3900 ///
3901 /// @param a the new access specifier.
3902 void
3904 {access_ = a;}
3905
3906 /// @return true if the member is static, false otherwise.
3907 bool
3909 {return is_static_;}
3910
3911 /// Set a flag saying if the parameter is static or not.
3912 ///
3913 /// @param f set to true if the member is static, false otherwise.
3914 void
3916 {is_static_ = f;}
3917
3918 virtual bool
3919 operator==(const member_base& o) const;
3920};// end class member_base
3921
3922/// Abstraction of the declaration of a method.
3924{
3925 method_decl();
3926
3927 virtual void
3928 set_scope(scope_decl*);
3929
3930public:
3931
3932 method_decl(const string& name, method_type_sptr type,
3933 bool declared_inline, const location& locus,
3934 const string& mangled_name = "",
3935 visibility vis = VISIBILITY_DEFAULT,
3936 binding bind = BINDING_GLOBAL);
3937
3938 method_decl(const string& name,
3939 function_type_sptr type,
3940 bool declared_inline,
3941 const location& locus,
3942 const string& mangled_name = "",
3943 visibility vis = VISIBILITY_DEFAULT,
3944 binding bind = BINDING_GLOBAL);
3945
3946 method_decl(const string& name, type_base_sptr type,
3947 bool declared_inline, const location& locus,
3948 const string& mangled_name = "",
3949 visibility vis = VISIBILITY_DEFAULT,
3950 binding bind = BINDING_GLOBAL);
3951
3952 virtual void
3953 set_linkage_name(const string&);
3954
3955 /// @return the type of the current instance of the
3956 /// method_decl.
3957 const method_type_sptr
3958 get_type() const;
3959
3960 void
3961 set_type(const method_type_sptr fn_type)
3962 {function_decl::set_type(fn_type);}
3963
3964 friend bool
3966
3967 friend void
3969
3970 friend void
3972
3973 friend bool
3975
3976 friend void
3978
3979 friend void
3981
3982 friend bool
3983 get_member_function_is_static(const function_decl&);
3984
3985 friend void
3986 set_member_function_is_static(const function_decl&, bool);
3987
3988 friend bool
3990
3991 friend void
3993
3994 friend void
3996
3997 friend bool
3999
4000 friend ssize_t
4002
4003 friend void
4005
4006 friend void
4008
4009 friend bool
4011
4012 friend void
4014
4015 virtual ~method_decl();
4016};// end class method_decl
4017
4018bool
4019operator==(const method_decl_sptr& l, const method_decl_sptr& r);
4020
4021bool
4022operator!=(const method_decl_sptr& l, const method_decl_sptr& r);
4023
4024/// The base type of @ref class_decl and @ref union_decl
4026{
4027public:
4028 struct priv;
4029 priv *priv_;
4030
4031private:
4032 // Forbidden
4034
4035protected:
4036
4037 virtual decl_base_sptr
4038 add_member_decl(const decl_base_sptr&);
4039
4040 decl_base_sptr
4041 insert_member_decl(decl_base_sptr member);
4042
4043 virtual void
4044 remove_member_decl(decl_base_sptr);
4045
4046 void
4048
4049public:
4050 /// Hasher.
4051 struct hash;
4052
4053 /// Convenience typedef
4054 /// @{
4055 typedef vector<type_base_sptr> member_types;
4056 typedef vector<var_decl_sptr> data_members;
4057 typedef vector<method_decl_sptr> member_functions;
4058 typedef unordered_map<ssize_t, member_functions> virtual_mem_fn_map_type;
4059 typedef unordered_map<string, method_decl*> string_mem_fn_ptr_map_type;
4060 typedef unordered_map<string, method_decl_sptr> string_mem_fn_sptr_map_type;
4061 /// @}
4062
4063 class_or_union(const environment& env, const string& name,
4064 size_t size_in_bits, size_t align_in_bits,
4065 const location& locus, visibility vis,
4066 member_types& mbrs, data_members& data_mbrs,
4067 member_functions& member_fns);
4068
4069 class_or_union(const environment& env, const string& name,
4070 size_t size_in_bits, size_t align_in_bits,
4071 const location& locus, visibility vis);
4072
4073 class_or_union(const environment& env, const string& name,
4074 bool is_declaration_only = true);
4075
4076 virtual void
4077 set_size_in_bits(size_t);
4078
4079 virtual size_t
4080 get_size_in_bits() const;
4081
4082 virtual size_t
4083 get_alignment_in_bits() const;
4084
4085 virtual void
4086 set_alignment_in_bits(size_t);
4087
4088 virtual size_t
4090
4091 virtual size_t
4093
4094 virtual size_t
4096
4097 void
4099 bool is_laid_out, bool is_static,
4100 size_t offset_in_bits);
4101
4102 const data_members&
4103 get_data_members() const;
4104
4105 const var_decl_sptr
4106 find_data_member(const string&) const;
4107
4108 const var_decl_sptr
4109 find_data_member(const var_decl_sptr&) const;
4110
4111 const var_decl_sptr
4113
4114 const data_members&
4116
4117 void
4118 add_member_function(method_decl_sptr f,
4120 bool is_static, bool is_ctor,
4121 bool is_dtor, bool is_const);
4122
4123 void
4124 add_member_function(method_decl_sptr f,
4126 bool is_virtual,
4127 size_t vtable_offset,
4128 bool is_static, bool is_ctor,
4129 bool is_dtor, bool is_const);
4130
4131 const member_functions&
4132 get_member_functions() const;
4133
4134 const method_decl*
4135 find_member_function(const string& mangled_name) const;
4136
4138 find_member_function(const string& mangled_name);
4139
4140 method_decl_sptr
4141 find_member_function_sptr(const string& mangled_name);
4142
4143 const method_decl*
4144 find_member_function_from_signature(const string& s) const;
4145
4147 find_member_function_from_signature(const string& s);
4148
4149 void
4150 add_member_function_template(member_function_template_sptr);
4151
4152 const member_function_templates&
4154
4155 void
4156 add_member_class_template(member_class_template_sptr m);
4157
4158 const member_class_templates&
4160
4161 bool
4162 has_no_member() const;
4163
4164 virtual bool
4165 operator==(const decl_base&) const;
4166
4167 virtual bool
4168 operator==(const type_base&) const;
4169
4170 virtual bool
4171 operator==(const class_or_union&) const;
4172
4173 virtual bool
4175
4176 virtual ~class_or_union();
4177
4178 friend method_decl_sptr
4179 copy_member_function(class_or_union_sptr& t,
4180 const method_decl*m);
4181
4182 friend method_decl_sptr
4183 copy_member_function(class_or_union_sptr& t,
4184 const method_decl_sptr& m);
4185
4186 friend void
4187 fixup_virtual_member_function(method_decl_sptr method);
4188
4189 friend void
4190 set_member_is_static(decl_base& d, bool s);
4191
4192 friend bool
4194
4195 friend bool
4196 equals(const class_decl&, const class_decl&, change_kind*);
4197
4198 friend class method_decl;
4199 friend class class_decl;
4200}; // end class class_or_union
4201
4202method_decl_sptr
4203copy_member_function(const class_or_union_sptr& clazz,
4204 const method_decl_sptr& f);
4205
4206method_decl_sptr
4207copy_member_function(const class_or_union_sptr& clazz,
4208 const method_decl* f);
4209
4210bool
4211operator==(const class_or_union_sptr& l, const class_or_union_sptr& r);
4212
4213bool
4214operator!=(const class_or_union_sptr& l, const class_or_union_sptr& r);
4215
4216/// Hasher for the @ref class_or_union type
4218{
4219 size_t
4220 operator()(const class_or_union& t) const;
4221
4222 size_t
4223 operator()(const class_or_union* t) const;
4224}; // end struct class_decl::hash
4225
4226/// Abstracts a class declaration.
4228{
4229 // Forbidden
4230 class_decl();
4231
4232protected:
4233
4234 decl_base_sptr
4235 insert_member_decl(decl_base_sptr member);
4236
4237public:
4238 /// Hasher.
4239 struct hash;
4240
4241 /// Forward declarations.
4242 class base_spec;
4243
4244 /// Convenience typedef
4245 /// @{
4246 typedef shared_ptr<base_spec> base_spec_sptr;
4247 typedef vector<base_spec_sptr> base_specs;
4248
4249 /// @}
4250
4251protected:
4252 virtual void
4254
4255private:
4256 struct priv;
4257 // This priv it's not handled by a shared_ptr because accessing the
4258 // data members of the priv struct for this class_decl shows up on
4259 // performance profiles when dealing with big binaries with a lot of
4260 // types; dereferencing the shared_ptr involves locking of some sort
4261 // and that is slower than just dereferencing a pointer likere here.
4262 // There are other types for which the priv pointer is managed using
4263 // shared_ptr just fine, because those didn't show up during our
4264 // performance profiling.
4265 priv * priv_;
4266
4267public:
4268
4269 class_decl(const environment& env, const string& name,
4270 size_t size_in_bits, size_t align_in_bits,
4271 bool is_struct, const location& locus,
4272 visibility vis, base_specs& bases,
4273 member_types& mbrs, data_members& data_mbrs,
4274 member_functions& member_fns);
4275
4276 class_decl(const environment& env, const string& name,
4277 size_t size_in_bits, size_t align_in_bits,
4278 bool is_struct, const location& locus,
4279 visibility vis, base_specs& bases,
4280 member_types& mbrs, data_members& data_mbrs,
4281 member_functions& member_fns, bool is_anonymous);
4282
4283 class_decl(const environment& env, const string& name,
4284 size_t size_in_bits, size_t align_in_bits,
4285 bool is_struct, const location& locus, visibility vis);
4286
4287 class_decl(const environment& env, const string& name,
4288 size_t size_in_bits, size_t align_in_bits,
4289 bool is_struct, const location& locus,
4290 visibility vis, bool is_anonymous);
4291
4292 class_decl(const environment& env, const string& name, bool is_struct,
4293 bool is_declaration_only = true);
4294
4295 virtual string
4296 get_pretty_representation(bool internal = false,
4297 bool qualified_name = true) const;
4298
4299 void
4300 is_struct(bool f);
4301
4302 bool
4303 is_struct() const;
4304
4305 void
4306 add_base_specifier(shared_ptr<base_spec> b);
4307
4308 const base_specs&
4309 get_base_specifiers() const;
4310
4312 find_base_class(const string&) const;
4313
4314 const member_functions&
4315 get_virtual_mem_fns() const;
4316
4319
4320 void
4322
4323 bool
4324 has_no_base_nor_member() const;
4325
4326 bool
4328
4329 bool
4330 has_virtual_bases() const;
4331
4332 bool
4333 has_vtable() const;
4334
4335 ssize_t
4337
4338 virtual size_t
4339 get_hash() const;
4340
4341 virtual bool
4342 operator==(const decl_base&) const;
4343
4344 virtual bool
4345 operator==(const type_base&) const;
4346
4347 virtual bool
4348 operator==(const class_or_union&) const;
4349
4350 virtual bool
4351 operator==(const class_decl&) const;
4352
4353 virtual bool
4355
4356 virtual ~class_decl();
4357
4358 friend void
4359 fixup_virtual_member_function(method_decl_sptr method);
4360
4361 friend void
4362 set_member_is_static(decl_base& d, bool s);
4363
4364 friend bool
4365 equals(const class_decl&, const class_decl&, change_kind*);
4366
4367 friend class method_decl;
4368 friend class class_or_union;
4369};// end class class_decl
4370
4371bool
4372equals(const class_decl&, const class_decl&, change_kind*);
4373
4374method_decl_sptr
4376 const method_decl_sptr& f);
4377
4378method_decl_sptr
4380 const method_decl* f);
4381void
4382fixup_virtual_member_function(method_decl_sptr method);
4383
4384/// Hasher for the @ref class_decl type
4386{
4387 size_t
4388 operator()(const class_decl& t) const;
4389
4390 size_t
4391 operator()(const class_decl* t) const;
4392}; // end struct class_decl::hash
4393
4396
4398get_member_access_specifier(const decl_base_sptr&);
4399
4400void
4403
4404void
4405set_member_access_specifier(const decl_base_sptr&,
4407
4408std::ostream&
4409operator<<(std::ostream&, access_specifier);
4410
4411bool
4412operator==(const class_decl_sptr& l, const class_decl_sptr& r);
4413
4414bool
4415operator!=(const class_decl_sptr& l, const class_decl_sptr& r);
4416
4417bool
4419 const class_decl::base_spec&,
4420 change_kind*);
4421
4422/// Abstraction of a base specifier in a class declaration.
4424 public virtual decl_base
4425{
4426 struct priv;
4427 std::unique_ptr<priv> priv_;
4428
4429 // Forbidden
4430 base_spec();
4431
4432public:
4433
4434 /// Hasher.
4435 struct hash;
4436
4438 long offset_in_bits = -1, bool is_virtual = false);
4439
4440 base_spec(const type_base_sptr& base, access_specifier a,
4441 long offset_in_bits = -1, bool is_virtual = false);
4442
4443 virtual ~base_spec();
4444
4446 get_base_class() const;
4447
4448 bool
4449 get_is_virtual() const;
4450
4451 long
4452 get_offset_in_bits() const;
4453
4454 virtual bool
4455 operator==(const decl_base&) const;
4456
4457 virtual bool
4458 operator==(const member_base&) const;
4459
4460 virtual size_t
4461 get_hash() const;
4462
4463 virtual bool
4465};// end class class_decl::base_spec
4466
4467bool
4470
4471bool
4474
4477
4480
4481/// Abstracts a union type declaration.
4483{
4484 // Forbid
4485 union_decl();
4486
4487public:
4488
4489 union_decl(const environment& env, const string& name,
4490 size_t size_in_bits, const location& locus,
4491 visibility vis, member_types& mbrs,
4492 data_members& data_mbrs, member_functions& member_fns);
4493
4494 union_decl(const environment& env, const string& name,
4495 size_t size_in_bits, const location& locus,
4496 visibility vis, member_types& mbrs,
4497 data_members& data_mbrs, member_functions& member_fns,
4498 bool is_anonymous);
4499
4500 union_decl(const environment& env, const string& name,
4501 size_t size_in_bits, const location& locus,
4502 visibility vis);
4503
4504 union_decl(const environment& env, const string& name,
4505 size_t size_in_bits, const location& locus,
4506 visibility vis, bool is_anonymous);
4507
4508 union_decl(const environment& env, const string& name,
4509 bool is_declaration_only = true);
4510
4511 virtual string
4512 get_pretty_representation(bool internal = false,
4513 bool qualified_name = true) const;
4514
4515 virtual bool
4516 operator==(const decl_base&) const;
4517
4518 virtual bool
4519 operator==(const type_base&) const;
4520
4521 virtual bool
4522 operator==(const class_or_union&) const;
4523
4524 virtual bool
4525 operator==(const union_decl&) const;
4526
4527 virtual bool
4529
4530 virtual ~union_decl();
4531}; // union_decl
4532
4533bool
4534equals(const union_decl&, const union_decl&, change_kind*);
4535
4536method_decl_sptr
4537copy_member_function(const union_decl_sptr& union_type,
4538 const method_decl_sptr& f);
4539
4540method_decl_sptr
4541copy_member_function(const union_decl_sptr& union_type,
4542 const method_decl* f);
4543
4544bool
4545operator==(const union_decl_sptr& l, const union_decl_sptr& r);
4546
4547bool
4548operator!=(const union_decl_sptr& l, const union_decl_sptr& r);
4549
4550/// Abstraction of a member function context relationship. This
4551/// relates a member function to its parent class.
4553{
4554protected:
4555 bool is_virtual_;
4556 ssize_t vtable_offset_in_bits_;
4557 bool is_constructor_;
4558 bool is_destructor_;
4559 bool is_const_;
4560
4561public:
4563 : context_rel(),
4564 is_virtual_(false),
4565 vtable_offset_in_bits_(-1),
4566 is_constructor_(false),
4567 is_destructor_(false),
4568 is_const_(false)
4569 {}
4570
4572 : context_rel(s),
4573 is_virtual_(false),
4574 vtable_offset_in_bits_(-1),
4575 is_constructor_(false),
4576 is_destructor_(false),
4577 is_const_(false)
4578 {}
4579
4581 bool is_constructor,
4582 bool is_destructor,
4583 bool is_const,
4584 bool is_virtual,
4585 size_t vtable_offset_in_bits,
4586 access_specifier access,
4587 bool is_static)
4588 : context_rel(s, access, is_static),
4589 is_virtual_(is_virtual),
4590 vtable_offset_in_bits_(vtable_offset_in_bits),
4591 is_constructor_(is_constructor),
4592 is_destructor_(is_destructor),
4593 is_const_(is_const)
4594 {}
4595
4596 bool
4597 is_virtual() const
4598 {return is_virtual_;}
4599
4600 void
4601 is_virtual(bool is_virtual)
4602 {is_virtual_ = is_virtual;}
4603
4604 /// Getter for the vtable offset property.
4605 ///
4606 /// This is the vtable offset of the member function of this
4607 /// relation.
4608 ///
4609 /// @return the vtable offset property of the relation.
4610 size_t
4612 {return vtable_offset_in_bits_;}
4613
4614 /// Setter for the vtable offset property.
4615 ///
4616 /// This is the vtable offset of the member function of this
4617 /// relation.
4618 ///
4619 /// @partam s the new vtable offset.
4620 void
4622 {vtable_offset_in_bits_ = s;}
4623
4624 /// Getter for the 'is-constructor' property.
4625 ///
4626 /// This tells if the member function of this relation is a
4627 /// constructor.
4628 ///
4629 /// @return the is-constructor property of the relation.
4630 bool
4632 {return is_constructor_;}
4633
4634 /// Setter for the 'is-constructor' property.
4635 ///
4636 /// @param f the new value of the the property. Is true if this is
4637 /// for a constructor, false otherwise.
4638 void
4640 {is_constructor_ = f;}
4641
4642 /// Getter for the 'is-destructor' property.
4643 ///
4644 /// Tells if the member function of this relation is a destructor.
4645 ///
4646 /// @return the is-destructor property of the relation;
4647 bool
4649 {return is_destructor_;}
4650
4651 /// Setter for the 'is-destructor' property.
4652 ///
4653 /// @param f the new value of the property. Is true if this is for
4654 /// a destructor, false otherwise.
4655 void
4657 {is_destructor_ = f;}
4658
4659 /// Getter for the 'is-const' property.
4660 ///
4661 /// Tells if the member function of this relation is a const member
4662 /// function.
4663 ///
4664 /// @return the 'is-const' property of the relation.
4665 bool
4666 is_const() const
4667 {return is_const_;}
4668
4669 /// Setter for the 'is-const' property.
4670 ///
4671 /// @param f the new value of the property. Is true if this is for
4672 /// a const entity, false otherwise.
4673 void
4674 is_const(bool f)
4675 {is_const_ = f;}
4676
4677 virtual ~mem_fn_context_rel();
4678}; // end class mem_fn_context_rel
4679
4682
4685
4686method_decl_sptr
4688
4689const var_decl*
4690lookup_data_member(const type_base* type,
4691 const char* dm_name);
4692
4693const var_decl_sptr
4694lookup_data_member(const type_base_sptr& type,
4695 const var_decl_sptr& dm);
4696
4699 unsigned parm_num);
4700
4701/// Abstract a member function template.
4702class member_function_template : public member_base, public virtual decl_base
4703{
4704 bool is_constructor_;
4705 bool is_const_;
4706 shared_ptr<function_tdecl> fn_tmpl_;
4707
4708 // Forbiden
4710
4711public:
4712 /// Hasher.
4713 struct hash;
4714
4716 access_specifier access, bool is_static,
4717 bool is_constructor, bool is_const)
4718 : type_or_decl_base(f->get_environment()),
4719 decl_base(f->get_environment(), f->get_name(), location()),
4720 member_base(access, is_static), is_constructor_(is_constructor),
4721 is_const_(is_const), fn_tmpl_(f)
4722 {}
4723
4724 bool
4725 is_constructor() const
4726 {return is_constructor_;}
4727
4728 bool
4729 is_const() const
4730 {return is_const_;}
4731
4732 operator const function_tdecl& () const
4733 {return *fn_tmpl_;}
4734
4736 as_function_tdecl() const
4737 {return fn_tmpl_;}
4738
4739 virtual bool
4740 operator==(const member_base& o) const;
4741
4742 virtual bool
4744};// end class member_function_template
4745
4746bool
4747operator==(const member_function_template_sptr& l,
4748 const member_function_template_sptr& r);
4749
4750bool
4751operator!=(const member_function_template_sptr& l,
4752 const member_function_template_sptr& r);
4753
4754/// Abstracts a member class template template
4756 : public member_base,
4757 public virtual decl_base
4758{
4759 shared_ptr<class_tdecl> class_tmpl_;
4760
4761 // Forbidden
4763
4764public:
4765
4766 /// Hasher.
4767 struct hash;
4768
4770 access_specifier access, bool is_static)
4771 : type_or_decl_base(c->get_environment()),
4772 decl_base(c->get_environment(), c->get_name(), location()),
4773 member_base(access, is_static),
4774 class_tmpl_(c)
4775 {}
4776
4777 operator const class_tdecl& () const
4778 { return *class_tmpl_; }
4779
4781 as_class_tdecl() const
4782 {return class_tmpl_;}
4783
4784 virtual bool
4785 operator==(const member_base& o) const;
4786
4787 virtual bool
4788 operator==(const decl_base&) const;
4789
4790 virtual bool
4791 operator==(const member_class_template&) const;
4792
4793 virtual bool
4795};// end class member_class_template
4796
4797bool
4798operator==(const member_class_template_sptr& l,
4799 const member_class_template_sptr& r);
4800
4801bool
4802operator!=(const member_class_template_sptr& l,
4803 const member_class_template_sptr& r);
4804
4805// Forward declarations for select nested hashers.
4807{
4808 size_t
4809 operator()(const shared_ptr<type_base> t) const;
4810};
4811
4813{
4814 size_t
4815 operator()(const type_base* t) const;
4816};
4817
4818/// A hashing functor for instances and pointers of @ref var_decl.
4820{
4821 size_t
4822 operator()(const var_decl& t) const;
4823
4824 size_t
4825 operator()(const var_decl* t) const;
4826}; //end struct var_decl::hash
4827
4828/// A comparison functor for pointers to @ref var_decl.
4830{
4831 /// Return true if the two instances of @ref var_decl are equal.
4832 ///
4833 /// @param l the first variable to compare.
4834 ///
4835 /// @param r the second variable to compare.
4836 ///
4837 /// @return true if @p l equals @p r.
4838 bool
4839 operator()(const var_decl* l, const var_decl* r) const
4840 {
4841 if (l == r)
4842 return true;
4843 if (!!l != !!r)
4844 return false;
4845 return (*l == *r);
4846 }
4847};// end struct var_decl::ptr_equal
4848
4849/// A hashing functor fo instances and pointers of @ref function_decl.
4851{
4852 size_t
4853 operator()(const function_decl& t) const;
4854
4855 size_t
4856 operator()(const function_decl* t) const;
4857};//end struct function_decl::hash
4858
4859/// Equality functor for instances of @ref function_decl
4861{
4862 /// Tests if two pointers to @ref function_decl are equal.
4863 ///
4864 /// @param l the first pointer to @ref function_decl to consider in
4865 /// the comparison.
4866 ///
4867 /// @param r the second pointer to @ref function_decl to consider in
4868 /// the comparison.
4869 ///
4870 /// @return true if the two functions @p l and @p r are equal, false
4871 /// otherwise.
4872 bool
4873 operator()(const function_decl* l, const function_decl* r) const
4874 {
4875 if (l == r)
4876 return true;
4877 if (!!l != !!r)
4878 return false;
4879 return (*l == *r);
4880 }
4881};// function_decl::ptr_equal
4882
4883/// The hashing functor for class_decl::base_spec.
4885{
4886 size_t
4887 operator()(const base_spec& t) const;
4888};
4889
4890/// The hashing functor for member_base.
4892{
4893 size_t
4894 operator()(const member_base& m) const;
4895};
4896
4897/// The hashing functor for member_function_template.
4899{
4900 size_t
4901 operator()(const member_function_template& t) const;
4902};
4903
4904/// The hashing functor for member_class_template
4906{
4907 size_t
4908 operator()(const member_class_template& t) const;
4909};
4910
4912{
4913 size_t
4914 operator()(const function_tdecl& t) const;
4915};
4916
4918{
4919 size_t
4920 operator()(const shared_ptr<function_tdecl> f) const;
4921};
4922
4924{
4925 size_t
4926 operator()(const class_tdecl& t) const;
4927};
4928
4930{
4931 size_t
4932 operator()(const shared_ptr<class_tdecl> t) const;
4933};
4934
4935/// The base class for the visitor type hierarchy used for traversing
4936/// a translation unit.
4937///
4938/// Client code willing to get notified for a certain kind of node
4939/// during the IR traversal might want to define a visitor class that
4940/// inherit ir_node_visitor, overload the ir_node_visitor::visit_begin()
4941/// or ir_node_visitor::visit_end() method of its choice, and provide
4942/// and implementation for it. If either
4943/// ir_node_visitor::visit_begin() or ir_node_visitor::visit_end()
4944/// return false, it means the traversal has to stop immediately after
4945/// the methods' return. If the methods return true, it means the
4946/// traversal keeps going.
4947///
4948/// That new visitor class would then be passed to e.g,
4949/// translation_unit::traverse or to the traverse method of any type
4950/// where the traversal is supposed to start from.
4952{
4953 struct priv;
4954 std::unique_ptr<priv> priv_;
4955
4956public:
4957
4959
4960 virtual ~ir_node_visitor();
4961
4967
4968 virtual bool visit_begin(decl_base*);
4969 virtual bool visit_end(decl_base*);
4970
4971 virtual bool visit_begin(scope_decl*);
4972 virtual bool visit_end(scope_decl*);
4973
4974 virtual bool visit_begin(type_base*);
4975 virtual bool visit_end(type_base*);
4976
4977 virtual bool visit_begin(scope_type_decl*);
4978 virtual bool visit_end(scope_type_decl*);
4979
4980 virtual bool visit_begin(type_decl*);
4981 virtual bool visit_end(type_decl*);
4982
4983 virtual bool visit_begin(namespace_decl*);
4984 virtual bool visit_end(namespace_decl*);
4985
4986 virtual bool visit_begin(qualified_type_def*);
4987 virtual bool visit_end(qualified_type_def*);
4988
4989 virtual bool visit_begin(pointer_type_def*);
4990 virtual bool visit_end(pointer_type_def*);
4991
4992 virtual bool visit_begin(reference_type_def*);
4993 virtual bool visit_end(reference_type_def*);
4994
4995 virtual bool visit_begin(ptr_to_mbr_type*);
4996 virtual bool visit_end(ptr_to_mbr_type*);
4997
4998 virtual bool visit_begin(array_type_def*);
4999 virtual bool visit_end(array_type_def*);
5000
5001 virtual bool visit_begin(array_type_def::subrange_type*);
5002 virtual bool visit_end(array_type_def::subrange_type*);
5003
5004 virtual bool visit_begin(enum_type_decl*);
5005 virtual bool visit_end(enum_type_decl*);
5006
5007 virtual bool visit_begin(typedef_decl*);
5008 virtual bool visit_end(typedef_decl*);
5009
5010 virtual bool visit_begin(function_type*);
5011 virtual bool visit_end(function_type*);
5012
5013 virtual bool visit_begin(var_decl*);
5014 virtual bool visit_end(var_decl*);
5015
5016 virtual bool visit_begin(function_decl*);
5017 virtual bool visit_end(function_decl*);
5018
5019 virtual bool visit_begin(function_decl::parameter*);
5020 virtual bool visit_end(function_decl::parameter*);
5021
5022 virtual bool visit_begin(function_tdecl*);
5023 virtual bool visit_end(function_tdecl*);
5024
5025 virtual bool visit_begin(class_tdecl*);
5026 virtual bool visit_end(class_tdecl*);
5027
5028 virtual bool visit_begin(class_or_union *);
5029 virtual bool visit_end(class_or_union *);
5030
5031 virtual bool visit_begin(class_decl*);
5032 virtual bool visit_end(class_decl*);
5033
5034 virtual bool visit_begin(union_decl*);
5035 virtual bool visit_end(union_decl*);
5036
5037 virtual bool visit_begin(class_decl::base_spec*);
5038 virtual bool visit_end(class_decl::base_spec*);
5039
5040 virtual bool visit_begin(member_function_template*);
5041 virtual bool visit_end(member_function_template*);
5042
5043 virtual bool visit_begin(member_class_template*);
5044 virtual bool visit_end(member_class_template*);
5045}; // end struct ir_node_visitor
5046
5047// Debugging facility
5048void
5049fns_to_str(vector<function_decl*>::const_iterator a_begin,
5050 vector<function_decl*>::const_iterator a_end,
5051 vector<function_decl*>::const_iterator b_begin,
5052 vector<function_decl*>::const_iterator b_end,
5053 std::ostream& o);
5054
5055}// end namespace ir
5056} // end namespace abigail
5057#endif // __ABG_IR_H__
This type abstracts the configuration information of the library.
Definition: abg-config.h:18
The abstraction of an interned string.
This class is to hold the value of the bound of a subrange. The value can be either signed or unsigne...
Definition: abg-ir.h:2560
void set_signed(int64_t v)
Setter of the bound value as signed.
Definition: abg-ir.cc:18668
void set_signedness(enum signedness s)
Setter of the signedness (unsigned VS signed) of the bound value.
Definition: abg-ir.cc:18636
enum signedness get_signedness() const
Getter of the signedness (unsigned VS signed) of the bound value.
Definition: abg-ir.cc:18629
int64_t get_signed_value() const
Getter of the bound value as a signed value.
Definition: abg-ir.cc:18643
bool operator==(const bound_value &) const
Equality operator of the bound value.
Definition: abg-ir.cc:18680
uint64_t get_unsigned_value()
Getter of the bound value as an unsigned value.
Definition: abg-ir.cc:18651
bound_value()
Default constructor of the array_type_def::subrange_type::bound_value class.
Definition: abg-ir.cc:18601
void set_unsigned(uint64_t v)
Setter of the bound value as unsigned.
Definition: abg-ir.cc:18658
Abstraction for an array range type, like in Ada, or just for an array dimension like in C or C++.
Definition: abg-ir.h:2545
void set_lower_bound(int64_t lb)
Setter of the lower bound.
Definition: abg-ir.cc:18844
bool is_non_finite() const
Test if the length of the subrange type is infinite.
Definition: abg-ir.cc:18871
void set_upper_bound(int64_t ub)
Setter of the upper bound of the subrange type.
Definition: abg-ir.cc:18837
void set_underlying_type(const type_base_sptr &)
Setter of the underlying type of the subrange, that is, the type that defines the range.
Definition: abg-ir.cc:18813
string as_string() const
Return a string representation of the sub range.
Definition: abg-ir.cc:18893
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:19082
bool operator!=(const decl_base &o) const
Equality operator.
Definition: abg-ir.cc:19021
int64_t get_upper_bound() const
Getter of the upper bound of the subrange type.
Definition: abg-ir.cc:18823
type_base_sptr get_underlying_type() const
Getter of the underlying type of the subrange, that is, the type that defines the range.
Definition: abg-ir.cc:18805
virtual bool operator==(const decl_base &) const
Equality operator.
Definition: abg-ir.cc:18977
int64_t get_lower_bound() const
Getter of the lower bound of the subrange type.
Definition: abg-ir.cc:18830
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build a pretty representation for an array_type_def::subrange_type.
Definition: abg-ir.cc:19060
static string vector_as_string(const vector< subrange_sptr > &)
Return a string representation of a vector of subranges.
Definition: abg-ir.cc:18916
uint64_t get_length() const
Getter of the length of the subrange type.
Definition: abg-ir.cc:18854
translation_unit::language get_language() const
Getter of the language that generated this type.
Definition: abg-ir.cc:18886
The abstraction of an array type.
Definition: abg-ir.h:2519
virtual bool is_non_finite() const
Definition: abg-ir.cc:19419
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Build and return the qualified name of the current instance of the array_type_def.
Definition: abg-ir.cc:19449
const type_base_sptr get_element_type() const
Getter of the type of an array element.
Definition: abg-ir.cc:19380
void set_element_type(const type_base_sptr &element_type)
Setter of the type of array element.
Definition: abg-ir.cc:19395
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
Definition: abg-ir.h:2537
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:19512
const std::vector< subrange_sptr > & get_subranges() const
Get the array's subranges.
Definition: abg-ir.cc:19539
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
Definition: abg-ir.cc:19358
std::vector< subrange_sptr > subranges_type
Convenience typedef for a vector of subrange_sptr.
Definition: abg-ir.h:2540
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of array_type_def.
Definition: abg-ir.cc:19228
translation_unit::language get_language() const
Get the language of the array.
Definition: abg-ir.cc:19347
virtual void append_subranges(const std::vector< subrange_sptr > &subs)
Append subranges from the vector.
Definition: abg-ir.cc:19405
Abstraction of a base specifier in a class declaration.
Definition: abg-ir.h:4425
class_decl_sptr get_base_class() const
Get the base class referred to by the current base class specifier.
Definition: abg-ir.cc:24612
bool get_is_virtual() const
Getter of the "is-virtual" proprerty of the base class specifier.
Definition: abg-ir.cc:24619
long get_offset_in_bits() const
Getter of the offset of the base.
Definition: abg-ir.cc:24626
virtual bool traverse(ir_node_visitor &)
Traverses an instance of class_decl::base_spec, visiting all the sub-types and decls that it might co...
Definition: abg-ir.cc:24652
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl::base_spec.
Definition: abg-ir.cc:24746
virtual size_t get_hash() const
Calculate the hash value for a class_decl::base_spec.
Definition: abg-ir.cc:24633
Abstracts a class declaration.
Definition: abg-ir.h:4228
friend void fixup_virtual_member_function(method_decl_sptr method)
When a virtual member function has seen its virtualness set by set_member_function_is_virtual(),...
Definition: abg-ir.cc:25150
bool has_virtual_member_functions() const
Test if the current instance of class_decl has virtual member functions.
Definition: abg-ir.cc:25203
const virtual_mem_fn_map_type & get_virtual_mem_fns_map() const
Get the map that associates a virtual table offset to the virtual member functions with that virtual ...
Definition: abg-ir.cc:24492
bool is_struct() const
Test if the class is a struct.
Definition: abg-ir.cc:24430
const base_specs & get_base_specifiers() const
Get the base specifiers for this class.
Definition: abg-ir.cc:24447
virtual ~class_decl()
Destructor of the class_decl type.
Definition: abg-ir.cc:25803
virtual void on_canonical_type_set()
This method is invoked automatically right after the current instance of class_decl has been canonica...
Definition: abg-ir.cc:24408
bool has_vtable() const
Test if the current instance has a vtable.
Definition: abg-ir.cc:25231
ssize_t get_biggest_vtable_offset() const
Get the highest vtable offset of all the virtual methods of the class.
Definition: abg-ir.cc:25245
bool has_virtual_bases() const
Test if the current instance of class_decl has at least one virtual base.
Definition: abg-ir.cc:25212
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:25719
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
Definition: abg-ir.h:4246
void add_base_specifier(shared_ptr< base_spec > b)
Add a base specifier to this class.
Definition: abg-ir.cc:24437
const member_functions & get_virtual_mem_fns() const
Get the virtual member functions of this class.
Definition: abg-ir.cc:24473
void sort_virtual_mem_fns()
Sort the virtual member functions by their virtual index.
Definition: abg-ir.cc:24497
friend bool equals(const class_decl &, const class_decl &, change_kind *)
Compares two instances of class_decl.
Definition: abg-ir.cc:25383
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl.
Definition: abg-ir.cc:25571
friend void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
Definition: abg-ir.cc:26106
bool has_no_base_nor_member() const
Return true iff the class has no entity in its scope.
Definition: abg-ir.cc:25194
virtual size_t get_hash() const
Return the hash value for the current instance.
Definition: abg-ir.cc:25262
class_decl_sptr find_base_class(const string &) const
Find a base class of a given qualified name for the current class.
Definition: abg-ir.cc:24457
vector< base_spec_sptr > base_specs
Convenience typedef.
Definition: abg-ir.h:4247
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Getter of the pretty representation of the current instance of class_decl.
Definition: abg-ir.cc:24518
The base type of class_decl and union_decl.
Definition: abg-ir.h:4026
virtual size_t get_num_anonymous_member_classes() const
Get the number of anonymous member classes contained in this class.
Definition: abg-ir.cc:23266
void add_member_function(method_decl_sptr f, access_specifier a, bool is_static, bool is_ctor, bool is_dtor, bool is_const)
Add a member function.
Definition: abg-ir.cc:23484
const var_decl_sptr find_anonymous_data_member(const var_decl_sptr &) const
Find an anonymous data member in the class.
Definition: abg-ir.cc:23417
const member_functions & get_member_functions() const
Get the member functions of this class_or_union.
Definition: abg-ir.cc:23512
friend void fixup_virtual_member_function(method_decl_sptr method)
When a virtual member function has seen its virtualness set by set_member_function_is_virtual(),...
Definition: abg-ir.cc:25150
virtual void remove_member_decl(decl_base_sptr)
Remove a given decl from the current class_or_union scope.
Definition: abg-ir.cc:23152
const member_function_templates & get_member_function_templates() const
Get the member function templates of this class.
Definition: abg-ir.cc:23588
virtual size_t get_size_in_bits() const
Getter of the size of the class_or_union type.
Definition: abg-ir.cc:23251
virtual size_t get_num_anonymous_member_unions() const
Get the number of anonymous member unions contained in this class.
Definition: abg-ir.cc:23284
void add_member_function_template(member_function_template_sptr)
Append a member function template to the class_or_union.
Definition: abg-ir.cc:23602
unordered_map< ssize_t, member_functions > virtual_mem_fn_map_type
Convenience typedef.
Definition: abg-ir.h:4058
vector< method_decl_sptr > member_functions
Convenience typedef.
Definition: abg-ir.h:4057
const data_members & get_data_members() const
Get the data members of this class_or_union.
Definition: abg-ir.cc:23376
unordered_map< string, method_decl * > string_mem_fn_ptr_map_type
Convenience typedef.
Definition: abg-ir.h:4059
void add_data_member(var_decl_sptr v, access_specifier a, bool is_laid_out, bool is_static, size_t offset_in_bits)
Add a data member to the current instance of class_or_union.
Definition: abg-ir.cc:23333
const method_decl * find_member_function_from_signature(const string &s) const
Find a method (member function) using its signature (pretty representation) as a key.
Definition: abg-ir.cc:23563
method_decl_sptr find_member_function_sptr(const string &mangled_name)
Find a method, using its linkage name as a key.
Definition: abg-ir.cc:23547
virtual void set_size_in_bits(size_t)
Setter of the size of the class_or_union type.
Definition: abg-ir.cc:23235
decl_base_sptr insert_member_decl(decl_base_sptr member)
Insert a data member to this class_or_union type.
Definition: abg-ir.cc:23644
virtual decl_base_sptr add_member_decl(const decl_base_sptr &)
Add a member declaration to the current instance of class_or_union. The member declaration can be eit...
Definition: abg-ir.cc:23140
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:23058
void add_member_class_template(member_class_template_sptr m)
Append a member class template to the class_or_union.
Definition: abg-ir.cc:23616
const data_members & get_non_static_data_members() const
Get the non-static data memebers of this class_or_union.
Definition: abg-ir.cc:23467
const method_decl * find_member_function(const string &mangled_name) const
Find a method, using its linkage name as a key.
Definition: abg-ir.cc:23521
void maybe_fixup_members_of_anon_data_member(var_decl_sptr &anon_dm)
Fixup the members of the type of an anonymous data member.
Definition: abg-ir.cc:23177
vector< var_decl_sptr > data_members
Convenience typedef.
Definition: abg-ir.h:4056
virtual ~class_or_union()
Destrcutor of the class_or_union type.
Definition: abg-ir.cc:23131
bool has_no_member() const
Definition: abg-ir.cc:23629
virtual bool operator==(const decl_base &) const
Equality operator.
Definition: abg-ir.cc:23678
friend void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
Definition: abg-ir.cc:26106
virtual size_t get_alignment_in_bits() const
Getter of the alignment of the class_or_union type.
Definition: abg-ir.cc:23203
const member_class_templates & get_member_class_templates() const
Get the member class templates of this class.
Definition: abg-ir.cc:23595
virtual void set_alignment_in_bits(size_t)
Setter of the alignment of the class type.
Definition: abg-ir.cc:23219
vector< type_base_sptr > member_types
Convenience typedef.
Definition: abg-ir.h:4055
virtual size_t get_num_anonymous_member_enums() const
Get the number of anonymous member enums contained in this class.
Definition: abg-ir.cc:23302
const var_decl_sptr find_data_member(const string &) const
Find a data member of a given name in the current class_or_union.
Definition: abg-ir.cc:23387
friend bool equals(const class_or_union &, const class_or_union &, change_kind *)
Compares two instances of class_or_union.
Definition: abg-ir.cc:23748
unordered_map< string, method_decl_sptr > string_mem_fn_sptr_map_type
Convenience typedef.
Definition: abg-ir.h:4060
Abstract a class template.
Definition: abg-ir.h:3829
shared_ptr< class_decl > get_pattern() const
Getter of the pattern of the template.
Definition: abg-ir.cc:27493
void set_pattern(class_decl_sptr p)
Setter of the pattern of the template.
Definition: abg-ir.cc:27482
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:27542
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
Definition: abg-ir.cc:27497
The abstraction of the relationship between an entity and its containing scope (its context)....
Definition: abg-ir.h:1247
bool operator!=(const context_rel &o) const
Inequality operator.
Definition: abg-ir.h:1313
This is the abstraction of a set of translation units (themselves seen as bundles of unitary abi arte...
Definition: abg-corpus.h:25
The base type of all declarations.
Definition: abg-ir.h:1538
void set_definition_of_declaration(const decl_base_sptr &)
Set the definition of this declaration-only decl_base.
Definition: abg-ir.cc:15854
void set_is_declaration_only(bool f)
Set a flag saying if the enum_type_decl is a declaration-only enum_type_decl.
Definition: abg-ir.cc:5196
virtual bool operator!=(const decl_base &) const
Inequality operator.
Definition: abg-ir.cc:5454
scope_decl * get_scope() const
Return the type containing the current decl, if any.
Definition: abg-ir.cc:5025
void set_qualified_name(const interned_string &) const
Setter for the qualified name.
Definition: abg-ir.cc:4734
void set_is_in_public_symbol_table(bool)
Set the flag saying if this decl is from a symbol that is in a public symbols table,...
Definition: abg-ir.cc:4818
friend bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
Definition: abg-ir.cc:5809
const decl_base_sptr get_earlier_declaration() const
If this decl_base is a definition, get its earlier declaration.
Definition: abg-ir.cc:5144
virtual void set_linkage_name(const string &m)
Setter for the linkage name.
Definition: abg-ir.cc:5000
const decl_base * get_naked_definition_of_declaration() const
If this decl_base is declaration-only, get its definition, if any.
Definition: abg-ir.cc:5180
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Compute the qualified name of the decl.
Definition: abg-ir.cc:5056
void clear_qualified_name()
Clear the qualified name of this decl.
Definition: abg-ir.cc:4727
void set_name(const string &n)
Setter for the name of the decl.
Definition: abg-ir.cc:4888
const location & get_location() const
Get the location of a given declaration.
Definition: abg-ir.cc:4838
binding
ELF binding.
Definition: abg-ir.h:1589
typedef_decl_sptr get_naming_typedef() const
Getter for the naming typedef of the current decl.
Definition: abg-ir.cc:4948
const interned_string & get_name() const
Getter for the name of the current decl.
Definition: abg-ir.cc:5044
virtual void set_scope(scope_decl *)
Setter of the scope of the current decl.
Definition: abg-ir.cc:5481
const interned_string & peek_qualified_name() const
Getter for the qualified name.
Definition: abg-ir.cc:4718
const context_rel * get_context_rel() const
Getter for the context relationship.
Definition: abg-ir.cc:4768
friend void set_member_function_is_virtual(function_decl &, bool)
Set the virtual-ness of a member function.
Definition: abg-ir.cc:6845
bool get_is_anonymous() const
Test if the current declaration is anonymous.
Definition: abg-ir.cc:4901
friend decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scpe)
Appends a declaration to a given scope, if the declaration doesn't already belong to one and if the d...
Definition: abg-ir.cc:8501
friend void set_member_is_static(const decl_base_sptr &d, bool s)
Sets the static-ness property of a class member.
Definition: abg-ir.cc:26180
virtual const interned_string & get_scoped_name() const
Return the scoped name of the decl.
Definition: abg-ir.cc:5136
const decl_base_sptr get_definition_of_declaration() const
If this decl_base is declaration-only, get its definition, if any.
Definition: abg-ir.cc:5164
friend void set_member_access_specifier(decl_base &d, access_specifier a)
Sets the access specifier for a class member.
Definition: abg-ir.cc:5778
friend void remove_decl_from_scope(decl_base_sptr)
Remove a given decl from its scope.
Definition: abg-ir.cc:8525
void set_naming_typedef(const typedef_decl_sptr &)
Set the naming typedef of the current instance of decl_base.
Definition: abg-ir.cc:4966
void set_location(const location &l)
Set the location for a given declaration.
Definition: abg-ir.cc:4876
void set_is_anonymous(bool)
Set the "is_anonymous" flag of the current declaration.
Definition: abg-ir.cc:4911
void set_visibility(visibility v)
Setter for the visibility of the decl.
Definition: abg-ir.cc:5017
void set_temporary_qualified_name(const interned_string &) const
Setter for the temporary qualified name of the current declaration.
Definition: abg-ir.cc:4761
visibility get_visibility() const
Getter for the visibility of the decl.
Definition: abg-ir.cc:5010
visibility
ELF visibility.
Definition: abg-ir.h:1579
bool get_is_declaration_only() const
Test if a decl_base is a declaration-only decl.
Definition: abg-ir.cc:5187
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:5470
void set_earlier_declaration(const decl_base_sptr &)
set the earlier declaration of this decl_base definition.
Definition: abg-ir.cc:5152
const interned_string & get_linkage_name() const
Getter for the mangled name.
Definition: abg-ir.cc:4993
friend enum access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
Definition: abg-ir.cc:5749
friend bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
Definition: abg-ir.cc:6807
virtual ~decl_base()
Destructor of the decl_base type.
Definition: abg-ir.cc:5458
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
Definition: abg-ir.cc:5443
const interned_string & get_qualified_parent_name() const
Return a copy of the qualified name of the parent of the current decl.
Definition: abg-ir.cc:5037
bool get_is_anonymous_or_has_anonymous_parent() const
Definition: abg-ir.cc:4934
bool get_has_anonymous_parent() const
Get the "has_anonymous_parent" flag of the current declaration.
Definition: abg-ir.cc:4923
bool get_is_in_public_symbol_table() const
Test if the decl is defined in a ELF symbol table as a public symbol.
Definition: abg-ir.cc:4810
friend bool equals(const decl_base &, const decl_base &, change_kind *)
Compares two instances of decl_base.
Definition: abg-ir.cc:5360
virtual size_t get_hash() const
Get the hash of a decl. If the hash hasn't been computed yet, compute it ans store its value; otherwi...
Definition: abg-ir.cc:4787
const interned_string & peek_temporary_qualified_name() const
Getter of the temporary qualified name of the current declaration.
Definition: abg-ir.cc:4747
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representatin of the current declaration.
Definition: abg-ir.cc:5079
friend bool maybe_compare_as_member_decls(const decl_base &l, const decl_base &r, change_kind *k)
Compare the properties that belong to the "is-a-member-relation" of a decl.
Definition: abg-ir.cc:5260
friend bool var_equals_modulo_types(const var_decl &, const var_decl &, change_kind *)
Compares two instances of var_decl without taking their type into account.
Definition: abg-ir.cc:20762
The abstraction for a data member context relationship. This relates a data member to its parent clas...
Definition: abg-ir.h:2954
const var_decl * get_anonymous_data_member() const
Return a non-nil value if this data member context relationship has an anonymous data member....
Definition: abg-ir.cc:3249
void set_anonymous_data_member(var_decl *)
Set the containing anonymous data member of this data member context relationship....
Definition: abg-ir.cc:3259
The abstraction of the version of an ELF symbol.
Definition: abg-ir.h:1194
version & operator=(const version &o)
Assign a version to the current one.
Definition: abg-ir.cc:3162
bool operator==(const version &o) const
Compares the current version against another one.
Definition: abg-ir.cc:3144
bool is_default() const
Getter for the 'is_default' property of the version.
Definition: abg-ir.cc:3124
const string & str() const
Getter for the version name.
Definition: abg-ir.cc:3110
bool operator!=(const version &o) const
Inequality operator.
Definition: abg-ir.cc:3153
Abstraction of an elf symbol.
Definition: abg-ir.h:923
const abg_compat::optional< std::string > & get_namespace() const
Getter of the 'namespace' property.
Definition: abg-ir.cc:2247
elf_symbol_sptr get_alias_which_equals(const elf_symbol &other) const
In the list of aliases of a given elf symbol, get the alias that equals this current symbol.
Definition: abg-ir.cc:2570
elf_symbol_sptr get_next_common_instance() const
Get the next common instance of the current common symbol.
Definition: abg-ir.cc:2465
type get_type() const
Getter for the type of the current instance of elf_symbol.
Definition: abg-ir.cc:2087
const elf_symbol_sptr get_main_symbol() const
Get the main symbol of an alias chain.
Definition: abg-ir.cc:2302
void set_is_in_ksymtab(bool is_in_ksymtab)
Setter of the 'is-in-ksymtab' property.
Definition: abg-ir.cc:2226
bool has_aliases() const
Check if the current elf_symbol has an alias.
Definition: abg-ir.cc:2331
void set_name(const string &n)
Setter for the name of the current intance of elf_symbol.
Definition: abg-ir.cc:2077
bool is_suppressed() const
Getter for the 'is-suppressed' property.
Definition: abg-ir.cc:2263
binding
The binding of a symbol.
Definition: abg-ir.h:940
int get_number_of_aliases() const
Get the number of aliases to this elf symbol.
Definition: abg-ir.cc:2338
string get_aliases_id_string(const string_elf_symbols_map_type &symtab, bool include_symbol_itself=true) const
Return a comma separated list of the id of the current symbol as well as the id string of its aliases...
Definition: abg-ir.cc:2591
void set_binding(binding b)
Setter for the binding of the current instance of elf_symbol.
Definition: abg-ir.cc:2122
void add_common_instance(const elf_symbol_sptr &)
Add a common instance to the current common elf symbol.
Definition: abg-ir.cc:2476
void add_alias(const elf_symbol_sptr &)
Add an alias to the current elf symbol.
Definition: abg-ir.cc:2355
void set_is_suppressed(bool is_suppressed)
Setter for the 'is-suppressed' property.
Definition: abg-ir.cc:2272
bool is_variable() const
Test if the current instance of elf_symbol is a variable symbol or not.
Definition: abg-ir.cc:2210
elf_symbol_sptr update_main_symbol(const std::string &)
Update the main symbol for a group of aliased symbols.
Definition: abg-ir.cc:2401
void set_size(size_t)
Setter of the size of the symbol.
Definition: abg-ir.cc:2108
const string & get_name() const
Getter for the name of the elf_symbol.
Definition: abg-ir.cc:2070
binding get_binding() const
Getter for the binding of the current instance of elf_symbol.
Definition: abg-ir.cc:2115
static bool get_name_and_version_from_id(const string &id, string &name, string &ver)
Given the ID of a symbol, get the name and the version of said symbol.
Definition: abg-ir.cc:2657
bool is_function() const
Test if the current instance of elf_symbol is a function symbol or not.
Definition: abg-ir.cc:2201
type
The type of a symbol.
Definition: abg-ir.h:927
void set_version(const version &v)
Setter for the version of the current instance of elf_symbol.
Definition: abg-ir.cc:2136
const abg_compat::optional< uint32_t > & get_crc() const
Getter of the 'crc' property.
Definition: abg-ir.cc:2233
void set_visibility(visibility v)
Setter of the visibility of the current instance of elf_symbol.
Definition: abg-ir.cc:2147
bool does_alias(const elf_symbol &) const
Test if the current symbol aliases another one.
Definition: abg-ir.cc:2716
bool is_main_symbol() const
Tests whether this symbol is the main symbol.
Definition: abg-ir.cc:2316
void set_crc(const abg_compat::optional< uint32_t > &crc)
Setter of the 'crc' property.
Definition: abg-ir.cc:2240
static elf_symbol_sptr create(const environment &e, size_t i, size_t s, const string &n, type t, binding b, bool d, bool c, const version &ve, visibility vi, bool is_in_ksymtab=false, const abg_compat::optional< uint32_t > &crc={}, const abg_compat::optional< std::string > &ns={}, bool is_suppressed=false)
Factory of instances of elf_symbol.
Definition: abg-ir.cc:1993
visibility
The visibility of the symbol.
Definition: abg-ir.h:949
version & get_version() const
Getter for the version of the current instanc of elf_symbol.
Definition: abg-ir.cc:2129
bool is_common_symbol() const
Return true if the symbol is a common one.
Definition: abg-ir.cc:2434
void set_index(size_t)
Setter for the index.
Definition: abg-ir.cc:2063
visibility get_visibility() const
Getter of the visibility of the current instance of elf_symbol.
Definition: abg-ir.cc:2155
bool has_other_common_instances() const
Return true if this common common symbol has other common instances.
Definition: abg-ir.cc:2450
size_t get_index() const
Getter for the index.
Definition: abg-ir.cc:2056
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
Definition: abg-ir.cc:2521
elf_symbol_sptr get_alias_from_name(const string &name) const
From the aliases of the current symbol, lookup one with a given name.
Definition: abg-ir.cc:2548
const environment & get_environment() const
Getter of the environment used by the current instance of elf_symbol.
Definition: abg-ir.cc:2049
void set_type(type t)
Setter for the type of the current instance of elf_symbol.
Definition: abg-ir.cc:2094
bool is_public() const
Test if the current instance of elf_symbol is public or not.
Definition: abg-ir.cc:2185
bool is_in_ksymtab() const
Getter of the 'is-in-ksymtab' property.
Definition: abg-ir.cc:2218
size_t get_size() const
Getter of the size of the symbol.
Definition: abg-ir.cc:2101
bool is_defined() const
Test if the current instance of elf_symbol is defined or not.
Definition: abg-ir.cc:2163
void set_namespace(const abg_compat::optional< std::string > &ns)
Setter of the 'namespace' property.
Definition: abg-ir.cc:2254
elf_symbol_sptr get_next_alias() const
Get the next alias of the current symbol.
Definition: abg-ir.cc:2323
bool operator==(const elf_symbol &) const
Test if two main symbols are textually equal, or, if they have aliases that are textually equal.
Definition: abg-ir.cc:2702
The abstraction of an enumerator.
Definition: abg-ir.h:2835
enumerator()
Default constructor of the enum_type_decl::enumerator type.
Definition: abg-ir.cc:20133
bool operator!=(const enumerator &other) const
Inequality operator.
Definition: abg-ir.cc:20193
void set_name(const string &n)
Setter for the name of enum_type_decl::enumerator.
Definition: abg-ir.cc:20235
enum_type_decl * get_enum_type() const
Getter for the enum type that this enumerator is for.
Definition: abg-ir.cc:20257
const string & get_name() const
Getter for the name of the current instance of enum_type_decl::enumerator.
Definition: abg-ir.cc:20202
void set_enum_type(enum_type_decl *)
Setter for the enum type that this enumerator is for.
Definition: abg-ir.cc:20264
void set_value(int64_t v)
Setter for the value of enum_type_decl::enumerator.
Definition: abg-ir.cc:20250
const string & get_qualified_name(bool internal=false) const
Getter for the qualified name of the current instance of enum_type_decl::enumerator....
Definition: abg-ir.cc:20219
int64_t get_value() const
Getter for the value of enum_type_decl::enumerator.
Definition: abg-ir.cc:20243
bool operator==(const enumerator &other) const
Equality operator.
Definition: abg-ir.cc:20180
enumerator & operator=(const enumerator &)
Assignment operator of the enum_type_decl::enumerator type.
Definition: abg-ir.cc:20164
Abstracts a declaration for an enum type.
Definition: abg-ir.h:2750
friend bool enum_has_non_name_change(const enum_type_decl &l, const enum_type_decl &r, change_kind *k)
Test if two enums differ, but not by a name change.
Definition: abg-ir.cc:19723
std::vector< enumerator > enumerators
Convenience typedef for a list of enumerator.
Definition: abg-ir.h:2766
virtual ~enum_type_decl()
Destructor for the enum type declaration.
Definition: abg-ir.cc:19711
const enumerators & get_enumerators() const
Definition: abg-ir.cc:19611
const enumerators & get_sorted_enumerators() const
Get the lexicographically sorted vector of enumerators.
Definition: abg-ir.cc:19623
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:19689
type_base_sptr get_underlying_type() const
Return the underlying type of the enum.
Definition: abg-ir.cc:19606
virtual bool operator==(const decl_base &) const
Equality operator.
Definition: abg-ir.cc:20054
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of enum_type_decl.
Definition: abg-ir.cc:19664
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
Definition: abg-ir.h:140
bool decl_only_class_equals_definition() const
Getter of the "decl-only-class-equals-definition" flag.
Definition: abg-ir.cc:3746
bool is_void_pointer_type(const type_base_sptr &) const
Test if a given type is the same as the void pointer type of the environment.
Definition: abg-ir.cc:3813
std::unordered_map< string, std::vector< type_base_sptr > > canonical_types_map_type
A convenience typedef for a map of canonical types. The key is the pretty representation string of a ...
Definition: abg-ir.h:150
bool user_set_analyze_exported_interfaces_only() const
Getter for a property that says if the user actually did set the analyze_exported_interfaces_only() p...
Definition: abg-ir.cc:3893
const type_base_sptr & get_void_type() const
Get the unique type_decl that represents a "void" type for the current environment....
Definition: abg-ir.cc:3627
bool is_variadic_parameter_type(const type_base *) const
Test if a type is a variadic parameter type as defined in the current environment.
Definition: abg-ir.cc:3845
static string & get_variadic_parameter_type_name()
Getter of the name of the variadic parameter type.
Definition: abg-ir.cc:3678
const type_base_sptr & get_void_pointer_type() const
Getter of the "pointer-to-void" IR node that is shared across the ABI corpus. This node must be the o...
Definition: abg-ir.cc:3646
const config & get_config() const
Getter of the general configuration object.
Definition: abg-ir.cc:3883
environment()
Default constructor of the environment type.
Definition: abg-ir.cc:3274
vector< type_base_sptr > * get_canonical_types(const char *name)
Get the vector of canonical types which have a given "string representation".
Definition: abg-ir.cc:4030
bool canonicalization_is_done() const
Test if the canonicalization of types created out of the current environment is done.
Definition: abg-ir.cc:3690
type_base * get_canonical_type(const char *name, unsigned index)
Get a given canonical type which has a given "string representation".
Definition: abg-ir.cc:4053
const type_base_sptr & get_variadic_parameter_type() const
Get a type_decl instance that represents a the type of a variadic function parameter....
Definition: abg-ir.cc:3665
bool is_void_type(const type_base_sptr &) const
Test if a given type is a void type as defined in the current environment.
Definition: abg-ir.cc:3782
virtual ~environment()
Destructor for the environment type.
Definition: abg-ir.cc:3279
interned_string intern(const string &) const
Do intern a string.
Definition: abg-ir.cc:3876
friend void keep_type_alive(type_base_sptr)
Make sure that the life time of a given (smart pointer to a) type is the same as the life time of the...
Definition: abg-ir.cc:27681
bool do_on_the_fly_canonicalization() const
Getter for the "on-the-fly-canonicalization" flag.
Definition: abg-ir.cc:3713
bool analyze_exported_interfaces_only() const
Getter for the property that controls if we are to restrict the analysis to the types that are only r...
Definition: abg-ir.cc:3919
canonical_types_map_type & get_canonical_types_map()
Getter the map of canonical types.
Definition: abg-ir.cc:3287
Abstraction of a function parameter.
Definition: abg-ir.h:3283
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Compute the qualified name of the parameter.
Definition: abg-ir.cc:22891
interned_string get_type_name() const
Definition: abg-ir.cc:22680
interned_string get_name_id() const
Get a name uniquely identifying the parameter in the function.
Definition: abg-ir.cc:22718
const string get_type_pretty_representation() const
Definition: abg-ir.cc:22699
virtual bool traverse(ir_node_visitor &v)
Traverse the diff sub-tree under the current instance function_decl.
Definition: abg-ir.cc:22856
virtual size_t get_hash() const
Get the hash of a decl. If the hash hasn't been computed yet, compute it ans store its value; otherwi...
Definition: abg-ir.cc:22876
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Compute and return a copy of the pretty representation of the current function parameter.
Definition: abg-ir.cc:22911
Abstraction for a function declaration.
Definition: abg-ir.h:3111
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
Definition: abg-ir.h:3135
string get_pretty_representation_of_declarator(bool internal=false) const
Compute and return the pretty representation for the part of the function declaration that starts at ...
Definition: abg-ir.cc:22080
const function_type * get_naked_type() const
Fast getter of the type of the current instance of function_decl.
Definition: abg-ir.cc:22151
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:22542
void append_parameters(std::vector< parameter_sptr > &parms)
Append a vector of parameters to the type of this function.
Definition: abg-ir.cc:22221
bool is_variadic() const
Return true iff the function takes a variable number of parameters.
Definition: abg-ir.cc:22445
parameters::const_iterator get_first_non_implicit_parm() const
Getter for the first non-implicit parameter of a function decl.
Definition: abg-ir.cc:22117
const function_type_sptr get_type() const
Return the type of the current instance of function_decl.
Definition: abg-ir.cc:22136
function_decl(const string &name, function_type_sptr function_type, bool declared_inline, const location &locus, const string &mangled_name, visibility vis, binding bind)
Constructor of the function_decl.
Definition: abg-ir.cc:21943
const type_base_sptr get_return_type() const
Definition: abg-ir.cc:22202
function_decl_sptr clone() const
Create a new instance of function_decl that is a clone of the current one.
Definition: abg-ir.cc:22234
const std::vector< parameter_sptr > & get_parameters() const
Definition: abg-ir.cc:22207
void append_parameter(parameter_sptr parm)
Append a parameter to the type of this function.
Definition: abg-ir.cc:22214
void set_symbol(const elf_symbol_sptr &sym)
This sets the underlying ELF symbol for the current function decl.
Definition: abg-ir.cc:22173
virtual ~function_decl()
Destructor of the function_decl type.
Definition: abg-ir.cc:22558
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using function_decl::set_sy...
Definition: abg-ir.cc:22189
virtual bool operator==(const decl_base &o) const
Comparison operator for function_decl.
Definition: abg-ir.cc:22431
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
Definition: abg-ir.h:3138
virtual size_t get_hash() const
The virtual implementation of 'get_hash' for a function_decl.
Definition: abg-ir.cc:22457
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of function_decl.
Definition: abg-ir.cc:22012
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
Definition: abg-ir.cc:22473
Abstract a function template declaration.
Definition: abg-ir.h:3780
binding get_binding() const
Get the binding of the function template.
Definition: abg-ir.cc:27330
void set_pattern(shared_ptr< function_decl > p)
Set a new pattern to the function template.
Definition: abg-ir.cc:27312
shared_ptr< function_decl > get_pattern() const
Get the pattern of the function template.
Definition: abg-ir.cc:27323
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:27390
virtual bool operator==(const decl_base &) const
Comparison operator for the function_tdecl type.
Definition: abg-ir.cc:27339
Abstraction of a function type.
Definition: abg-ir.h:3387
shared_ptr< function_decl::parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
Definition: abg-ir.h:3397
friend bool equals(const function_type &, const function_type &, change_kind *)
Compare two function types.
Definition: abg-ir.cc:21373
virtual bool traverse(ir_node_visitor &)
Traverses an instance of function_type, visiting all the sub-types and decls that it might contain.
Definition: abg-ir.cc:21655
bool is_variadic() const
Test if the current instance of function_type is for a variadic function.
Definition: abg-ir.cc:21340
parameters::const_iterator get_first_parm() const
Get the first parameter of the function.
Definition: abg-ir.cc:21551
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
Definition: abg-ir.cc:21154
virtual bool operator==(const type_base &) const
Equality operator for function_type.
Definition: abg-ir.cc:21614
void append_parameter(parameter_sptr parm)
Append a new parameter to the vector of parameters of the current instance of function_type.
Definition: abg-ir.cc:21325
void set_parameters(const parameters &p)
Setter for the parameters of the current instance of function_type.
Definition: abg-ir.cc:21302
const interned_string & get_cached_name(bool internal=false) const
Get the name of the current function_type.
Definition: abg-ir.cc:21571
const parameter_sptr get_parm_at_index_from_first_non_implicit_parm(size_t) const
Get the Ith parameter of the vector of parameters of the current instance of function_type.
Definition: abg-ir.cc:21281
type_base_sptr get_return_type() const
Getter for the return type of the current instance of function_type.
Definition: abg-ir.cc:21244
void set_return_type(type_base_sptr t)
Setter of the return type of the current instance of function_type.
Definition: abg-ir.cc:21252
parameters::const_iterator get_first_non_implicit_parm() const
Get the first parameter of the function.
Definition: abg-ir.cc:21529
const parameters & get_parameters() const
Getter for the set of parameters of the current intance of function_type.
Definition: abg-ir.cc:21261
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
Definition: abg-ir.h:3399
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current function_type.
Definition: abg-ir.cc:21638
This abstracts the global scope of a given translation unit.
Definition: abg-ir.h:1952
The base class for the visitor type hierarchy used for traversing a translation unit.
Definition: abg-ir.h:4952
bool allow_visiting_already_visited_type_node() const
Get if the walker using this visitor is allowed to re-visit a type node that was previously visited o...
Definition: abg-ir.cc:29225
bool type_node_has_been_visited(type_base *) const
Test if a given type node has been marked as visited.
Definition: abg-ir.cc:29269
void forget_visited_type_nodes()
Un-mark all visited type nodes.
Definition: abg-ir.cc:29259
ir_node_visitor()
Default Constructor of the ir_node_visitor type.
Definition: abg-ir.cc:29204
void mark_type_node_as_visited(type_base *)
Mark a given type node as having been visited.
Definition: abg-ir.cc:29235
The entry point to manage locations.
Definition: abg-ir.h:441
location create_new_location(const std::string &fle, size_t lne, size_t col)
Insert the triplet representing a source locus into our internal vector of location triplet....
Definition: abg-ir.cc:517
void expand_location(const location &location, std::string &path, unsigned &line, unsigned &column) const
Given an instance of location type, return the triplet {path,line,column} that represents the source ...
Definition: abg-ir.cc:540
The source location of a token.
Definition: abg-ir.h:299
location()
Default constructor for the location type.
Definition: abg-ir.h:381
bool get_is_artificial() const
Test if the location is artificial.
Definition: abg-ir.h:340
bool operator<(const location &other) const
"Less than" operator of the location type.
Definition: abg-ir.h:413
location & operator=(const location &l)
Assignment operator of the location.
Definition: abg-ir.h:372
bool operator==(const location &other) const
Equality operator of the location type.
Definition: abg-ir.h:403
location(const location &l)
Copy constructor of the location.
Definition: abg-ir.h:362
unsigned get_value() const
Get the value of the location.
Definition: abg-ir.h:387
void set_is_artificial(bool f)
Set the artificial-ness of the location.
Definition: abg-ir.h:356
string expand(void) const
Expand the location into a string.
Definition: abg-ir.cc:482
Abstraction of a member function context relationship. This relates a member function to its parent c...
Definition: abg-ir.h:4553
bool is_constructor() const
Getter for the 'is-constructor' property.
Definition: abg-ir.h:4631
void vtable_offset(size_t s)
Setter for the vtable offset property.
Definition: abg-ir.h:4621
bool is_const() const
Getter for the 'is-const' property.
Definition: abg-ir.h:4666
void is_destructor(bool f)
Setter for the 'is-destructor' property.
Definition: abg-ir.h:4656
void is_const(bool f)
Setter for the 'is-const' property.
Definition: abg-ir.h:4674
size_t vtable_offset() const
Getter for the vtable offset property.
Definition: abg-ir.h:4611
void is_constructor(bool f)
Setter for the 'is-constructor' property.
Definition: abg-ir.h:4639
bool is_destructor() const
Getter for the 'is-destructor' property.
Definition: abg-ir.h:4648
The base class for member types, data members and member functions. Its purpose is mainly to carry th...
Definition: abg-ir.h:3875
access_specifier get_access_specifier() const
Getter for the access specifier of this member.
Definition: abg-ir.h:3896
bool get_is_static() const
Definition: abg-ir.h:3908
void set_access_specifier(access_specifier a)
Setter for the access specifier of this member.
Definition: abg-ir.h:3903
void set_is_static(bool f)
Set a flag saying if the parameter is static or not.
Definition: abg-ir.h:3915
Abstracts a member class template template.
Definition: abg-ir.h:4758
virtual bool operator==(const member_base &o) const
Equality operator of the the member_class_template class.
Definition: abg-ir.cc:25966
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:26051
Abstract a member function template.
Definition: abg-ir.h:4703
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:25945
Abstraction of the declaration of a method.
Definition: abg-ir.h:3924
friend void set_member_function_is_const(function_decl &, bool)
set the const-ness property of a member function.
Definition: abg-ir.cc:6704
virtual void set_linkage_name(const string &)
Set the linkage name of the method.
Definition: abg-ir.cc:24893
friend void set_member_function_is_virtual(function_decl &, bool)
Set the virtual-ness of a member function.
Definition: abg-ir.cc:6845
friend void set_member_function_is_ctor(function_decl &, bool)
Setter for the is_ctor property of the member function.
Definition: abg-ir.cc:6591
friend ssize_t get_member_function_vtable_offset(const function_decl &)
Get the vtable offset of a member function.
Definition: abg-ir.cc:6744
friend bool get_member_function_is_ctor(const function_decl &)
Test whether a member function is a constructor.
Definition: abg-ir.cc:6561
friend void set_member_function_is_dtor(function_decl &, bool)
Set the destructor-ness property of a member function.
Definition: abg-ir.cc:6648
const method_type_sptr get_type() const
Definition: abg-ir.cc:24920
friend void set_member_function_vtable_offset(function_decl &, ssize_t)
Set the vtable offset of a member function.
Definition: abg-ir.cc:6777
friend bool member_function_has_vtable_offset(const function_decl &)
Test if a virtual member function has a vtable offset set.
Definition: abg-ir.cc:6733
friend bool get_member_function_is_dtor(const function_decl &)
Test whether a member function is a destructor.
Definition: abg-ir.cc:6620
friend bool get_member_function_is_const(const function_decl &)
Test whether a member function is const.
Definition: abg-ir.cc:6676
friend bool get_member_function_is_virtual(const function_decl &)
Test if a given member function is virtual.
Definition: abg-ir.cc:6807
Abstracts the type of a class member function.
Definition: abg-ir.h:3483
void set_class_type(const class_or_union_sptr &t)
Sets the class type of the current instance of method_type.
Definition: abg-ir.cc:21842
void set_is_const(bool)
Setter of the "is-const" property of method_type.
Definition: abg-ir.cc:21874
friend interned_string get_method_type_name(const method_type &fn_type, bool internal)
Get the name of a given method type and return a copy of it.
Definition: abg-ir.cc:9287
virtual ~method_type()
The destructor of method_type.
Definition: abg-ir.cc:21885
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current method_type.
Definition: abg-ir.cc:21866
class_or_union_sptr get_class_type() const
Get the class type this method belongs to.
Definition: abg-ir.cc:21833
bool get_is_const() const
Getter of the "is-const" property of method_type.
Definition: abg-ir.cc:21881
The abstraction of a namespace declaration.
Definition: abg-ir.h:2197
bool is_empty_or_has_empty_sub_namespaces() const
Test if the current namespace_decl is empty or contains empty namespaces itself.
Definition: abg-ir.cc:16921
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:16952
namespace_decl(const environment &env, const string &name, const location &locus, visibility vis=VISIBILITY_DEFAULT)
Constructor.
Definition: abg-ir.cc:16855
virtual bool operator==(const decl_base &) const
Return true iff both namespaces and their members are equal.
Definition: abg-ir.cc:16907
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return a copy of the pretty representation of the namespace.
Definition: abg-ir.cc:16893
Abstracts non type template parameters.
Definition: abg-ir.h:3657
const type_base_sptr get_type() const
Getter for the type of the template parameter.
Definition: abg-ir.cc:27009
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
Definition: abg-ir.cc:27023
virtual size_t get_hash() const
Get the hash value of the current instance.
Definition: abg-ir.cc:27016
The abstraction of a pointer type.
Definition: abg-ir.h:2337
void set_pointed_to_type(const type_base_sptr &)
Set the pointed-to type of the pointer.
Definition: abg-ir.cc:17586
virtual void get_qualified_name(interned_string &, bool internal=false) const
Build and return the qualified name of the current instance of pointer_type_def.
Definition: abg-ir.cc:17721
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
Definition: abg-ir.cc:17517
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:17815
virtual bool operator==(const decl_base &) const
Return true iff both instances of pointer_type_def are equal.
Definition: abg-ir.cc:17657
const type_base_sptr get_pointed_to_type() const
Getter of the pointed-to type.
Definition: abg-ir.cc:17701
type_base * get_naked_pointed_to_type() const
Getter of a naked pointer to the pointed-to type.
Definition: abg-ir.cc:17708
The abstraction of a pointer-to-member type.
Definition: abg-ir.h:2466
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Get the qualified name for the current ptr_to_mbr_type.
Definition: abg-ir.cc:18450
const type_base_sptr & get_containing_type() const
Getter of the type containing the member pointed-to by the current ptr_to_mbr_type.
Definition: abg-ir.cc:18393
bool operator==(const ptr_to_mbr_type &) const
Equality operator for the current ptr_to_mbr_type.
Definition: abg-ir.cc:18434
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function for ptr_to_mbr_type.
Definition: abg-ir.cc:18501
const type_base_sptr & get_member_type() const
Getter of the member type of the current ptr_to_mbr_type.
Definition: abg-ir.cc:18384
virtual ~ptr_to_mbr_type()
Desctructor for ptr_to_mbr_type.
Definition: abg-ir.cc:18526
The abstraction of a qualified type.
Definition: abg-ir.h:2226
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation for the virtual qualified name builder for qualified_type_def.
Definition: abg-ir.cc:17243
void set_underlying_type(const type_base_sptr &)
Setter of the underlying type.
Definition: abg-ir.cc:17368
virtual size_t get_size_in_bits() const
Get the size of the qualified type def.
Definition: abg-ir.cc:17107
string get_cv_quals_string_prefix() const
Compute and return the string prefix or suffix representing the qualifiers hold by the current instan...
Definition: abg-ir.cc:17356
CV
Bit field values representing the cv qualifiers of the underlying type.
Definition: abg-ir.h:2245
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
Definition: abg-ir.cc:17047
void set_cv_quals(CV cv_quals)
Setter of the const/value qualifiers bit field.
Definition: abg-ir.cc:17347
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:17316
CV get_cv_quals() const
Getter of the const/volatile qualifier bit field.
Definition: abg-ir.cc:17342
type_base_sptr get_underlying_type() const
Getter of the underlying type.
Definition: abg-ir.cc:17361
virtual bool operator==(const decl_base &) const
Equality operator for qualified types.
Definition: abg-ir.cc:17187
string build_name(bool, bool internal=false) const
Build the name of the current instance of qualified type.
Definition: abg-ir.cc:17024
Abstracts a reference type.
Definition: abg-ir.h:2400
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Build and return the qualified name of the current instance of the reference_type_def.
Definition: abg-ir.cc:18131
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
Definition: abg-ir.cc:17909
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:18253
void set_pointed_to_type(type_base_sptr &pointed_to_type)
Setter of the pointed_to type of the current reference type.
Definition: abg-ir.cc:18003
virtual bool operator==(const decl_base &) const
Equality operator of the reference_type_def type.
Definition: abg-ir.cc:18073
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of reference_type_def.
Definition: abg-ir.cc:18232
A declaration that introduces a scope.
Definition: abg-ir.h:1809
virtual size_t get_num_anonymous_member_classes() const
Getter for the number of anonymous classes contained in this scope.
Definition: abg-ir.cc:7988
void remove_member_type(type_base_sptr t)
Remove a member type from the current class_or_union scope.
Definition: abg-ir.cc:8191
void insert_member_type(type_base_sptr t, declarations::iterator before)
Insert a member type.
Definition: abg-ir.cc:8150
void add_member_type(type_base_sptr t)
Add a member type to the current instance of class_or_union.
Definition: abg-ir.cc:8166
friend void remove_decl_from_scope(decl_base_sptr decl)
Remove a given decl from its scope.
Definition: abg-ir.cc:8525
virtual size_t get_num_anonymous_member_unions() const
Getter for the number of anonymous unions contained in this scope.
Definition: abg-ir.cc:8006
scopes & get_member_scopes()
Getter for the scopes carried by the current scope.
Definition: abg-ir.cc:8041
std::vector< scope_decl_sptr > scopes
Convenience typedef for a vector of scope_decl_sptr.
Definition: abg-ir.h:1820
bool is_empty() const
Test if the current scope is empty.
Definition: abg-ir.cc:8055
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:8471
const type_base_sptrs_type & get_member_types() const
Get the member types of this scope_decl.
Definition: abg-ir.cc:8125
std::vector< function_type_sptr > function_types
Convenience typedef for a vector of function_type_sptr.
Definition: abg-ir.h:1818
decl_base_sptr insert_member_decl(decl_base_sptr member, declarations::iterator before)
Insert a member decl to this scope, right before an element pointed to by a given iterator....
Definition: abg-ir.cc:8237
std::vector< decl_base_sptr > declarations
Convenience typedef for a vector of decl_base_sptr.
Definition: abg-ir.h:1816
friend decl_base_sptr insert_decl_into_scope(decl_base_sptr decl, scope_decl::declarations::iterator before, scope_decl *scope)
Inserts a declaration into a given scope, before a given IR child node of the scope.
Definition: abg-ir.cc:8544
const type_base_sptrs_type & get_sorted_canonical_types() const
Return a vector of sorted canonical types of the current scope.
Definition: abg-ir.cc:7924
bool find_iterator_for_member(const decl_base *, declarations::iterator &)
Find a member of the current scope and return an iterator on it.
Definition: abg-ir.cc:8423
virtual void remove_member_decl(decl_base_sptr member)
Remove a declaration from the current scope.
Definition: abg-ir.cc:8262
virtual decl_base_sptr add_member_decl(const decl_base_sptr &member)
Add a member decl to this scope. Note that user code should not use this, but rather use add_decl_to_...
Definition: abg-ir.cc:8099
type_base_sptr find_member_type(const string &name) const
Find a member type of a given name, inside the current scope_decl.
Definition: abg-ir.cc:8136
const declarations & get_member_decls() const
Getter for the member declarations carried by the current scope_decl.
Definition: abg-ir.cc:7948
const canonical_type_sptr_set_type & get_canonical_types() const
@eturn the set of canonical types of the the current scope.
Definition: abg-ir.cc:7912
const type_base_sptrs_type & get_sorted_member_types() const
Get the sorted member types of this scope_decl.
Definition: abg-ir.cc:8210
friend decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to one and if the d...
Definition: abg-ir.cc:8501
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
Definition: abg-ir.cc:8377
const declarations & get_sorted_member_decls() const
Getter for the sorted member declarations carried by the current scope_decl.
Definition: abg-ir.cc:7966
virtual size_t get_num_anonymous_member_enums() const
Getter for the number of anonymous enums contained in this scope.
Definition: abg-ir.cc:8024
virtual size_t get_hash() const
Return the hash value for the current instance of scope_decl.
Definition: abg-ir.cc:8302
A type that introduces a scope.
Definition: abg-ir.h:2171
virtual bool traverse(ir_node_visitor &)
Traverses an instance of scope_type_decl, visiting all the sub-types and decls that it might contain.
Definition: abg-ir.cc:16814
virtual bool operator==(const decl_base &) const
Equality operator between two scope_type_decl.
Definition: abg-ir.cc:16776
The base class of templates.
Definition: abg-ir.h:3539
const std::list< template_parameter_sptr > & get_template_parameters() const
Get the list of template parameters of the current instance of template_decl.
Definition: abg-ir.cc:26677
virtual ~template_decl()
Destructor.
Definition: abg-ir.cc:26702
void add_template_parameter(const template_parameter_sptr p)
Add a new template parameter to the current instance of template_decl.
Definition: abg-ir.cc:26669
virtual bool operator==(const decl_base &o) const
Equality operator.
Definition: abg-ir.cc:26711
Base class for a template parameter. Client code should use the more specialized type_template_parame...
Definition: abg-ir.h:3574
virtual ~template_parameter()
Destructor.
Definition: abg-ir.cc:26838
bool operator!=(const template_parameter &) const
Inequality operator.
Definition: abg-ir.cc:26834
Abstracts a template template parameter.
Definition: abg-ir.h:3704
virtual bool operator==(const type_base &) const
Equality operator.
Definition: abg-ir.cc:27096
This is the abstraction of the set of relevant artefacts (types, variable declarations,...
Definition: abg-ir.h:686
void set_address_size(char)
Setter of the address size in this translation unit.
Definition: abg-ir.cc:1482
const std::string & get_absolute_path() const
Get the concatenation of the build directory and the relative path of the translation unit.
Definition: abg-ir.cc:1397
void set_is_constructed(bool)
Setter of the 'is_constructed" flag. It says if the translation unit is fully constructed or not.
Definition: abg-ir.cc:1514
bool operator==(const translation_unit &) const
Compare the current translation unit against another one.
Definition: abg-ir.cc:1524
const corpus * get_corpus() const
Get the corpus this translation unit is a member of.
Definition: abg-ir.cc:1440
char get_address_size() const
Getter of the address size in this translation unit.
Definition: abg-ir.cc:1475
const std::string & get_compilation_dir_path() const
Get the path of the directory that was 'current' when the translation unit was compiled.
Definition: abg-ir.cc:1378
friend type_base_sptr synthesize_type_from_translation_unit(const type_base_sptr &type, translation_unit &tu)
In a translation unit, lookup a given type or synthesize it if it's a qualified type.
Definition: abg-ir.cc:14929
void set_corpus(corpus *)
Set the corpus this translation unit is a member of.
Definition: abg-ir.cc:1424
void set_language(language l)
Setter of the language of the source code of the translation unit.
Definition: abg-ir.cc:1341
void bind_function_type_life_time(function_type_sptr) const
Ensure that the life time of a function type is bound to the life time of the current translation uni...
Definition: abg-ir.cc:1550
const scope_decl_sptr & get_global_scope() const
Getter of the the global scope of the translation unit.
Definition: abg-ir.cc:1277
bool is_empty() const
Tests whether if the current translation unit contains ABI artifacts or not.
Definition: abg-ir.cc:1464
bool is_constructed() const
Getter of the 'is_constructed" flag. It says if the translation unit is fully constructed or not.
Definition: abg-ir.cc:1498
friend function_type_sptr synthesize_function_type_from_translation_unit(const function_type &fn_type, translation_unit &tu)
In a translation unit, lookup the sub-types that make up a given function type and if the sub-types a...
Definition: abg-ir.cc:15012
const std::string & get_path() const
Get the path of the current translation unit.
Definition: abg-ir.cc:1354
void set_compilation_dir_path(const std::string &)
Set the path of the directory that was 'current' when the translation unit was compiled.
Definition: abg-ir.cc:1389
location_manager & get_loc_mgr()
Getter of the location manager for the current translation unit.
Definition: abg-ir.cc:1448
void set_path(const string &)
Set the path associated to the current instance of translation_unit.
Definition: abg-ir.cc:1365
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse virtual function.
Definition: abg-ir.cc:1584
language
The language of the translation unit.
Definition: abg-ir.h:699
shared_ptr< scope_decl > global_scope_sptr
Convenience typedef for a shared pointer on a global_scope.
Definition: abg-ir.h:695
bool operator!=(const translation_unit &) const
Inequality operator.
Definition: abg-ir.cc:1539
const vector< function_type_sptr > & get_live_fn_types() const
Get the vector of function types that are used in the current translation unit.
Definition: abg-ir.cc:1320
const environment & get_environment() const
Getter of the environment of the current translation_unit.
Definition: abg-ir.cc:1327
const type_maps & get_types() const
Getter of the types of the current translation_unit.
Definition: abg-ir.cc:1304
language get_language() const
Getter of the language of the source code of the translation unit.
Definition: abg-ir.cc:1334
The interface for types which are feeling social and want to be visited during the traversal of a hie...
Definition: abg-traverse.h:39
An abstraction helper for type declarations.
Definition: abg-ir.h:1973
const interned_string & get_cached_pretty_representation(bool internal=false) const
Get the pretty representation of the current type.
Definition: abg-ir.cc:15916
type_base * get_naked_canonical_type() const
Getter of the canonical type pointer.
Definition: abg-ir.cc:15899
virtual size_t get_size_in_bits() const
Getter for the size of the type.
Definition: abg-ir.cc:15995
virtual bool traverse(ir_node_visitor &)
Default implementation of traversal for types. This function does nothing. It must be implemented by ...
Definition: abg-ir.cc:16021
friend type_base_sptr canonicalize(type_base_sptr)
Compute the canonical type of a given type.
Definition: abg-ir.cc:15752
virtual void on_canonical_type_set()
This method is invoked automatically right after the current instance of class_decl has been canonica...
Definition: abg-ir.cc:15630
virtual void set_size_in_bits(size_t)
Setter for the size of the type.
Definition: abg-ir.cc:15988
virtual bool operator!=(const type_base &) const
Inequality operator.
Definition: abg-ir.cc:15981
virtual bool operator==(const type_base &) const
Return true iff both type declarations are equal.
Definition: abg-ir.cc:15971
virtual size_t get_alignment_in_bits() const
Getter for the alignment of the type.
Definition: abg-ir.cc:16009
virtual void set_alignment_in_bits(size_t)
Setter for the alignment of the type.
Definition: abg-ir.cc:16002
type_base_sptr get_canonical_type() const
Getter of the canonical type of the current instance of type_base.
Definition: abg-ir.cc:15883
This abstracts a composition of types based on template type parameters. The result of the compositio...
Definition: abg-ir.h:3742
const type_base_sptr get_composed_type() const
Getter for the resulting composed type.
Definition: abg-ir.cc:27202
void set_composed_type(type_base_sptr t)
Setter for the resulting composed type.
Definition: abg-ir.cc:27209
virtual size_t get_hash() const
Get the hash value for the current instance.
Definition: abg-ir.cc:27216
A basic type declaration that introduces no scope.
Definition: abg-ir.h:2108
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation for the virtual qualified name builder for type_decl.
Definition: abg-ir.cc:16608
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:16687
virtual bool operator!=(const type_base &) const
Return true if both types equals.
Definition: abg-ir.cc:16546
virtual bool operator==(const type_base &) const
Return true if both types equals.
Definition: abg-ir.cc:16502
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of type_decl.
Definition: abg-ir.cc:16667
This is a type that aggregates maps of all the kinds of types that are supported by libabigail.
Definition: abg-ir.h:593
istring_type_base_wptrs_map_type & typedef_types()
Getter for the map that associates the name of a typedef to the vector of instances of typedef_decl_s...
Definition: abg-ir.cc:661
istring_type_base_wptrs_map_type & function_types()
Getter for the map that associates the name of a function type to the vector of instances of function...
Definition: abg-ir.cc:764
istring_type_base_wptrs_map_type & reference_types()
Getter for the map that associates the name of a reference type to the vector of instances of referen...
Definition: abg-ir.cc:715
const istring_type_base_wptrs_map_type & class_types() const
Getter for the map that associates the name of a class type to the vector of instances of class_decl_...
Definition: abg-ir.cc:619
istring_type_base_wptrs_map_type & union_types()
Getter for the map that associates the name of a union type to the vector of instances of union_decl_...
Definition: abg-ir.cc:633
istring_type_base_wptrs_map_type & array_types()
Getter for the map that associates the name of an array type to the vector of instances of array_type...
Definition: abg-ir.cc:729
istring_type_base_wptrs_map_type & enum_types()
Getter for the map that associates the name of an enum type to the vector of instances of enum_type_d...
Definition: abg-ir.cc:647
bool empty() const
Test if the type_maps is empty.
Definition: abg-ir.cc:587
istring_type_base_wptrs_map_type & qualified_types()
Getter for the map that associates the name of a qualified type to the vector of instances of qualifi...
Definition: abg-ir.cc:674
istring_type_base_wptrs_map_type & ptr_to_mbr_types()
Getter for the map that associates the name of a pointer-to-member type to the vector of instances of...
Definition: abg-ir.cc:694
const vector< type_base_wptr > & get_types_sorted_by_name() const
Getter of all types types sorted by their pretty representation.
Definition: abg-ir.cc:1213
istring_type_base_wptrs_map_type & pointer_types()
Getter for the map that associates the name of a pointer type to the vector of instances of pointer_t...
Definition: abg-ir.cc:687
const istring_type_base_wptrs_map_type & basic_types() const
Getter for the map that associates the name of a basic type to the vector instances of type_decl_sptr...
Definition: abg-ir.cc:605
const istring_type_base_wptrs_map_type & subrange_types() const
Getter for the map that associates the name of a subrange type to the vector of instances of array_ty...
Definition: abg-ir.cc:750
The base class of both types and declarations.
Definition: abg-ir.h:1368
void set_translation_unit(translation_unit *)
Set the translation_unit this ABI artifact belongs to.
Definition: abg-ir.cc:4491
bool get_is_artificial() const
Getter of the flag that says if the artefact is artificial.
Definition: abg-ir.cc:4305
virtual ~type_or_decl_base()
The destructor of the type_or_decl_base type.
Definition: abg-ir.cc:4294
location & get_artificial_location() const
Getter of the artificial location of the artifact.
Definition: abg-ir.cc:4451
bool has_artificial_location() const
Test if the current ABI artifact carries an artificial location.
Definition: abg-ir.cc:4458
friend type_or_decl_base::type_or_decl_kind & operator|=(type_or_decl_base::type_or_decl_kind &, type_or_decl_base::type_or_decl_kind)
bitwise "|=" operator for the type_or_decl_base::type_or_decl_kind bitmap type.
Definition: abg-ir.cc:4255
const corpus * get_corpus() const
Get the corpus this ABI artifact belongs to.
Definition: abg-ir.cc:4483
enum type_or_decl_kind kind() const
Getter for the "kind" property of type_or_decl_base type.
Definition: abg-ir.cc:4328
void set_is_artificial(bool)
Setter of the flag that says if the artefact is artificial.
Definition: abg-ir.cc:4317
virtual bool traverse(ir_node_visitor &)
Traverse the the ABI artifact.
Definition: abg-ir.cc:4516
const void * runtime_type_instance() const
Getter of the pointer to the runtime type sub-object of the current instance.
Definition: abg-ir.cc:4348
friend class_decl * is_class_type(const type_or_decl_base *)
Test whether a type is a class.
Definition: abg-ir.cc:10832
friend type_or_decl_base::type_or_decl_kind & operator&=(type_or_decl_base::type_or_decl_kind &, type_or_decl_base::type_or_decl_kind)
bitwise "A&=" operator for the type_or_decl_base::type_or_decl_kind bitmap type.
Definition: abg-ir.cc:4275
const void * type_or_decl_base_pointer() const
Getter of the pointer to either the type_base sub-object of the current instance if it's a type,...
Definition: abg-ir.cc:4383
friend decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
Definition: abg-ir.cc:10481
bool hashing_started() const
Getter for the 'hashing_started' property.
Definition: abg-ir.cc:4401
void set_artificial_location(const location &)
Setter of the artificial location of the artificat.
Definition: abg-ir.cc:4433
type_or_decl_kind
This is a bitmap type which instance is meant to contain the runtime type of a given ABI artifact....
Definition: abg-ir.h:1382
const environment & get_environment() const
Getter of the environment of the current ABI artifact.
Definition: abg-ir.cc:4415
friend type_or_decl_base::type_or_decl_kind operator|(type_or_decl_base::type_or_decl_kind, type_or_decl_base::type_or_decl_kind)
bitwise "OR" operator for the type_or_decl_base::type_or_decl_kind bitmap type.
Definition: abg-ir.cc:4245
friend type_or_decl_base::type_or_decl_kind operator&(type_or_decl_base::type_or_decl_kind, type_or_decl_base::type_or_decl_kind)
bitwise "AND" operator for the type_or_decl_base::type_or_decl_kind bitmap type.
Definition: abg-ir.cc:4265
friend type_base * is_type(const type_or_decl_base *)
Test whether a declaration is a type.
Definition: abg-ir.cc:10554
const translation_unit * get_translation_unit() const
Get the translation_unit this ABI artifact belongs to.
Definition: abg-ir.cc:4508
Abstracts a type template parameter.
Definition: abg-ir.h:3620
virtual bool operator==(const type_base &) const
Equality operator.
Definition: abg-ir.cc:26880
The abstraction of a typedef declaration.
Definition: abg-ir.h:2889
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation of the virtual "get_qualified_name" method.
Definition: abg-ir.cc:20510
void set_underlying_type(const type_base_sptr &)
Setter ofthe underlying type of the typedef.
Definition: abg-ir.cc:20495
virtual size_t get_size_in_bits() const
Return the size of the typedef.
Definition: abg-ir.cc:20345
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:20542
type_base_sptr get_underlying_type() const
Getter of the underlying type of the typedef.
Definition: abg-ir.cc:20488
virtual bool operator==(const decl_base &) const
Equality operator.
Definition: abg-ir.cc:20425
virtual size_t get_alignment_in_bits() const
Return the alignment of the typedef.
Definition: abg-ir.cc:20362
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build a pretty representation for a typedef_decl.
Definition: abg-ir.cc:20466
Abstracts a union type declaration.
Definition: abg-ir.h:4483
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:26471
virtual bool operator==(const decl_base &) const
Comparison operator for union_decl.
Definition: abg-ir.cc:26411
virtual ~union_decl()
Destructor of the union_decl type.
Definition: abg-ir.cc:26544
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Getter of the pretty representation of the current instance of union_decl.
Definition: abg-ir.cc:26378
Abstracts a variable declaration.
Definition: abg-ir.h:3008
binding get_binding() const
Getter of the binding of the variable.
Definition: abg-ir.cc:20656
void set_type(type_base_sptr &)
Setter of the type of the variable.
Definition: abg-ir.cc:20638
void set_binding(binding b)
Setter of the binding of the variable.
Definition: abg-ir.cc:20663
friend uint64_t get_data_member_offset(const var_decl_sptr m)
Get the offset of a data member.
Definition: abg-ir.cc:6365
var_decl_sptr clone() const
Create a new var_decl that is a clone of the current one.
Definition: abg-ir.cc:20701
virtual const interned_string & get_qualified_name(bool internal=false) const
Get the qualified name of a given variable or data member.
Definition: abg-ir.cc:20964
const type_base * get_naked_type() const
Getter of the type of the variable.
Definition: abg-ir.cc:20649
friend bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
Definition: abg-ir.cc:6510
const type_base_sptr get_type() const
Getter of the type of the variable.
Definition: abg-ir.cc:20631
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Definition: abg-ir.cc:21126
string get_anon_dm_reliable_name(bool qualified=true) const
Get a name that is valid even for an anonymous data member.
Definition: abg-ir.cc:21103
friend uint64_t get_absolute_data_member_offset(const var_decl &m)
Get the absolute offset of a data member.
Definition: abg-ir.cc:6439
void set_symbol(const elf_symbol_sptr &sym)
Sets the underlying ELF symbol for the current variable.
Definition: abg-ir.cc:20678
friend void set_data_member_offset(var_decl_sptr m, uint64_t o)
Set the offset of a data member into its containing class.
Definition: abg-ir.cc:6333
friend void set_data_member_is_laid_out(var_decl_sptr m, bool l)
Set a flag saying if a data member is laid out.
Definition: abg-ir.cc:6496
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using var_decl::set_symbol(...
Definition: abg-ir.cc:20694
virtual bool operator==(const decl_base &) const
Comparison operator of var_decl.
Definition: abg-ir.cc:20889
virtual size_t get_hash() const
Return the hash value for the current instance.
Definition: abg-ir.cc:20931
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return the pretty representation of this variable.
Definition: abg-ir.cc:20994
interned_string get_id() const
Return an ID that tries to uniquely identify the variable inside a program or a library.
Definition: abg-ir.cc:20908
string get_pretty_representation(diff *d)
Get a copy of the pretty representation of a diff node.
shared_ptr< reference_type_def > reference_type_def_sptr
Convenience typedef for a shared pointer on a reference_type_def.
Definition: abg-fwd.h:232
bool enum_has_non_name_change(const enum_type_decl &l, const enum_type_decl &r, change_kind *k)
Test if two enums differ, but not by a name change.
Definition: abg-ir.cc:19723
shared_ptr< method_type > method_type_sptr
Convenience typedef for shared pointer to method_type.
Definition: abg-fwd.h:218
unordered_map< string, type_base_sptr > string_type_base_sptr_map_type
A convenience typedef for a map which key is a string and which value is a type_base_sptr.
Definition: abg-ir.h:563
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
Definition: abg-fwd.h:266
access_specifier
Access specifier for class members.
Definition: abg-ir.h:879
bool function_decls_alias(const function_decl &f1, const function_decl &f2)
Test if two function declarations are aliases.
Definition: abg-ir.cc:22524
shared_ptr< class_tdecl > class_tdecl_sptr
Convenience typedef for a shared pointer on a class_tdecl.
Definition: abg-fwd.h:286
corpus::origin operator|=(corpus::origin &l, corpus::origin r)
Bitwise |= operator for the corpus::origin type.
Definition: abg-corpus.cc:1645
void fixup_virtual_member_function(method_decl_sptr method)
When a virtual member function has seen its virtualness set by set_member_function_is_virtual(),...
Definition: abg-ir.cc:25150
bool equals_modulo_cv_qualifier(const array_type_def *l, const array_type_def *r)
Test if two variables are equals modulo CV qualifiers.
Definition: abg-ir.cc:19308
unordered_set< type_or_decl_base_sptr, type_or_decl_hash, type_or_decl_equal > artifact_sptr_set_type
A convenience typedef for a hash set of type_or_decl_base_sptr.
Definition: abg-ir.h:550
string translation_unit_language_to_string(translation_unit::language l)
Converts a translation_unit::language enumerator into a string.
Definition: abg-ir.cc:1596
weak_ptr< type_base > type_base_wptr
Convenience typedef for a weak pointer on a type_base.
Definition: abg-fwd.h:129
class_decl::base_spec * is_class_base_spec(const type_or_decl_base *tod)
Test if an ABI artifact is a class base specifier.
Definition: abg-ir.cc:25860
integral_type::modifiers_type operator~(integral_type::modifiers_type l)
Bitwise one's complement operator for integral_type::modifiers_type.
Definition: abg-ir.cc:16078
array_type_def::subrange_type * is_subrange_type(const type_or_decl_base *type)
Test if a type is an array_type_def::subrange_type.
Definition: abg-ir.cc:11873
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
Definition: abg-ir.h:888
unordered_set< const type_or_decl_base *, type_or_decl_hash, type_or_decl_equal > artifact_ptr_set_type
A convenience typedef for a hash set of const type_or_decl_base*.
Definition: abg-ir.h:555
change_kind
A bitfield that gives callers of abigail::ir::equals() some insight about how different two internal ...
Definition: abg-ir.h:1323
@ LOCAL_TYPE_CHANGE_KIND
This means that a given IR artifact has a local type change.
Definition: abg-ir.h:1327
@ SUBTYPE_CHANGE_KIND
This means that a given IR artifact has changes in some of its sub-types, with respect to the other a...
Definition: abg-ir.h:1343
@ ALL_LOCAL_CHANGES_MASK
Testing (anding) against this mask means that a given IR artifact has local differences,...
Definition: abg-ir.h:1338
@ LOCAL_NON_TYPE_CHANGE_KIND
This means that a given IR artifact has a local non-type change. That is a change that is carried by ...
Definition: abg-ir.h:1332
bool operator==(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep comparison operator for pointers to translation units.
Definition: abg-ir.cc:1779
vector< type_base_sptr > type_base_sptrs_type
Helper typedef for a vector of shared pointer to a type_base.
Definition: abg-ir.h:119
string get_pretty_representation(const type_or_decl_base *tod, bool internal)
Build and return a copy of the pretty representation of an ABI artifact that could be either a type o...
Definition: abg-ir.cc:9332
std::vector< elf_symbol_sptr > elf_symbols
Convenience typedef for a vector of elf_symbol.
Definition: abg-ir.h:904
shared_ptr< template_parameter > template_parameter_sptr
Convenience typedef for shared pointer to template parameter.
Definition: abg-fwd.h:311
shared_ptr< class_decl > class_decl_sptr
Convenience typedef for a shared pointer on a class_decl.
Definition: abg-fwd.h:190
bool string_to_elf_symbol_type(const string &s, elf_symbol::type &t)
Convert a string representing a symbol type into an elf_symbol::type.
Definition: abg-ir.cc:2969
void fns_to_str(vector< function_decl * >::const_iterator a_begin, vector< function_decl * >::const_iterator a_end, vector< function_decl * >::const_iterator b_begin, vector< function_decl * >::const_iterator b_end, std::ostream &o)
For each sequence of functions given in argument, generate a sequence of string that matches a given ...
Definition: abg-ir.cc:29629
string get_name(const type_or_decl_base *tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type or a decl.
Definition: abg-ir.cc:8736
void set_member_access_specifier(decl_base &d, access_specifier a)
Sets the access specifier for a class member.
Definition: abg-ir.cc:5778
shared_ptr< function_type > function_type_sptr
Convenience typedef for a shared pointer on a function_type.
Definition: abg-fwd.h:207
shared_ptr< typedef_decl > typedef_decl_sptr
Convenience typedef for a shared pointer on a typedef_decl.
Definition: abg-fwd.h:164
std::ostream & operator<<(std::ostream &o, elf_symbol::type t)
Serialize an instance of symbol_type and stream it to a given output stream.
Definition: abg-ir.cc:2841
bool var_equals_modulo_types(const var_decl &l, const var_decl &r, change_kind *k)
Compares two instances of var_decl without taking their type into account.
Definition: abg-ir.cc:20762
void sort_types(const canonical_type_sptr_set_type &types, vector< type_base_sptr > &result)
Sort types in a hopefully stable manner.
Definition: abg-ir.cc:3607
corpus::origin operator|(corpus::origin l, corpus::origin r)
Bitwise | operator for the corpus::origin type.
Definition: abg-corpus.cc:1631
bool elf_symbol_is_function(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
Definition: abg-ir.cc:3050
bool is_cplus_plus_language(translation_unit::language l)
Test if a language enumerator designates the C++ language.
Definition: abg-ir.cc:1742
std::unordered_map< string, elf_symbol_sptr > string_elf_symbol_sptr_map_type
Convenience typedef for a map which key is a string and which value if the elf symbol of the same nam...
Definition: abg-ir.h:896
decl_base_sptr insert_decl_into_scope(decl_base_sptr decl, scope_decl::declarations::iterator before, scope_decl *scope)
Inserts a declaration into a given scope, before a given IR child node of the scope.
Definition: abg-ir.cc:8544
unordered_map< interned_string, type_base_wptrs_type, hash_interned_string > istring_type_base_wptrs_map_type
A convenience typedef for a map which key is an interned_string and which value is a vector of type_b...
Definition: abg-fwd.h:149
bool function_decl_is_less_than(const function_decl &f, const function_decl &s)
Test if the pretty representation of a given function_decl is lexicographically less then the pretty ...
Definition: abg-ir.cc:27971
bool elf_symbols_alias(const elf_symbol &s1, const elf_symbol &s2)
Test if two symbols alias.
Definition: abg-ir.cc:2772
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
Definition: abg-fwd.h:253
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
Definition: abg-corpus.cc:1659
shared_ptr< scope_decl > scope_decl_sptr
Convenience typedef for a shared pointer on a scope_decl.
Definition: abg-fwd.h:261
bool string_to_elf_symbol_binding(const string &s, elf_symbol::binding &b)
Convert a string representing a an elf symbol binding into an elf_symbol::binding.
Definition: abg-ir.cc:3002
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
Definition: abg-fwd.h:121
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
Definition: abg-fwd.h:137
shared_ptr< string_elf_symbols_map_type > string_elf_symbols_map_sptr
Convenience typedef for a shared pointer to string_elf_symbols_map_type.
Definition: abg-ir.h:913
shared_ptr< context_rel > context_rel_sptr
A convenience typedef for shared pointers to context_rel.
Definition: abg-ir.h:1237
shared_ptr< string_elf_symbol_sptr_map_type > string_elf_symbol_sptr_map_sptr
Convenience typedef for a shared pointer to an string_elf_symbol_sptr_map_type.
Definition: abg-ir.h:901
qualified_type_def_sptr lookup_qualified_type(const interned_string &type_name, const translation_unit &tu)
Lookup a qualified type from a translation unit.
Definition: abg-ir.cc:12326
bool is_java_language(translation_unit::language l)
Test if a language enumerator designates the Java language.
Definition: abg-ir.cc:1756
function_decl::parameter * is_function_parameter(const type_or_decl_base *tod)
Test whether a declaration is a function_decl.
Definition: abg-ir.cc:10458
bool equals(const decl_base &l, const decl_base &r, change_kind *k)
Compares two instances of decl_base.
Definition: abg-ir.cc:5360
bool string_to_elf_symbol_visibility(const string &s, elf_symbol::visibility &v)
Convert a string representing a an elf symbol visibility into an elf_symbol::visibility.
Definition: abg-ir.cc:3027
weak_ptr< elf_symbol > elf_symbol_wptr
A convenience typedef for a weak pointer to elf_symbol.
Definition: abg-ir.h:891
shared_ptr< pointer_type_def > pointer_type_def_sptr
Convenience typedef for a shared pointer on a pointer_type_def.
Definition: abg-fwd.h:223
bool is_enumerator_present_in_enum(const enum_type_decl::enumerator &enr, const enum_type_decl &enom)
Test if a given enumerator is found present in an enum.
Definition: abg-ir.cc:19804
translation_unit::language string_to_translation_unit_language(const string &l)
Parse a string representing a language into a translation_unit::language enumerator into a string.
Definition: abg-ir.cc:1666
const function_decl::parameter * get_function_parameter(const decl_base *fun, unsigned parm_index)
Get the function parameter designated by its index.
Definition: abg-ir.cc:28292
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
Definition: abg-ir.cc:11717
bool is_c_language(translation_unit::language l)
Test if a language enumerator designates the C language.
Definition: abg-ir.cc:1728
method_decl * is_method_decl(const type_or_decl_base *d)
Test if a function_decl is actually a method_decl.
Definition: abg-ir.cc:24982
access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
Definition: abg-ir.cc:5749
shared_ptr< enum_type_decl > enum_type_decl_sptr
Convenience typedef for shared pointer to a enum_type_decl.
Definition: abg-fwd.h:172
vector< type_base * > type_base_ptrs_type
Helper typedef for a vector of pointer to type_base.
Definition: abg-ir.h:116
unordered_set< uintptr_t > pointer_set
A convenience typedef for an unordered set of pointer values.
Definition: abg-ir.h:100
location get_location(const type_base_sptr &type)
Get the location of the declaration of a given type.
Definition: abg-ir.cc:8816
unordered_map< interned_string, type_base_wptr, hash_interned_string > istring_type_base_wptr_map_type
A convenience typedef for a map which key is an interned_string and which value is a type_base_wptr.
Definition: abg-ir.h:568
vector< namespace_decl_sptr > namespaces_type
A convenience typedef for vectors of namespace_decl_sptr.
Definition: abg-ir.h:2219
interned_string get_name_of_qualified_type(const type_base_sptr &underlying_type, qualified_type_def::CV quals, bool qualified, bool internal)
Get the name of a qualified type, given the underlying type and its qualifiers.
Definition: abg-ir.cc:9112
shared_ptr< template_decl > template_decl_sptr
Convenience typedef for a shared pointer to template_decl.
Definition: abg-fwd.h:303
string get_string_representation_of_cv_quals(const qualified_type_def::CV cv_quals)
Get the string representation of a CV qualifier bitmap.
Definition: abg-ir.cc:8706
std::set< translation_unit_sptr, shared_translation_unit_comp > translation_units
Convenience typedef for an ordered set of translation_unit_sptr.
Definition: abg-ir.h:851
const var_decl * lookup_data_member(const type_base *type, const char *dm_name)
Look for a data member of a given class, struct or union type and return it.
Definition: abg-ir.cc:28249
shared_ptr< type_decl > type_decl_sptr
Convenience typedef for a shared pointer on a type_decl.
Definition: abg-fwd.h:158
translation_unit * get_translation_unit(const decl_base &decl)
Return the translation unit a declaration belongs to.
Definition: abg-ir.cc:10257
unordered_set< type_base_sptr, canonical_type_hash > canonical_type_sptr_set_type
Helper typedef for an unordered set of type_base_sptr which uses pointer value to tell its members ap...
Definition: abg-ir.h:113
bool is_ada_language(translation_unit::language l)
Test if a language enumerator designates the Ada language.
Definition: abg-ir.cc:1765
unordered_map< interned_string, type_or_decl_base_sptr, hash_interned_string > istring_type_or_decl_base_sptr_map_type
A convenience typedef for a map which key is an interned_string and which value is a type_base_wptr.
Definition: abg-ir.h:575
corpus::origin operator&=(corpus::origin &l, corpus::origin r)
Bitwise &= operator for the corpus::origin type.
Definition: abg-corpus.cc:1673
bool operator!=(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep inequality operator for pointers to translation units.
Definition: abg-ir.cc:1798
function_decl * is_function_decl(const type_or_decl_base *d)
Test whether a declaration is a function_decl.
Definition: abg-ir.cc:10429
bool elf_symbol_is_variable(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
Definition: abg-ir.cc:3060
std::unordered_map< string, elf_symbols > string_elf_symbols_map_type
Convenience typedef for a map which key is a string and which value is a vector of elf_symbol.
Definition: abg-ir.h:909
method_decl_sptr copy_member_function(const class_or_union_sptr &t, const method_decl_sptr &method)
Copy a method of a class_or_union into a new class_or_union.
Definition: abg-ir.cc:23980
shared_ptr< function_tdecl > function_tdecl_sptr
Convenience typedef for a shared pointer on a function_tdecl.
Definition: abg-fwd.h:291
unordered_map< string, type_base_wptr > string_type_base_wptr_map_type
A convenience typedef for a map which key is a string and which value is a type_base_wptr.
Definition: abg-ir.h:559
bool maybe_compare_as_member_decls(const decl_base &l, const decl_base &r, change_kind *k)
Compare the properties that belong to the "is-a-member-relation" of a decl.
Definition: abg-ir.cc:5260
Toplevel namespace for libabigail.
bool operator==(const std::string &l, const interned_string &r)
Equality operator.
Definition: abg-ir.cc:152
A functor to hash instances of interned_string.
Functor to hash a canonical type by using its pointer value.
Definition: abg-ir.h:104
size_t operator()(const type_base_sptr &l) const
Hash a type by returning the pointer value of its canonical type.
Definition: abg-ir.cc:7851
The hashing functor for class_decl::base_spec.
Definition: abg-ir.h:4885
Hasher for the class_decl type.
Definition: abg-ir.h:4386
size_t operator()(const class_decl &t) const
Compute a hash for a class_decl.
Definition: abg-hash.cc:686
Hasher for the class_or_union type.
Definition: abg-ir.h:4218
size_t operator()(const class_or_union &t) const
Compute a hash for a class_or_union.
Definition: abg-hash.cc:607
The private data of the environment type.
Definition: abg-ir-priv.h:389
A hashing functor fo instances and pointers of function_decl.
Definition: abg-ir.h:4851
size_t operator()(const function_decl &t) const
Compute a hash value for an instance of function_decl.
Definition: abg-hash.cc:396
A hashing functor for a function_decl::parameter.
Definition: abg-ir.h:3365
Equality functor for instances of function_decl.
Definition: abg-ir.h:4861
bool operator()(const function_decl *l, const function_decl *r) const
Tests if two pointers to function_decl are equal.
Definition: abg-ir.h:4873
The hashing functor for function_type.
Definition: abg-ir.h:3470
size_t operator()(const function_type &t) const
Hashing function for function_type.
Definition: abg-hash.cc:501
The type of the private data of the function_type type.
Definition: abg-ir-priv.h:1538
The base of an entity of the intermediate representation that is to be traversed.
Definition: abg-ir.h:462
virtual bool traverse(ir_node_visitor &v)
Traverse a given IR node and its children, calling an visitor on each node.
Definition: abg-ir.cc:29187
The hashing functor for member_base.
Definition: abg-ir.h:4892
The hashing functor for member_class_template.
Definition: abg-ir.h:4906
The hashing functor for member_function_template.
Definition: abg-ir.h:4899
The base class for the visitor type hierarchy used for traversing a hierarchy of nodes.
Definition: abg-traverse.h:28
Hasher for the non_type_tparameter type.
Definition: abg-ir.h:3692
size_t operator()(const non_type_tparameter &t) const
Compute a hash value for a non_type_tparameter.
Definition: abg-hash.cc:828
Hasher for the scope_decl type.
Definition: abg-ir.h:1938
size_t operator()(const scope_decl &d) const
Hashing operator for the scope_decl type.
Definition: abg-hash.cc:169
A comparison functor to compare translation units based on their absolute paths.
Definition: abg-ir.h:834
bool operator()(const translation_unit_sptr &lhs, const translation_unit_sptr &rhs) const
Compare two translations units based on their absolute paths.
Definition: abg-ir.h:843
Private type to hold private members of translation_unit.
Definition: abg-ir-priv.h:143
size_t operator()(const type_base *t) const
A hashing function for type declarations.
Definition: abg-hash.cc:988
Hash functor for instances of type_base.
Definition: abg-ir.h:2052
size_t operator()(const type_base &t) const
Hash function for an instance of type_base.
Definition: abg-hash.cc:95
Definition of the private data of type_base.
Definition: abg-ir-priv.h:179
Hasher for the type_composition type.
Definition: abg-ir.h:3769
size_t operator()(const type_composition &t) const
Compute a hash value for a type_composition type.
Definition: abg-hash.cc:892
A comparison functor to compare pointer to instances of type_or_decl_base.
Definition: abg-ir.h:3242
bool operator()(const type_or_decl_base_sptr &f, const type_or_decl_base_sptr &s)
Comparison operator for ABI artifacts.
Definition: abg-ir.h:3276
bool operator()(const type_or_decl_base *f, const type_or_decl_base *s)
Comparison operator for ABI artifacts.
Definition: abg-ir.h:3251
The comparison functor for using instances of type_or_decl_base as values in a hash map or set.
Definition: abg-ir.h:508
bool operator()(const type_or_decl_base_sptr &l, const type_or_decl_base_sptr &r) const
The function-call operator to compare the string representations of two ABI artifacts.
Definition: abg-ir.h:542
bool operator()(const type_or_decl_base *l, const type_or_decl_base *r) const
The function-call operator to compare the string representations of two ABI artifacts.
Definition: abg-ir.h:522
The hashing functor for using instances of type_or_decl_base as values in a hash map or set.
Definition: abg-ir.h:476
size_t operator()(const type_or_decl_base *artifact) const
Function-call Operator to hash the string representation of an ABI artifact.
Definition: abg-ir.h:486
size_t operator()(const type_or_decl_base_sptr &artifact) const
Function-call Operator to hash the string representation of an ABI artifact.
Definition: abg-ir.h:501
A predicate for deep equality of instances of type_base*.
Definition: abg-ir.h:2066
A predicate for deep equality of instances of shared_ptr<type_base>
Definition: abg-ir.h:2086
A hashing functor for instances and pointers of var_decl.
Definition: abg-ir.h:4820
size_t operator()(const var_decl &t) const
Compute a hash for an instance var_decl.
Definition: abg-hash.cc:357
A comparison functor for pointers to var_decl.
Definition: abg-ir.h:4830
bool operator()(const var_decl *l, const var_decl *r) const
Return true if the two instances of var_decl are equal.
Definition: abg-ir.h:4839