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