• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
13 namespace abigail
14 {
15 
16 namespace 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.
24 class corpus
25 {
26 public:
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<function_decl*> functions;
32 
33   ///Convenience typedef for std::vector<abigail::ir::var_decl*>
34   typedef vector<var_decl*> variables;
35 
36   class exported_decls_builder;
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 
55 private:
56   corpus();
57 
58   void set_group(corpus_group*);
59   void init_format_version();
60 
61 public:
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
79   add(const translation_unit_sptr&);
80 
81   const translation_units&
82   get_translation_units() const;
83 
84   const translation_unit_sptr
85   find_translation_unit(const string &path) const;
86 
87   void
88   drop_translation_units();
89 
90   type_maps&
91   get_types();
92 
93   const type_maps&
94   get_types() const;
95 
96   type_maps&
97   get_type_per_loc_map();
98 
99   const type_maps&
100   get_type_per_loc_map() const;
101 
102   virtual bool
103   recording_types_reachable_from_public_interface_supported();
104 
105   void
106   record_type_as_reachable_from_public_interfaces(const type_base&);
107 
108   bool
109   type_is_reachable_from_public_interfaces(const type_base&) const;
110 
111   const vector<type_base_wptr>&
112   get_types_not_reachable_from_public_interfaces() const;
113 
114   const corpus_group*
115   get_group() const;
116 
117   corpus_group*
118   get_group();
119 
120   origin
121   get_origin() const;
122 
123   void
124   set_origin(origin);
125 
126   string&
127   get_format_major_version_number() const;
128 
129   void
130   set_format_major_version_number(const string&);
131 
132   string&
133   get_format_minor_version_number() const;
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
169   set_symtab(symtab_reader::symtab_sptr);
170 
171   const symtab_reader::symtab_sptr&
172   get_symtab() const;
173 
174   virtual const string_elf_symbols_map_type&
175   get_fun_symbol_map() const;
176 
177   const string_elf_symbols_map_type&
178   get_undefined_fun_symbol_map() const;
179 
180   virtual const elf_symbols&
181   get_sorted_fun_symbols() const;
182 
183   const elf_symbols&
184   get_sorted_undefined_fun_symbols() const;
185 
186   virtual const string_elf_symbols_map_type&
187   get_var_symbol_map() const;
188 
189   const string_elf_symbols_map_type&
190   get_undefined_var_symbol_map() const;
191 
192   virtual const elf_symbols&
193   get_sorted_var_symbols() const;
194 
195   const elf_symbols&
196   get_sorted_undefined_var_symbols() const;
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 string& id) const;
223 
224   void
225   sort_functions();
226 
227   virtual const variables&
228   get_variables() const;
229 
230   void
231   sort_variables();
232 
233   virtual const elf_symbols&
234   get_unreferenced_function_symbols() const;
235 
236   virtual const elf_symbols&
237   get_unreferenced_variable_symbols() const;
238 
239   vector<string>&
240   get_regex_patterns_of_fns_to_suppress();
241 
242   const vector<string>&
243   get_regex_patterns_of_fns_to_suppress() const;
244 
245   vector<string>&
246   get_regex_patterns_of_vars_to_suppress();
247 
248   const vector<string>&
249   get_regex_patterns_of_vars_to_suppress() const;
250 
251   vector<string>&
252   get_regex_patterns_of_fns_to_keep();
253 
254   const vector<string>&
255   get_regex_patterns_of_fns_to_keep() const;
256 
257   vector<string>&
258   get_sym_ids_of_fns_to_keep();
259 
260   const vector<string>&
261   get_sym_ids_of_fns_to_keep() const;
262 
263   vector<string>&
264   get_regex_patterns_of_vars_to_keep();
265 
266   const vector<string>&
267   get_regex_patterns_of_vars_to_keep() const;
268 
269   vector<string>&
270   get_sym_ids_of_vars_to_keep();
271 
272   const vector<string>&
273   get_sym_ids_of_vars_to_keep() const;
274 
275   void
276   maybe_drop_some_exported_decls();
277 
278   exported_decls_builder_sptr
279   get_exported_decls_builder() const;
280 
281   friend class type_base;
282   friend class corpus_group;
283 };// end class corpus.
284 
285 corpus::origin
286 operator|(corpus::origin l, corpus::origin r);
287 
288 corpus::origin
289 operator|=(corpus::origin &l, corpus::origin r);
290 
291 corpus::origin
292 operator&(corpus::origin l, corpus::origin r);
293 
294 corpus::origin
295 operator&=(corpus::origin &l, corpus::origin r);
296 
297 /// Abstracts the building of the set of exported variables and
298 /// functions.
299 ///
300 /// Given a function or variable, this type can decide if it belongs
301 /// to the list of exported functions and variables based on all the
302 /// parameters needed.
303 class corpus::exported_decls_builder
304 {
305   // Forbid default construction.
306   exported_decls_builder();
307 
308 public:
309   class priv;
310   std::unique_ptr<priv> priv_;
311 
312   friend class corpus;
313 
314   exported_decls_builder(functions& fns,
315 			 variables& vars,
316 			 strings_type& fns_suppress_regexps,
317 			 strings_type& vars_suppress_regexps,
318 			 strings_type& fns_keep_regexps,
319 			 strings_type& vars_keep_regexps,
320 			 strings_type& sym_id_of_fns_to_keep,
321 			 strings_type& sym_id_of_vars_to_keep);
322 
323 
324   const functions&
325   exported_functions() const;
326 
327   functions&
328   exported_functions();
329 
330   std::unordered_set<function_decl*>*
331   fn_id_maps_to_several_fns(function_decl*);
332 
333   const variables&
334   exported_variables() const;
335 
336   variables&
337   exported_variables();
338 
339   void
340   maybe_add_fn_to_exported_fns(function_decl*);
341 
342   void
343   maybe_add_var_to_exported_vars(const var_decl*);
344 }; //corpus::exported_decls_builder
345 
346 /// Abstraction of a group of corpora.
347 ///
348 /// A corpus group is a union of corpora.  It provides a unified view
349 /// of a set of corpora.  It lets you get the set of functions,
350 /// variables and symbols that are defined and exported by a set of
351 /// corpora.
352 class corpus_group : public corpus
353 {
354   struct priv;
355   std::unique_ptr<priv> priv_;
356 
357   // Forbid copy
358   corpus_group(const corpus_group&);
359 
360 public:
361   typedef vector<corpus_sptr> corpora_type;
362 
363   corpus_group(const ir::environment&, const string&);
364 
365   virtual ~corpus_group();
366 
367   void add_corpus(const corpus_sptr&);
368 
369   bool has_corpus(const string&);
370 
371   const corpora_type&
372   get_corpora() const;
373 
374   const corpus_sptr
375   get_main_corpus() const;
376 
377   corpus_sptr
378   get_main_corpus();
379 
380   virtual bool
381   is_empty() const;
382 
383   virtual const corpus::functions&
384   get_functions() const;
385 
386   virtual const corpus::variables&
387   get_variables() const;
388 
389   virtual const string_elf_symbols_map_type&
390   get_var_symbol_map() const;
391 
392   virtual const string_elf_symbols_map_type&
393   get_fun_symbol_map() const;
394 
395   virtual const elf_symbols&
396   get_sorted_fun_symbols() const;
397 
398   virtual const elf_symbols&
399   get_sorted_var_symbols() const;
400 
401   virtual const elf_symbols&
402   get_unreferenced_function_symbols() const;
403 
404   virtual const elf_symbols&
405   get_unreferenced_variable_symbols() const;
406 
407   unordered_set<interned_string, hash_interned_string>*
408   get_public_types_pretty_representations();
409 
410   virtual bool
411   recording_types_reachable_from_public_interface_supported();
412 
413   bool
414   operator==(const corpus_group&) const;
415 }; // end class corpus_group
416 
417 }// end namespace ir
418 }//end namespace abigail
419 #endif //__ABG_CORPUS_H__
420