libabigail
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-2023 Red Hat, Inc.
5
6/// @file
7
8#ifndef __ABG_CORPUS_H__
9#define __ABG_CORPUS_H__
10
11#include <abg-ir.h>
12
13namespace abigail
14{
15
16namespace ir
17{
18
19/// This is the abstraction of a set of translation units (themselves
20/// seen as bundles of unitary abi artefacts like types and decls)
21/// bundled together as a corpus. A corpus is thus the Application
22/// binary interface of a program, a library or just a set of modules
23/// put together.
24class corpus
25{
26public:
27 /// A convenience typedef for std::vector<string>.
28 typedef vector<string> strings_type;
29
30 /// Convenience typedef for std::vector<abigail::ir::function_decl*>
31 typedef vector<const function_decl*> functions;
32
33 ///Convenience typedef for std::vector<abigail::ir::var_decl*>
34 typedef vector<const var_decl*> variables;
35
37
38 /// Convenience typedef for shared_ptr<exported_decls_builder>.
39 typedef shared_ptr<exported_decls_builder> exported_decls_builder_sptr;
40
41 /// This abstracts where the corpus comes from. That is, either it
42 /// has been read from the native xml format, from DWARF or built
43 /// artificially using the library's API.
44 enum origin
45 {
46 ARTIFICIAL_ORIGIN = 0,
47 NATIVE_XML_ORIGIN = 1,
48 ELF_ORIGIN = 1 << 1,
49 DWARF_ORIGIN = 1 << 2,
50 CTF_ORIGIN = 1 << 3,
51 BTF_ORIGIN = 1 << 4,
52 LINUX_KERNEL_BINARY_ORIGIN = 1 << 5
53 };
54
55private:
56 corpus();
57
58 void set_group(corpus_group*);
59 void init_format_version();
60
61public:
62 struct priv;
63 std::unique_ptr<priv> priv_;
64
65 corpus(const ir::environment&, const string& path= "");
66
67 virtual ~corpus();
68
69 const environment&
70 get_environment() const;
71
72 bool
73 do_log() const;
74
75 void
76 do_log(bool);
77
78 void
80
83
85 find_translation_unit(const string &path) const;
86
87 void
89
91 get_types();
92
93 const type_maps&
94 get_types() const;
95
98
99 const type_maps&
100 get_type_per_loc_map() const;
101
102 virtual bool
104
105 void
107
108 bool
110
111 const vector<type_base_wptr>&
113
114 const corpus_group*
115 get_group() const;
116
118 get_group();
119
120 origin
121 get_origin() const;
122
123 void
125
126 string&
128
129 void
130 set_format_major_version_number(const string&);
131
132 string&
134
135 void
136 set_format_minor_version_number(const string&);
137
138 string&
139 get_path() const;
140
141 void
142 set_path(const string&);
143
144 const vector<string>&
145 get_needed() const;
146
147 void
148 set_needed(const vector<string>&);
149
150 const string&
151 get_soname();
152
153 void
154 set_soname(const string&);
155
156 const string&
157 get_architecture_name() const;
158
159 void
160 set_architecture_name(const string&);
161
162 virtual bool
163 is_empty() const;
164
165 bool
166 operator==(const corpus&) const;
167
168 void
170
172 get_symtab() const;
173
174 virtual const string_elf_symbols_map_type&
175 get_fun_symbol_map() const;
176
179
180 virtual const elf_symbols&
182
183 const elf_symbols&
185
186 virtual const string_elf_symbols_map_type&
187 get_var_symbol_map() const;
188
191
192 virtual const elf_symbols&
194
195 const elf_symbols&
197
198 const elf_symbol_sptr
199 lookup_function_symbol(const string& n) const;
200
201 const elf_symbol_sptr
202 lookup_function_symbol(const string& symbol_name,
203 const elf_symbol::version& version) const;
204
205 const elf_symbol_sptr
206 lookup_function_symbol(const elf_symbol& symbol) const;
207
208 const elf_symbol_sptr
209 lookup_variable_symbol(const string& n) const;
210
211 const elf_symbol_sptr
212 lookup_variable_symbol(const string& symbol_name,
213 const elf_symbol::version& version) const;
214
215 const elf_symbol_sptr
216 lookup_variable_symbol(const elf_symbol& symbol) const;
217
218 virtual const functions&
219 get_functions() const;
220
221 const std::unordered_set<function_decl*>*
222 lookup_functions(const interned_string& id) const;
223
224 const std::unordered_set<function_decl*>*
225 lookup_functions(const char* id) const;
226
227 void
229
230 virtual const variables&
231 get_variables() const;
232
233 void
235
236 virtual const elf_symbols&
238
239 virtual const elf_symbols&
241
242 vector<string>&
244
245 const vector<string>&
247
248 vector<string>&
250
251 const vector<string>&
253
254 vector<string>&
256
257 const vector<string>&
259
260 vector<string>&
262
263 const vector<string>&
265
266 vector<string>&
268
269 const vector<string>&
271
272 vector<string>&
274
275 const vector<string>&
277
278 void
280
283
284 friend class type_base;
285 friend class corpus_group;
286};// end class corpus.
287
290
293
296
299
300/// Abstracts the building of the set of exported variables and
301/// functions.
302///
303/// Given a function or variable, this type can decide if it belongs
304/// to the list of exported functions and variables based on all the
305/// parameters needed.
307{
308 // Forbid default construction.
310
311public:
312 class priv;
313 std::unique_ptr<priv> priv_;
314
315 friend class corpus;
316
318 variables& vars,
319 strings_type& fns_suppress_regexps,
320 strings_type& vars_suppress_regexps,
321 strings_type& fns_keep_regexps,
322 strings_type& vars_keep_regexps,
323 strings_type& sym_id_of_fns_to_keep,
324 strings_type& sym_id_of_vars_to_keep);
325
326
327 const functions&
328 exported_functions() const;
329
330 functions&
332
333 std::unordered_set<function_decl*>*
335
336 const variables&
337 exported_variables() const;
338
339 variables&
341
342 void
344
345 void
347}; //corpus::exported_decls_builder
348
349/// Abstraction of a group of corpora.
350///
351/// A corpus group is a union of corpora. It provides a unified view
352/// of a set of corpora. It lets you get the set of functions,
353/// variables and symbols that are defined and exported by a set of
354/// corpora.
355class corpus_group : public corpus
356{
357 struct priv;
358 std::unique_ptr<priv> priv_;
359
360 // Forbid copy
362
363public:
364 typedef vector<corpus_sptr> corpora_type;
365
366 corpus_group(const ir::environment&, const string&);
367
368 virtual ~corpus_group();
369
370 void add_corpus(const corpus_sptr&);
371
372 bool has_corpus(const string&);
373
374 const corpora_type&
375 get_corpora() const;
376
377 const corpus_sptr
378 get_main_corpus() const;
379
380 corpus_sptr
382
383 virtual bool
384 is_empty() const;
385
386 virtual const corpus::functions&
387 get_functions() const;
388
389 virtual const corpus::variables&
390 get_variables() const;
391
392 virtual const string_elf_symbols_map_type&
393 get_var_symbol_map() const;
394
395 virtual const string_elf_symbols_map_type&
396 get_fun_symbol_map() const;
397
398 virtual const elf_symbols&
400
401 virtual const elf_symbols&
403
404 virtual const elf_symbols&
406
407 virtual const elf_symbols&
409
410 unordered_set<interned_string, hash_interned_string>*
412
413 virtual bool
415
416 bool
417 operator==(const corpus_group&) const;
418}; // end class corpus_group
419
420}// end namespace ir
421}//end namespace abigail
422#endif //__ABG_CORPUS_H__
std::shared_ptr< symtab > symtab_sptr
Convenience typedef for a shared pointer to a symtab.
Definition: abg-fwd.h:1648
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:307
const functions & exported_functions() const
Getter for the reference to the vector of exported functions. This vector is shared with with the cor...
Definition: abg-corpus.cc:101
void maybe_add_fn_to_exported_fns(function_decl *)
Consider at all the tunables that control wether a function should be added to the set of exported fu...
Definition: abg-corpus.cc:159
std::unordered_set< 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.
Definition: abg-corpus.cc:125
void maybe_add_var_to_exported_vars(const var_decl *)
Consider at all the tunables that control wether a variable should be added to the set of exported va...
Definition: abg-corpus.cc:182
const variables & exported_variables() const
Getter for the reference to the vector of exported variables. This vector is shared with with the cor...
Definition: abg-corpus.cc:141
Abstraction of a group of corpora.
Definition: abg-corpus.h:356
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.
Definition: abg-corpus.cc:1998
bool has_corpus(const string &)
Test if a corpus of a given path has been added to the group.
Definition: abg-corpus.cc:1810
const corpora_type & get_corpora() const
Getter of the vector of corpora held by the current corpus_group.
Definition: abg-corpus.cc:1822
unordered_set< interned_string, hash_interned_string > * get_public_types_pretty_representations()
Getter of a pointer to the set of types reachable from public interfaces of a given corpus group.
Definition: abg-corpus.cc:2114
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.
Definition: abg-corpus.cc:1932
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.
Definition: abg-corpus.cc:1966
virtual bool is_empty() const
Test if the current corpus group is empty.
Definition: abg-corpus.cc:1847
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.
Definition: abg-corpus.cc:1949
const corpus_sptr get_main_corpus() const
Getter of the first corpus added to this Group.
Definition: abg-corpus.cc:1829
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...
Definition: abg-corpus.cc:2037
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...
Definition: abg-corpus.cc:2080
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)...
Definition: abg-corpus.cc:2124
virtual const corpus::variables & get_variables() const
Get the global variables exported by the corpora of the current corpus group.
Definition: abg-corpus.cc:1898
virtual ~corpus_group()
Desctructor of the corpus_group type.
Definition: abg-corpus.cc:1764
void add_corpus(const corpus_sptr &)
Add a new corpus to the current instance of corpus_group.
Definition: abg-corpus.cc:1771
virtual const corpus::functions & get_functions() const
Get the functions exported by the corpora of the current corpus group.
Definition: abg-corpus.cc:1860
This is the abstraction of a set of translation units (themselves seen as bundles of unitary abi arte...
Definition: abg-corpus.h:25
virtual const elf_symbols & get_sorted_var_symbols() const
Getter for the sorted vector of variable symbols for this corpus.
Definition: abg-corpus.cc:1160
const elf_symbol_sptr lookup_function_symbol(const string &n) const
Look in the function symbols map for a symbol with a given name.
Definition: abg-corpus.cc:1195
origin
This abstracts where the corpus comes from. That is, either it has been read from the native xml form...
Definition: abg-corpus.h:45
void sort_functions()
Sort the set of functions exported by this corpus.
Definition: abg-corpus.cc:1387
void set_soname(const string &)
Setter for the soname property of the corpus.
Definition: abg-corpus.cc:1024
vector< const var_decl * > variables
Convenience typedef for std::vector<abigail::ir::var_decl*>
Definition: abg-corpus.h:34
const vector< type_base_wptr > & get_types_not_reachable_from_public_interfaces() const
Getter of a sorted vector of the types that are *NOT* reachable from public interfaces.
Definition: abg-corpus.cc:841
void record_type_as_reachable_from_public_interfaces(const type_base &)
Record a type as being reachable from public interfaces (global functions and variables).
Definition: abg-corpus.cc:803
const vector< string > & get_needed() const
Getter of the needed property of the corpus.
Definition: abg-corpus.cc:990
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...
Definition: abg-corpus.cc:1606
void maybe_drop_some_exported_decls()
After the set of exported functions and variables have been built, consider all the tunables that con...
Definition: abg-corpus.cc:1569
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.
Definition: abg-corpus.cc:1186
void add(const translation_unit_sptr &)
Add a translation unit to the current ABI Corpus.
Definition: abg-corpus.cc:709
virtual const string_elf_symbols_map_type & get_var_symbol_map() const
Getter for the variable symbols map.
Definition: abg-corpus.cc:1176
shared_ptr< exported_decls_builder > exported_decls_builder_sptr
Convenience typedef for shared_ptr<exported_decls_builder>.
Definition: abg-corpus.h:39
const elf_symbol_sptr lookup_variable_symbol(const string &n) const
Look in the variable symbols map for a symbol with a given name.
Definition: abg-corpus.cc:1291
virtual const elf_symbols & get_sorted_fun_symbols() const
Return a sorted vector of function symbols for this corpus.
Definition: abg-corpus.cc:1140
const string & get_soname()
Getter for the soname property of the corpus.
Definition: abg-corpus.cc:1013
const translation_units & get_translation_units() const
Return the list of translation units of the current corpus.
Definition: abg-corpus.cc:729
const symtab_reader::symtab_sptr & get_symtab() const
Getter for the symtab object.
Definition: abg-corpus.cc:1112
origin get_origin() const
Getter for the origin of the corpus.
Definition: abg-corpus.cc:914
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:
Definition: abg-corpus.cc:1059
type_maps & get_types()
Get the maps that associate a name to a certain kind of type.
Definition: abg-corpus.cc:761
vector< string > & get_sym_ids_of_vars_to_keep()
Getter for the vector of variable symbol IDs to keep.
Definition: abg-corpus.cc:1552
bool do_log() const
Test if logging was requested.
Definition: abg-corpus.cc:691
const translation_unit_sptr find_translation_unit(const string &path) const
Find the translation unit that has a given path.
Definition: abg-corpus.cc:739
const elf_symbols & get_sorted_undefined_fun_symbols() const
Getter for a sorted vector of the function symbols undefined in this corpus.
Definition: abg-corpus.cc:1149
string & get_path() const
Get the file path associated to the corpus file.
Definition: abg-corpus.cc:967
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.
Definition: abg-corpus.cc:1129
void set_origin(origin)
Setter for the origin of the corpus.
Definition: abg-corpus.cc:921
virtual const string_elf_symbols_map_type & get_fun_symbol_map() const
Getter for the function symbols map.
Definition: abg-corpus.cc:1119
bool operator==(const corpus &) const
Compare the current corpus against another one.
Definition: abg-corpus.cc:1086
type_maps & get_type_per_loc_map()
Get the maps that associate a location string to a certain kind of type.
Definition: abg-corpus.cc:870
void drop_translation_units()
Erase the translation units contained in this in-memory object.
Definition: abg-corpus.cc:754
void sort_variables()
Sort the set of variables exported by this corpus.
Definition: abg-corpus.cc:1417
vector< string > & get_regex_patterns_of_vars_to_keep()
Accessor for the regex patterns describing the variables to keep into the public decl table....
Definition: abg-corpus.cc:1532
vector< string > & get_regex_patterns_of_vars_to_suppress()
Accessor for the regex patterns describing the variables to drop from the public decl table.
Definition: abg-corpus.cc:1473
const corpus_group * get_group() const
Getter of the group this corpus is a member of.
Definition: abg-corpus.cc:878
vector< string > & get_regex_patterns_of_fns_to_suppress()
Accessor for the regex patterns describing the functions to drop from the public decl table.
Definition: abg-corpus.cc:1455
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...
Definition: abg-corpus.cc:1433
void set_path(const string &)
Set the file path associated to the corpus file.
Definition: abg-corpus.cc:979
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...
Definition: abg-corpus.cc:1446
bool type_is_reachable_from_public_interfaces(const type_base &) const
Test if a type is reachable from public interfaces (global functions and variables).
Definition: abg-corpus.cc:821
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)...
Definition: abg-corpus.cc:792
virtual const variables & get_variables() const
Return the public decl table of the global variables of the current corpus.
Definition: abg-corpus.cc:1409
const elf_symbols & get_sorted_undefined_var_symbols() const
Getter for a sorted vector of the variable symbols undefined in this corpus.
Definition: abg-corpus.cc:1169
void set_needed(const vector< string > &)
Setter of the needed property of the corpus.
Definition: abg-corpus.cc:1002
vector< string > & get_sym_ids_of_fns_to_keep()
Getter for the vector of function symbol IDs to keep.
Definition: abg-corpus.cc:1512
vector< const function_decl * > functions
Convenience typedef for std::vector<abigail::ir::function_decl*>
Definition: abg-corpus.h:31
void set_architecture_name(const string &)
Setter for the architecture name of the corpus.
Definition: abg-corpus.cc:1046
void set_symtab(symtab_reader::symtab_sptr)
Setter for the symtab object.
Definition: abg-corpus.cc:1105
void set_format_major_version_number(const string &)
Setter of the major version number of the abixml serialization format.
Definition: abg-corpus.cc:937
const string & get_architecture_name() const
Getter for the architecture name of the corpus.
Definition: abg-corpus.cc:1035
vector< string > strings_type
A convenience typedef for std::vector<string>.
Definition: abg-corpus.h:28
const environment & get_environment() const
Getter of the enviroment of the corpus.
Definition: abg-corpus.cc:684
vector< string > & get_regex_patterns_of_fns_to_keep()
Accessor for the regex patterns describing the functions to keep into the public decl table....
Definition: abg-corpus.cc:1492
void set_format_minor_version_number(const string &)
Setter of the minor version number of the abixml serialization format.
Definition: abg-corpus.cc:955
string & get_format_minor_version_number() const
Getter of the minor version number of the abixml serialization format.
Definition: abg-corpus.cc:946
const std::unordered_set< function_decl * > * lookup_functions(const interned_string &id) const
Lookup the function which has a given function ID.
Definition: abg-corpus.cc:1369
virtual const functions & get_functions() const
Return the functions public decl table of the current corpus.
Definition: abg-corpus.cc:1351
string & get_format_major_version_number() const
Getter of the major version number of the abixml serialization format.
Definition: abg-corpus.cc:929
The abstraction of the version of an ELF symbol.
Definition: abg-ir.h:1194
Abstraction of an elf symbol.
Definition: abg-ir.h:923
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
Definition: abg-ir.h:140
Abstraction for a function declaration.
Definition: abg-ir.h:3111
An abstraction helper for type declarations.
Definition: abg-ir.h:1973
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:3008
corpus::origin operator|=(corpus::origin &l, corpus::origin r)
Bitwise |= operator for the corpus::origin type.
Definition: abg-corpus.cc:1645
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
Definition: abg-ir.h:888
std::vector< elf_symbol_sptr > elf_symbols
Convenience typedef for a vector of elf_symbol.
Definition: abg-ir.h:904
corpus::origin operator|(corpus::origin l, corpus::origin r)
Bitwise | operator for the corpus::origin type.
Definition: abg-corpus.cc:1631
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
Definition: abg-corpus.cc:1659
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
Definition: abg-fwd.h:137
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
corpus::origin operator&=(corpus::origin &l, corpus::origin r)
Bitwise &= operator for the corpus::origin type.
Definition: abg-corpus.cc:1673
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
Toplevel namespace for libabigail.
bool operator==(const std::string &l, const interned_string &r)
Equality operator.
Definition: abg-ir.cc:152