libabigail
Loading...
Searching...
No Matches
abg-corpus.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-2026 Red Hat, Inc.
5
6/// @file
7
8#ifndef __ABG_CORPUS_H__
9#define __ABG_CORPUS_H__
10
11#include <map>
12#include <abg-ir.h>
13
14namespace abigail
15{
16
17namespace ir
18{
19
20/// Hashing functor for canonicalized decl types.
21template<typename DeclType>
23{
24 /// Hashing operator for decls that have canonicalized decl
25 /// types.
26 ///
27 /// The hash is the pointer value of the canonical type of the type
28 /// of the decl.
29 ///
30 /// @param f the decl to canonicalize.
31 ///
32 /// @return the pointer value of the canonical type of the type of
33 /// the decl.
34 size_t
35 operator()(const DeclType* f) const
36 {
37 if (!f || !f->get_type())
38 return 0;
39 return reinterpret_cast<size_t>(get_exemplar_type(f->get_type().get()));
40 }
41};//end struct c11d_decl_hasher
42
43/// Functor to compare decls in hash maps or sets of decls
44/// with canonicalized types.
45template<typename DeclType>
47{
48 /// Comparison operator for decls with canonicalized types.
49 ///
50 /// @param f the first decl to consider.
51 ///
52 /// @param s the second decl to consider.
53 ///
54 /// @return true iff @p f equals @p s.
55 bool
56 operator()(const DeclType* f, const DeclType* s) const
57 {
58 if (f && s)
59 return *f == *s;
60 return f == s;
61 }
62}; //end struct c11d_decl_eq
63
64/// A set of hashed function decls. The hash value is the canonical
65/// type of the function. Note that the function types must have been
66/// canonicalized prior to be added to this set.
67typedef unordered_set<const function_decl*,
70
71/// A set of hashed var decls. The hash value is the canonical type
72/// of the var. Note that the var types must have been canonicalized
73/// prior to be added to this set.
74typedef unordered_set<const var_decl*,
77
78/// A map that associates an interned string with a set of hashed
79/// function decls.
80typedef unordered_map<interned_string,
83
84/// An ordered map that associates an interned string with a set of
85/// hashed function decls.
86typedef std::map<interned_string,
88
89/// This is the abstraction of a set of translation units (themselves
90/// seen as bundles of unitary abi artefacts like types and decls)
91/// bundled together as a corpus. A corpus is thus the Application
92/// binary interface of a program, a library or just a set of modules
93/// put together.
94class corpus
95{
96public:
97 /// A convenience typedef for std::vector<string>.
98 typedef vector<string> strings_type;
99
100 /// Convenience typedef for std::vector<abigail::ir::function_decl*>
101 typedef vector<const function_decl*> functions;
102
103 /// Convenience typedef for std::unordered_set<const function_decl*>
104 typedef std::unordered_set<const function_decl*> functions_set;
105
106 ///Convenience typedef for std::vector<abigail::ir::var_decl*>
107 typedef vector<var_decl_sptr> variables;
108
109 /// Convenience typedef for std::unordered_set<const var_decl*>.
110 typedef std::unordered_set<var_decl_sptr> variables_set;
111
113
114 /// Convenience typedef for shared_ptr<exported_decls_builder>.
115 typedef shared_ptr<exported_decls_builder> exported_decls_builder_sptr;
116
117 /// This abstracts where the corpus comes from. That is, either it
118 /// has been read from the native xml format, from DWARF or built
119 /// artificially using the library's API.
121 {
122 ARTIFICIAL_ORIGIN = 0,
123 NATIVE_XML_ORIGIN = 1,
124 ELF_ORIGIN = 1 << 1,
125 DWARF_ORIGIN = 1 << 2,
126 CTF_ORIGIN = 1 << 3,
127 BTF_ORIGIN = 1 << 4,
128 LINUX_KERNEL_BINARY_ORIGIN = 1 << 5
129 };
130
131private:
132 corpus();
133
134 void set_group(corpus_group*);
135 void init_format_version();
136
137public:
138 struct priv;
139 std::unique_ptr<priv> priv_;
140
141 corpus(const ir::environment&, const string& path= "");
142
143 virtual ~corpus();
144
145 const environment&
146 get_environment() const;
147
148 bool
149 do_log() const;
150
151 void
152 do_log(bool);
153
154 void
156
157 const translation_units&
158 get_translation_units() const;
159
161 find_translation_unit(const string &path) const;
162
163 void
165
166 type_maps&
167 get_types();
168
169 const type_maps&
170 get_types() const;
171
172 type_maps&
174
175 const type_maps&
176 get_type_per_loc_map() const;
177
178 void mark_non_reachable_types();
179
180 virtual bool
182
183 bool
185
186 void
187 remove_type_from_reachable_types(const type_base&);
188
189 bool
191
194
196 get_sorted_types_not_reachable_from_public_interfaces() const;
197
198 const corpus_group*
199 get_group() const;
200
202 get_group();
203
204 origin
205 get_origin() const;
206
207 void
209
210 string&
212
213 void
214 set_format_major_version_number(const string&);
215
216 string&
218
219 void
220 set_format_minor_version_number(const string&);
221
222 string&
223 get_path() const;
224
225 void
226 set_path(const string&);
227
228 const vector<string>&
229 get_needed() const;
230
231 void
232 set_needed(const vector<string>&);
233
234 const string&
235 get_soname();
236
237 void
238 set_soname(const string&);
239
240 const string&
241 get_architecture_name() const;
242
243 void
244 set_architecture_name(const string&);
245
246 virtual bool
247 is_empty() const;
248
249 bool
250 operator==(const corpus&) const;
251
252 void
254
256 get_symtab() const;
257
258 virtual const string_elf_symbols_map_type&
259 get_fun_symbol_map() const;
260
263
264 virtual const elf_symbols&
266
267 const elf_symbols&
269
270 virtual const string_elf_symbols_map_type&
271 get_var_symbol_map() const;
272
275
276 virtual const elf_symbols&
278
279 const elf_symbols&
281
282 const elf_symbol_sptr
283 lookup_function_symbol(const string& n) const;
284
285 const elf_symbol_sptr
286 lookup_function_symbol(const string& symbol_name,
287 const elf_symbol::version& version) const;
288
289 const elf_symbol_sptr
290 lookup_function_symbol(const elf_symbol& symbol) const;
291
292 const elf_symbol_sptr
293 lookup_function_symbol(const elf_symbol_sptr& symbol) const;
294
295 const elf_symbol_sptr
296 lookup_variable_symbol(const string& n) const;
297
298 const elf_symbol_sptr
299 lookup_variable_symbol(const string& symbol_name,
300 const elf_symbol::version& version) const;
301
302 const elf_symbol_sptr
303 lookup_variable_symbol(const elf_symbol& symbol) const;
304
305 virtual const functions&
306 get_functions() const;
307
308 virtual const std::unordered_set<const function_decl*>*
309 lookup_functions(const interned_string& id) const;
310
311 virtual const std::unordered_set<const function_decl*>*
312 lookup_functions(const char* id) const;
313
314 virtual const std::unordered_set<const function_decl*>*
315 lookup_functions(const string& id) const;
316
317 virtual const std::unordered_set<var_decl_sptr>*
318 lookup_variables(const interned_string& id) const;
319
320 virtual const std::unordered_set<var_decl_sptr>*
321 lookup_variables(const char* id) const;
322
323 void
325
326 virtual const variables&
327 get_variables() const;
328
329 const functions_set&
331
334
335 const functions&
337
338 void
339 add_undefined_function(const function_decl*);
340
341 const variables_set&
343
346
347 const variables&
349
350 void
351 add_undefined_variable(const var_decl_sptr&);
352
353 void
355
356 virtual const elf_symbols&
358
359 virtual const elf_symbols&
361
362 vector<string>&
364
365 const vector<string>&
367
368 vector<string>&
370
371 const vector<string>&
373
374 vector<string>&
376
377 const vector<string>&
379
380 vector<string>&
382
383 const vector<string>&
385
386 vector<string>&
388
389 const vector<string>&
391
392 vector<string>&
394
395 const vector<string>&
397
398 void
400
403
404 friend class type_base;
405 friend class corpus_group;
406};// end class corpus.
407
410
413
416
419
420/// Abstracts the building of the set of exported variables and
421/// functions.
422///
423/// Given a function or variable, this type can decide if it belongs
424/// to the list of exported functions and variables based on all the
425/// parameters needed.
427{
428 // Forbid default construction.
430
431public:
432 class priv;
433 std::unique_ptr<priv> priv_;
434
435 friend class corpus;
436
438 variables& vars,
439 strings_type& fns_suppress_regexps,
440 strings_type& vars_suppress_regexps,
441 strings_type& fns_keep_regexps,
442 strings_type& vars_keep_regexps,
443 strings_type& sym_id_of_fns_to_keep,
444 strings_type& sym_id_of_vars_to_keep);
445
446
447 const functions&
448 exported_functions() const;
449
450 std::unordered_set<const function_decl*>*
452
453 const variables&
454 exported_variables() const;
455
456 bool
457 maybe_add_fn_to_exported_fns(function_decl*, bool do_update = false);
458
459 bool
461}; //corpus::exported_decls_builder
462
463/// Abstraction of a group of corpora.
464///
465/// A corpus group is a union of corpora. It provides a unified view
466/// of a set of corpora. It lets you get the set of functions,
467/// variables and symbols that are defined and exported by a set of
468/// corpora.
469class corpus_group : public corpus
470{
471 struct priv;
472 std::unique_ptr<priv> priv_;
473
474 // Forbid copy
476
477public:
478 typedef vector<corpus_sptr> corpora_type;
479
480 corpus_group(const ir::environment&, const string&);
481
482 virtual ~corpus_group();
483
484 void add_corpus(const corpus_sptr&);
485
486 bool has_corpus(const string&);
487
488 const corpora_type&
489 get_corpora() const;
490
491 const corpus_sptr
492 get_main_corpus() const;
493
494 corpus_sptr
496
497 virtual bool
498 is_empty() const;
499
500 virtual const corpus::functions&
501 get_functions() const;
502
503 virtual const corpus::variables&
504 get_variables() const;
505
506 virtual const string_elf_symbols_map_type&
507 get_var_symbol_map() const;
508
509 virtual const string_elf_symbols_map_type&
510 get_fun_symbol_map() const;
511
512 virtual const elf_symbols&
514
515 virtual const elf_symbols&
517
518 virtual const elf_symbols&
520
521 virtual const elf_symbols&
523
524 bool
525 operator==(const corpus_group&) const;
526
527 virtual const std::unordered_set<const function_decl*>*
528 lookup_functions(const interned_string& id) const;
529
530 virtual const std::unordered_set<const function_decl*>*
531 lookup_functions(const char* id) const;
532
533 virtual const std::unordered_set<var_decl_sptr>*
534 lookup_variables(const interned_string& id) const;
535
536 virtual const std::unordered_set<var_decl_sptr>*
537 lookup_variables(const char* id) const;
538}; // end class corpus_group
539
540corpus_group_sptr
541is_corpus_group(const corpus_sptr&);
542
543bool
545
546void
547dumptypes(const vector<type_base_wptr>& types,
548 const char* output_file, const corpus&,
549 bool emit_location = false);
550}// end namespace ir
551}//end namespace abigail
552#endif //__ABG_CORPUS_H__
std::shared_ptr< symtab > symtab_sptr
Convenience typedef for a shared pointer to a symtab.
Definition abg-fwd.h:1743
Types of the main internal representation of libabigail.
The abstraction of an interned string.
The type of the private data of corpus::exported_decls_builder type.
Abstracts the building of the set of exported variables and functions.
Definition abg-corpus.h:427
const functions & exported_functions() const
Getter for the reference to the vector of exported functions. This vector is shared with with the cor...
std::unordered_set< const function_decl * > * fn_id_maps_to_several_fns(const function_decl *)
Test if a given function ID maps to several functions in the same corpus.
bool maybe_add_fn_to_exported_fns(function_decl *, bool do_update=false)
Consider at all the tunables that control wether a function should be added to the set of exported fu...
bool maybe_add_var_to_exported_vars(const var_decl_sptr &)
Consider at all the tunables that control wether a variable should be added to the set of exported va...
const variables & exported_variables() const
Getter for the reference to the vector of exported variables. This vector is shared with with the cor...
Abstraction of a group of corpora.
Definition abg-corpus.h:470
virtual const elf_symbols & get_sorted_var_symbols() const
Get a sorted vector of the symbols of the variables exported by the corpora of the current group.
bool has_corpus(const string &)
Test if a corpus of a given path has been added to the group.
const corpora_type & get_corpora() const
Getter of the vector of corpora held by the current corpus_group.
virtual const string_elf_symbols_map_type & get_var_symbol_map() const
Get the symbols of the global variables exported by the corpora of the current corpus_group.
virtual const elf_symbols & get_sorted_fun_symbols() const
Get a sorted vector of the symbols of the functions exported by the corpora of the current group.
virtual const std::unordered_set< const function_decl * > * lookup_functions(const interned_string &id) const
Lookup the function which has a given function ID.
virtual bool is_empty() const
Test if the current corpus group is empty.
virtual const string_elf_symbols_map_type & get_fun_symbol_map() const
Get the symbols of the global functions exported by the corpora of the current corpus_group.
const corpus_sptr get_main_corpus() const
Getter of the first corpus added to this Group.
virtual const elf_symbols & get_unreferenced_function_symbols() const
Get the set of function symbols not referenced by any debug info, from all the corpora of the current...
virtual const elf_symbols & get_unreferenced_variable_symbols() const
Get the set of variable symbols not referenced by any debug info, from all the corpora of the current...
virtual const std::unordered_set< var_decl_sptr > * lookup_variables(const interned_string &id) const
Lookup the exported variables which all have a given variable ID.
virtual const corpus::variables & get_variables() const
Get the global variables exported by the corpora of the current corpus group.
virtual ~corpus_group()
Desctructor of the corpus_group type.
void add_corpus(const corpus_sptr &)
Add a new corpus to the current instance of corpus_group.
virtual const corpus::functions & get_functions() const
Get the functions exported by the corpora of the current corpus group.
This is the abstraction of a set of translation units (themselves seen as bundles of unitary abi arte...
Definition abg-corpus.h:95
virtual const elf_symbols & get_sorted_var_symbols() const
Getter for the sorted vector of variable symbols for this corpus.
const elf_symbol_sptr lookup_function_symbol(const string &n) const
Look in the function symbols map for a symbol with a given name.
origin
This abstracts where the corpus comes from. That is, either it has been read from the native xml form...
Definition abg-corpus.h:121
void sort_functions()
Sort the set of functions exported by this corpus.
void set_soname(const string &)
Setter for the soname property of the corpus.
const functions_set & get_undefined_functions() const
Getter of the undefined functions of the corpus.
const vector< string > & get_needed() const
Getter of the needed property of the corpus.
exported_decls_builder_sptr get_exported_decls_builder() const
Getter for the object that is responsible for determining what decls ought to be in the set of export...
void maybe_drop_some_exported_decls()
After the set of exported functions and variables have been built, consider all the tunables that con...
const string_elf_symbols_map_type & get_undefined_var_symbol_map() const
Getter for the map of variable symbols that are undefined in this corpus.
void add(const translation_unit_sptr &)
Add a translation unit to the current ABI Corpus.
std::unordered_set< const function_decl * > functions_set
Convenience typedef for std::unordered_set<const function_decl*>
Definition abg-corpus.h:104
virtual const string_elf_symbols_map_type & get_var_symbol_map() const
Getter for the variable symbols map.
shared_ptr< exported_decls_builder > exported_decls_builder_sptr
Convenience typedef for shared_ptr<exported_decls_builder>.
Definition abg-corpus.h:115
const variables & get_sorted_undefined_variables() const
Getter of the sorted vector of undefined variables of the corpus.
const elf_symbol_sptr lookup_variable_symbol(const string &n) const
Look in the variable symbols map for a symbol with a given name.
vector< var_decl_sptr > variables
Convenience typedef for std::vector<abigail::ir::var_decl*>
Definition abg-corpus.h:107
virtual const elf_symbols & get_sorted_fun_symbols() const
Return a sorted vector of function symbols for this corpus.
const string & get_soname()
Getter for the soname property of the corpus.
const translation_units & get_translation_units() const
Return the list of translation units of the current corpus.
const symtab_reader::symtab_sptr & get_symtab() const
Getter for the symtab object.
virtual const std::unordered_set< const function_decl * > * lookup_functions(const interned_string &id) const
Lookup the function which has a given function ID.
const variables_set & get_undefined_variables() const
Getter of the undefined variables of the corpus.
origin get_origin() const
Getter for the origin of the corpus.
virtual bool is_empty() const
Tests if the corpus is empty from an ABI surface perspective. I.e. if all of these criteria are true:
type_maps & get_types()
Get the maps that associate a name to a certain kind of type.
vector< string > & get_sym_ids_of_vars_to_keep()
Getter for the vector of variable symbol IDs to keep.
bool do_log() const
Test if logging was requested.
const translation_unit_sptr find_translation_unit(const string &path) const
Find the translation unit that has a given path.
const elf_symbols & get_sorted_undefined_fun_symbols() const
Getter for a sorted vector of the function symbols undefined in this corpus.
string & get_path() const
Get the file path associated to the corpus file.
const string_elf_symbols_map_type & get_undefined_fun_symbol_map() const
Getter for the map of function symbols that are undefined in this corpus.
void set_origin(origin)
Setter for the origin of the corpus.
virtual const string_elf_symbols_map_type & get_fun_symbol_map() const
Getter for the function symbols map.
bool operator==(const corpus &) const
Compare the current corpus against another one.
type_maps & get_type_per_loc_map()
Get the maps that associate a location string to a certain kind of type.
void drop_translation_units()
Erase the translation units contained in this in-memory object.
void sort_variables()
Sort the set of variables exported by this corpus.
vector< string > & get_regex_patterns_of_vars_to_keep()
Accessor for the regex patterns describing the variables to keep into the public decl table....
vector< string > & get_regex_patterns_of_vars_to_suppress()
Accessor for the regex patterns describing the variables to drop from the public decl table.
const corpus_group * get_group() const
Getter of the group this corpus is a member of.
vector< string > & get_regex_patterns_of_fns_to_suppress()
Accessor for the regex patterns describing the functions to drop from the public decl table.
const functions & get_sorted_undefined_functions() const
Getter of the sorted vector of undefined functions of the corpus.
const canonical_type_ptr_set_type & get_types_not_reachable_from_public_interfaces() const
Getter of a sorted vector of the types that are *NOT* reachable from public interfaces.
virtual const elf_symbols & get_unreferenced_function_symbols() const
Getter of the set of function symbols that are not referenced by any function exported by the current...
void set_path(const string &)
Set the file path associated to the corpus file.
virtual const elf_symbols & get_unreferenced_variable_symbols() const
Getter of the set of variable symbols that are not referenced by any variable exported by the current...
bool type_is_reachable_from_public_interfaces(const type_base &) const
Test if a type is reachable from public interfaces (global functions and variables).
virtual bool recording_types_reachable_from_public_interface_supported()
Test if the recording of reachable types (and thus, indirectly, the recording of non-reachable types)...
virtual const std::unordered_set< var_decl_sptr > * lookup_variables(const interned_string &id) const
Lookup the exported variables which all have a given variable ID.
virtual const variables & get_variables() const
Return the public decl table of the global variables of the current corpus.
const elf_symbols & get_sorted_undefined_var_symbols() const
Getter for a sorted vector of the variable symbols undefined in this corpus.
void set_needed(const vector< string > &)
Setter of the needed property of the corpus.
vector< string > & get_sym_ids_of_fns_to_keep()
Getter for the vector of function symbol IDs to keep.
vector< const function_decl * > functions
Convenience typedef for std::vector<abigail::ir::function_decl*>
Definition abg-corpus.h:101
void set_architecture_name(const string &)
Setter for the architecture name of the corpus.
bool record_type_as_reachable_from_public_interfaces(const type_base &)
Record a type as being reachable from public interfaces (global functions and variables).
void set_symtab(symtab_reader::symtab_sptr)
Setter for the symtab object.
void set_format_major_version_number(const string &)
Setter of the major version number of the abixml serialization format.
const string & get_architecture_name() const
Getter for the architecture name of the corpus.
vector< string > strings_type
A convenience typedef for std::vector<string>.
Definition abg-corpus.h:98
std::unordered_set< var_decl_sptr > variables_set
Convenience typedef for std::unordered_set<const var_decl*>.
Definition abg-corpus.h:110
const environment & get_environment() const
Getter of the enviroment of the corpus.
vector< string > & get_regex_patterns_of_fns_to_keep()
Accessor for the regex patterns describing the functions to keep into the public decl table....
void set_format_minor_version_number(const string &)
Setter of the minor version number of the abixml serialization format.
string & get_format_minor_version_number() const
Getter of the minor version number of the abixml serialization format.
virtual const functions & get_functions() const
Return the functions public decl table of the current corpus.
string & get_format_major_version_number() const
Getter of the major version number of the abixml serialization format.
The abstraction of the version of an ELF symbol.
Definition abg-ir.h:1230
Abstraction of an elf symbol.
Definition abg-ir.h:959
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
Definition abg-ir.h:216
Abstraction for a function declaration.
Definition abg-ir.h:3167
An abstraction helper for type declarations.
Definition abg-ir.h:2014
This is a type that aggregates maps of all the kinds of types that are supported by libabigail.
Definition abg-ir.h:593
Abstracts a variable declaration.
Definition abg-ir.h:3069
unordered_set< const var_decl *, c11d_decl_hasher< var_decl >, c11d_decl_eq< var_decl > > vars_set_type
A set of hashed var decls. The hash value is the canonical type of the var. Note that the var types m...
Definition abg-corpus.h:76
corpus::origin operator|=(corpus::origin &l, corpus::origin r)
Bitwise |= operator for the corpus::origin type.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
Definition abg-ir.h:924
type_base_sptr get_exemplar_type(type_base_sptr type)
For a given type, return its exemplar type.
Definition abg-ir.cc:30277
std::vector< elf_symbol_sptr > elf_symbols
Convenience typedef for a vector of elf_symbol.
Definition abg-ir.h:940
corpus_group_sptr is_corpus_group(const corpus_sptr &corpus)
Test if a corpus is a corpus_group.
bool type_is_reachable_from_public_interfaces(const type_base &t)
Test if a given type is reachable from public interfaces of either the ABI corpus it belongs to,...
corpus::origin operator|(corpus::origin l, corpus::origin r)
Bitwise | operator for the corpus::origin type.
std::map< interned_string, functions_set_type > istring_functions_set_omap_type
An ordered map that associates an interned string with a set of hashed function decls.
Definition abg-corpus.h:87
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
Definition abg-fwd.h:257
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
Definition abg-fwd.h:137
vector< type_base * > type_base_ptrs_type
Helper typedef for a vector of pointer to type_base.
Definition abg-ir.h:143
unordered_map< interned_string, functions_set_type, hash_interned_string > istring_functions_set_map_type
A map that associates an interned string with a set of hashed function decls.
Definition abg-corpus.h:82
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:887
corpus::origin operator&=(corpus::origin &l, corpus::origin r)
Bitwise &= operator for the corpus::origin type.
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:945
unordered_set< const function_decl *, c11d_decl_hasher< function_decl >, c11d_decl_eq< function_decl > > functions_set_type
A set of hashed function decls. The hash value is the canonical type of the function....
Definition abg-corpus.h:69
unordered_set< type_base *, canonical_type_hash > canonical_type_ptr_set_type
Helper typedef for an unordered set of type_base* which uses pointer value to tell its members appart...
Definition abg-ir.h:140
Toplevel namespace for libabigail.
A functor to hash instances of interned_string.
Functor to compare decls in hash maps or sets of decls with canonicalized types.
Definition abg-corpus.h:47
bool operator()(const DeclType *f, const DeclType *s) const
Comparison operator for decls with canonicalized types.
Definition abg-corpus.h:56
Hashing functor for canonicalized decl types.
Definition abg-corpus.h:23
size_t operator()(const DeclType *f) const
Hashing operator for decls that have canonicalized decl types.
Definition abg-corpus.h:35