mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-30 05:42:05 +00:00
41d0ad035f
While working on something else, I noticed that the code for handling copying symbols (and their aliases) was broken, and so comparing two symbols which main name were different by which had aliases that were equal was wrongly resulting in the two symbol being different. I think we shouldn't actually copy symbols and their aliases. Once a symbol is allocated, interested code should just manipulate that symbol by address rather than by value an thus do away with the copying. The patch does that, essentially. In the implementation of a symbol, the aliases as well as the main symbol are now weak pointers, rather than naked pointers. Numerous API entry points that were taking containers of elf_symbol (and were copying elf_symbols over) are not taking containers of smart pointers to elf_symbol. Copying of instances of elf_symbol is now thus disabled. As a result many tests that were exercising elf_symbols (with alias) comparison have been updated. As a result, many empty sub-result of PR libabigail/PR17948 are now fixed. * include/abg-ir.h (elf_symbol_wptr): New typedef. (elf_symbol): Make the constructors and assignment operator private. The type can neither be copied nor created with the new operator. (elf_symbol::create): New static member function. (elf_symbol::{get_main_symbol, get_next_alias, add_alias}): Adjust. ( compute_aliases_for_elf_symbol): Likewise. (elf_symbol::operator=): Make this private. (elf_symbol::get_alias_which_equals): Declare new member function. * src/abg-comp-filter.cc (function_name_changed_but_not_symbol): Adjust. * src/abg-comparison.cc (class_diff::ensure_lookup_tables_populated): Adjust. * src/abg-corpus.cc (corpus::priv::build_unreferenced_symbols_tables): Likewise. * include/abg-dwarf-reader.h (lookup_symbol_from_elf) (lookup_public_function_symbol_from_elf): Adjust. * src/abg-dwarf-reader.cc (lookup_symbol_from_sysv_hash_tab) (lookup_symbol_from_gnu_hash_tab, lookup_symbol_from_elf_hash_tab) (lookup_symbol_from_symtab, lookup_symbol_from_elf) (lookup_public_function_symbol_from_elf) (lookup_public_variable_symbol_from_elf): Adjust. (read_context::lookup_elf_symbol_from_index): Likewise. (read_context::lookup_elf_fn_symbol_from_address): Likewise. (read_context::lookup_elf_var_symbol_from_address): Likewise. (read_context::lookup_public_function_symbol_from_elf): Likewise. (read_context::lookup_public_variable_symbol_from_elf): Likewise. (read_context::load_symbol_maps): Likewise. (build_var_decl, build_function_decl): Likewise. * src/abg-ir.cc (elf_symbol::priv::{main_symbol_, next_alias_}): Change the type of these from elf_symbol* to elf_symbol_wptr. (elf_symbol::priv::priv): Adjust. (elf_symbol::{create, get_alias_which_equals}): Define new functions. (textually_equals): Likewise. (elf_symbol::{get_main_symbol, is_main_symbol, get_next_alias, add_alias}): Adjust to return or take elf_symbol_sptr type, rather than a elf_symbol* one. (elf_symbol::{get_aliases_id_string, does_alias}): Adjust. (compute_alias_for_elf_symbol): Likewise. (elf_symbol::operator==): Two symbols A and B are now equal if A has at least one alias that is textually equal to B. (equals): In the overload for function_decls, in the part where we compare the decl_base part of the functions without considering their decl names, we now also omit considering their linkage names, because we compared they symbols before. * tools/abisym.cc (main): Adjust. * tests/data/test-diff-dwarf/test12-report.txt: Adjust. * tests/data/test-diff-dwarf/test12-report.txt: Adjust. * tests/data/test-diff-dwarf/test18-alias-sym-report-0.txt: Adjust. * tests/data/test-diff-dwarf/test8-report.txt: Adjust. * tests/data/test-diff-filter/test10-report.txt: Adjust. * tests/data/test-diff-filter/test13-report.txt: Adjust. * tests/data/test-diff-filter/test2-report.txt: Adjust. * tests/data/test-diff-filter/test20-inline-report-0.txt: Adjust. * tests/data/test-diff-filter/test20-inline-report-1.txt: Adjust. * tests/data/test-diff-filter/test9-report.txt: Adjust. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
119 lines
3.0 KiB
C++
119 lines
3.0 KiB
C++
// -*- Mode: C++ -*-
|
|
//
|
|
// Copyright (C) 2013-2015 Red Hat, Inc.
|
|
//
|
|
// This file is part of the GNU Application Binary Interface Generic
|
|
// Analysis and Instrumentation Library (libabigail). This library is
|
|
// free software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU Lesser General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option) any
|
|
// later version.
|
|
|
|
// This library is distributed in the hope that it will be useful, but
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// General Lesser Public License for more details.
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this program; see the file COPYING-LGPLV3. If
|
|
// not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// Author: Dodji Seketeli
|
|
|
|
/// @file
|
|
///
|
|
/// This file contains the declarations of the entry points to
|
|
/// de-serialize an instance of @ref abigail::corpus from a file in
|
|
/// elf format, containing dwarf information.
|
|
|
|
#include <ostream>
|
|
#include "abg-corpus.h"
|
|
|
|
#ifndef __ABG_DWARF_READER_H__
|
|
#define __ABG_DWARF_READER_H__
|
|
|
|
namespace abigail
|
|
{
|
|
|
|
namespace dwarf_reader
|
|
{
|
|
|
|
using namespace abigail::ir;
|
|
|
|
/// The status of the @ref read_corpus_from_elf() call.
|
|
enum status
|
|
{
|
|
/// The status is in an unknown state
|
|
STATUS_UNKNOWN = 0,
|
|
|
|
/// This status is for when the call went OK.
|
|
STATUS_OK = 1,
|
|
|
|
/// This satus is for when the debug info could not be read.
|
|
STATUS_DEBUG_INFO_NOT_FOUND = 1 << 1,
|
|
|
|
/// This status is for when the symbols of the ELF binaries could
|
|
/// not be read.
|
|
STATUS_NO_SYMBOLS_FOUND = 1 << 2,
|
|
};
|
|
|
|
status
|
|
operator|(status, status);
|
|
|
|
status
|
|
operator&(status, status);
|
|
|
|
status&
|
|
operator|=(status&, status);
|
|
|
|
status&
|
|
operator&=(status&, status);
|
|
|
|
class read_context;
|
|
|
|
/// A convenience typedef for a smart pointer to a
|
|
/// dwarf_reader::read_context.
|
|
typedef shared_ptr<read_context> read_context_sptr;
|
|
|
|
read_context_sptr
|
|
create_read_context(const std::string& elf_path,
|
|
char** debug_info_root_path,
|
|
bool read_all_types = false);
|
|
|
|
status
|
|
read_corpus_from_elf(read_context& ctxt,
|
|
corpus_sptr& resulting_corp);
|
|
status
|
|
read_corpus_from_elf(const std::string& elf_path,
|
|
char** debug_info_root_path,
|
|
bool load_all_types,
|
|
corpus_sptr& resulting_corp);
|
|
|
|
bool
|
|
lookup_symbol_from_elf(const string& elf_path,
|
|
const string& symbol_name,
|
|
bool demangle,
|
|
vector<elf_symbol_sptr>& symbols);
|
|
|
|
bool
|
|
lookup_public_function_symbol_from_elf(const string& path,
|
|
const string& symname,
|
|
vector<elf_symbol_sptr>& func_syms);
|
|
|
|
status
|
|
has_alt_debug_info(read_context& elf_path,
|
|
bool& has_alt_di,
|
|
string& alt_debug_info_path);
|
|
|
|
status
|
|
has_alt_debug_info(const string& elf_path,
|
|
char** debug_info_root_path,
|
|
bool& has_alt_di,
|
|
string& alt_debug_info_path);
|
|
|
|
}// end namespace dwarf_reader
|
|
|
|
}// end namespace abigail
|
|
|
|
#endif //__ABG_DWARF_READER_H__
|