mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-16 06:54:37 +00:00
11c2437a19
For some fine grain redundancy filtering, we need to know when a diff node carries *only* a basic type change. This is because basic type changes should not be marked as redundant; we want to see all of them -- unlike for class or union (user defined) type changes. And so to know if a diff node carries only a basic type change, we need to know if a diff node only carries a local type change. If it carries only a type change, we can safely just look at that type change and see if it's a basic type change or not. So, we then need to know what kind of local changes a diff node carries: type change or non-type change. That way, we can analyze the local changes a node carries and infer that it only carries a local type change or if it also carries a non-type change. This patch thus changes the diff::has_local_changes() pure virtual member function to make it return the enum change_kind bitmask, which describes the different kinds of local changes the diff node has. Note that two new bit values were added to that enum: LOCAL_TYPE_CHANGE_KIND and LOCAL_NON_TYPE_CHANGE_KIND. The first one says that the diff node carries a local type change, while the second one says that the diff node carries a local non-type change kind. The various implementations of that interface are thus amended to make them return the right bitmask. To do this, the patch updates the various 'equals' overloads to make them return the proper enum change_kind bitmap with the LOCAL_TYPE_CHANGE_KIND and LOCAL_NON_TYPE_CHANGE_KIND set, if need be. * include/abg-comparison.h ({diff, type_diff_base, decl_diff_base, distinct_diff, var_diff, pointer_diff, reference_diff, array_diff, qualified_type, enum_diff, class_or_union_diff, class_diff, base_diff, scope_diff, fn_parm_diff, function_type_diff, function_decl_diff, typedef_diff, translation_unit_diff}::has_local_changes): Return an enum change_kind, rather than just a bool. (is_diff_of_basic_type): Declare an overload that takes a boolean flag. (is_qualified_type_diff, peel_pointer_diff, peel_reference_diff) (peel_qualified_type, peel_pointer_or_qualified_type): Declare new functions * include/abg-fwd.h (peel_qualified_type): * include/abg-ir.h (enum change_kind::{LOCAL_TYPE_CHANGE_KIND, LOCAL_NON_TYPE_CHANGE_KIND, ALL_LOCAL_CHANGES_MASK}): Add these three new enumerators. * src/abg-comparison.cc ({distinct_diff, var_diff, pointer_diff, array_diff, reference_diff, qualified_type_diff, enum_diff, class_or_union_diff, class_diff, base_diff, scope_diff, fn_parm_diff, function_type_diff, function_decl_diff, type_decl_diff, typedef_diff, translation_unit_diff}::has_local_changes): Adjust to return an enum change_kind, rather than just a bool. (has_local_type_change_only): Define new functions. (has_basic_type_change_only): Use the new has_local_type_change_only function and the new overload for is_diff_of_basic_type. (is_diff_of_basic_type): Define an overload that takes a boolean flag. (is_qualified_type_diff, peel_pointer_diff, peel_reference_diff) (peel_qualified_type, peel_pointer_or_qualified_type): Define new functions. * src/abg-ir.cc (equals): In the overloads for decl_base, scope_decl, type_base, qualified_type_diff, pointer_type_def, reference_type_def, array_type_def, enum_type_decl, typedef_decl, var_decl, function_type, function_decl, function_decl::parameter, class_or_union, class_decl::base_spec and class_decl, properly set the new abigail::ir::{LOCAL_CHANGE_KIND, LOCAL_NON_TYPE_CHANGE_KIND, LOCAL_TYPE_CHANGE_KIND} bits. (types_have_similar_structure): Peel qualified types and typedefs off, first thing. (peel_qualified_or_typedef_type): Define new function. * tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt: Adjust. * tests/data/test-diff-filter/libtest45-basic-type-change-report-{0,1}.txt: New reference test reports. * tests/data/test-diff-filter/libtest45-basic-type-change-v{0,1}.so: New input test binaries. * tests/data/test-diff-filter/test45-basic-type-change-v{0,1}.cc: Source code of the input test binaries above. * tests/data/Makefile.am: Add the new test file above to source distribution. * tests/test-diff-filter.cc: Add the test input above to the test harness. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
677 lines
26 KiB
C++
677 lines
26 KiB
C++
// -*- Mode: C++ -*-
|
|
//
|
|
// Copyright (C) 2013-2018 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 program runs a diff between input ELF files containing DWARF
|
|
/// debugging information and compares the resulting report with a
|
|
/// reference report. If the resulting report is different from the
|
|
/// reference report, the test has failed. Note that the comparison
|
|
/// is done using the abidiff command line comparison tool.
|
|
///
|
|
/// The set of input files and reference reports to consider should be
|
|
/// present in the source distribution.
|
|
|
|
#include <sys/wait.h>
|
|
#include <cassert>
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
#include "abg-workers.h"
|
|
#include "abg-tools-utils.h"
|
|
#include "test-utils.h"
|
|
|
|
using std::string;
|
|
using std::cerr;
|
|
|
|
/// This is an aggregate that specifies where a test shall get its
|
|
/// input from and where it shall write its ouput to.
|
|
struct InOutSpec
|
|
{
|
|
const char* in_elfv0_path;
|
|
const char* in_elfv1_path;
|
|
const char* abidiff_options;
|
|
const char* in_report_path;
|
|
const char* out_report_path;
|
|
}; // end struct InOutSpec;
|
|
|
|
InOutSpec in_out_specs[] =
|
|
{
|
|
{
|
|
"data/test-diff-filter/test0-v0.o",
|
|
"data/test-diff-filter/test0-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test0-report.txt",
|
|
"output/test-diff-filter/test0-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test0-v0.o",
|
|
"data/test-diff-filter/test0-v1.o",
|
|
"--no-default-suppression --harmless --no-linkage-name "
|
|
"--no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test01-report.txt",
|
|
"output/test-diff-filter/test01-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test1-v0.o",
|
|
"data/test-diff-filter/test1-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test1-report.txt",
|
|
"output/test-diff-filter/test1-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test2-v0.o",
|
|
"data/test-diff-filter/test2-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test2-report.txt",
|
|
"output/test-diff-filter/test2-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test3-v0.o",
|
|
"data/test-diff-filter/test3-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test3-report.txt",
|
|
"output/test-diff-filter/test3-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test4-v0.o",
|
|
"data/test-diff-filter/test4-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test4-report.txt",
|
|
"output/test-diff-filter/test4-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test5-v0.o",
|
|
"data/test-diff-filter/test5-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test5-report.txt",
|
|
"output/test-diff-filter/test5-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test6-v0.o",
|
|
"data/test-diff-filter/test6-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test6-report.txt",
|
|
"output/test-diff-filter/test6-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test7-v0.o",
|
|
"data/test-diff-filter/test7-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test7-report.txt",
|
|
"output/test-diff-filter/test7-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test8-v0.o",
|
|
"data/test-diff-filter/test8-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test8-report.txt",
|
|
"output/test-diff-filter/test8-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test9-v0.o",
|
|
"data/test-diff-filter/test9-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test9-report.txt",
|
|
"output/test-diff-filter/test9-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test10-v0.o",
|
|
"data/test-diff-filter/test10-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test10-report.txt",
|
|
"output/test-diff-filter/test10-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test11-v0.o",
|
|
"data/test-diff-filter/test11-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test11-report.txt",
|
|
"output/test-diff-filter/test11-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test12-v0.o",
|
|
"data/test-diff-filter/test12-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test12-report.txt",
|
|
"output/test-diff-filter/test12-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test13-v0.o",
|
|
"data/test-diff-filter/test13-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test13-report.txt",
|
|
"output/test-diff-filter/test13-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test14-v0.o",
|
|
"data/test-diff-filter/test14-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test14-0-report.txt",
|
|
"output/test-diff-filter/test14-0-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test14-v0.o",
|
|
"data/test-diff-filter/test14-v1.o",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test14-1-report.txt",
|
|
"output/test-diff-filter/test14-1-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test15-v0.o",
|
|
"data/test-diff-filter/test15-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test15-0-report.txt",
|
|
"output/test-diff-filter/test15-0-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test15-v0.o",
|
|
"data/test-diff-filter/test15-v1.o",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test15-1-report.txt",
|
|
"output/test-diff-filter/test15-1-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test16-v0.o",
|
|
"data/test-diff-filter/test16-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test16-report.txt",
|
|
"output/test-diff-filter/test16-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test16-v0.o",
|
|
"data/test-diff-filter/test16-v1.o",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test16-report-2.txt",
|
|
"output/test-diff-filter/test16-report-2.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test17-v0.o",
|
|
"data/test-diff-filter/test17-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test17-0-report.txt",
|
|
"output/test-diff-filter/test17-0-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test17-v0.o",
|
|
"data/test-diff-filter/test17-v1.o",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test17-1-report.txt",
|
|
"output/test-diff-filter/test17-1-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test18-v0.o",
|
|
"data/test-diff-filter/test18-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test18-report.txt",
|
|
"output/test-diff-filter/test18-report.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test19-enum-v0.o",
|
|
"data/test-diff-filter/test19-enum-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test19-enum-report-0.txt",
|
|
"output/test-diff-filter/test19-enum-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test19-enum-v0.o",
|
|
"data/test-diff-filter/test19-enum-v1.o",
|
|
"--no-default-suppression --no-show-locs --harmless",
|
|
"data/test-diff-filter/test19-enum-report-1.txt",
|
|
"output/test-diff-filter/test19-enum-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test20-inline-v0.o",
|
|
"data/test-diff-filter/test20-inline-v1.o",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test20-inline-report-0.txt",
|
|
"output/test-diff-filter/test20-inline-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test20-inline-v0.o",
|
|
"data/test-diff-filter/test20-inline-v1.o",
|
|
"--no-default-suppression --no-show-locs --harmless",
|
|
"data/test-diff-filter/test20-inline-report-1.txt",
|
|
"output/test-diff-filter/test20-inline-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest21-compatible-vars-v0.so",
|
|
"data/test-diff-filter/libtest21-compatible-vars-v1.so",
|
|
"--no-default-suppression --no-show-locs --harmless",
|
|
"data/test-diff-filter/test21-compatible-vars-report-0.txt",
|
|
"output/test-diff-filter/test21-compatible-vars-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest21-compatible-vars-v0.so",
|
|
"data/test-diff-filter/libtest21-compatible-vars-v1.so",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test21-compatible-vars-report-1.txt",
|
|
"output/test-diff-filter/test21-compatible-vars-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest22-compatible-fns-v0.so",
|
|
"data/test-diff-filter/libtest22-compatible-fns-v1.so",
|
|
"--no-default-suppression --no-show-locs --harmless",
|
|
"data/test-diff-filter/test22-compatible-fns-report-0.txt",
|
|
"output/test-diff-filter/test22-compatible-fns-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest22-compatible-fns-v0.so",
|
|
"data/test-diff-filter/libtest22-compatible-fns-v1.so",
|
|
"--no-default-suppression --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test22-compatible-fns-report-1.txt",
|
|
"output/test-diff-filter/test22-compatible-fns-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest23-redundant-fn-parm-change-v0.so",
|
|
"data/test-diff-filter/libtest23-redundant-fn-parm-change-v1.so",
|
|
"--no-default-suppression --no-show-locs",
|
|
"data/test-diff-filter/test23-redundant-fn-parm-change-report-0.txt ",
|
|
"output/test-diff-filter/test23-redundant-fn-parm-change-report-0.txt ",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest24-compatible-vars-v0.so",
|
|
"data/test-diff-filter/libtest24-compatible-vars-v1.so",
|
|
"--no-default-suppression --no-show-locs",
|
|
"data/test-diff-filter/test24-compatible-vars-report-0.txt ",
|
|
"output/test-diff-filter/test24-compatible-vars-report-0.txt ",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest24-compatible-vars-v0.so",
|
|
"data/test-diff-filter/libtest24-compatible-vars-v1.so",
|
|
"--no-default-suppression --no-show-locs --harmless",
|
|
"data/test-diff-filter/test24-compatible-vars-report-1.txt ",
|
|
"output/test-diff-filter/test24-compatible-vars-report-1.txt ",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest25-cyclic-type-v0.so",
|
|
"data/test-diff-filter/libtest25-cyclic-type-v1.so",
|
|
"--no-default-suppression --no-show-locs",
|
|
"data/test-diff-filter/test25-cyclic-type-report-0.txt ",
|
|
"output/test-diff-filter/test25-cyclic-type-report-0.txt "
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest25-cyclic-type-v0.so",
|
|
"data/test-diff-filter/libtest25-cyclic-type-v1.so",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test25-cyclic-type-report-1.txt ",
|
|
"output/test-diff-filter/test25-cyclic-type-report-1.txt "
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest26-qualified-redundant-node-v0.so",
|
|
"data/test-diff-filter/libtest26-qualified-redundant-node-v1.so",
|
|
"--no-default-suppression --no-show-locs",
|
|
"data/test-diff-filter/test26-qualified-redundant-node-report-0.txt",
|
|
"output/test-diff-filter/test26-qualified-redundant-node-report-0.txt"
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest26-qualified-redundant-node-v0.so",
|
|
"data/test-diff-filter/libtest26-qualified-redundant-node-v1.so",
|
|
"--no-default-suppression --no-show-locs --redundant",
|
|
"data/test-diff-filter/test26-qualified-redundant-node-report-1.txt",
|
|
"output/test-diff-filter/test26-qualified-redundant-node-report-1.txt"
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v0.so",
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v1.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-0.txt",
|
|
"output/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-0.txt"
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v0.so",
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v1.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --redundant",
|
|
"data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-1.txt",
|
|
"output/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-1.txt"
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v0.so",
|
|
"data/test-diff-filter/libtest27-redundant-and-filtered-children-nodes-v1.so",
|
|
"--no-default-suppression --no-linkage-name --redundant --no-show-locs --harmless",
|
|
"data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-2.txt",
|
|
"output/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-2.txt"
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest28-redundant-and-filtered-children-nodes-v0.so",
|
|
"data/test-diff-filter/libtest28-redundant-and-filtered-children-nodes-v1.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-0.txt",
|
|
"output/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest28-redundant-and-filtered-children-nodes-v0.so",
|
|
"data/test-diff-filter/libtest28-redundant-and-filtered-children-nodes-v1.so",
|
|
"--no-default-suppression --no-linkage-name --redundant --no-show-locs --harmless",
|
|
"data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-1.txt",
|
|
"output/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test29-finer-redundancy-marking-v0.o",
|
|
"data/test-diff-filter/test29-finer-redundancy-marking-v1.o",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test29-finer-redundancy-marking-report-0.txt",
|
|
"output/test-diff-filter/test29-finer-redundancy-marking-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-liba.so",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-libb.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-report0.txt",
|
|
"output/test-diff-filter/test30-pr18904-rvalueref-report0.txt",
|
|
},
|
|
{ // Just like the previous test, but emit loc info.
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-liba.so",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-libb.so",
|
|
"--no-default-suppression --no-linkage-name --no-redundant",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-report1.txt",
|
|
"output/test-diff-filter/test30-pr18904-rvalueref-report1.txt",
|
|
},
|
|
{ // Just like the previous test, but emit sizes in hex and bytes
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-liba.so",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-libb.so",
|
|
"--no-default-suppression --no-linkage-name --no-redundant "
|
|
"--show-hex --show-bytes",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-report2.txt",
|
|
"output/test-diff-filter/test30-pr18904-rvalueref-report2.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-4.8.3.so",
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-4.9.2.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt",
|
|
"output/test-diff-filter/test31-pr18535-libstdc++-report-0.txt",
|
|
},
|
|
{ // Just like the previous test, but emit loc info.
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-4.8.3.so",
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-4.9.2.so",
|
|
"--no-default-suppression --no-linkage-name --no-redundant",
|
|
"data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt",
|
|
"output/test-diff-filter/test31-pr18535-libstdc++-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest32-struct-change-v0.so",
|
|
"data/test-diff-filter/libtest32-struct-change-v1.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test32-ppc64le-struct-change-report0.txt",
|
|
"output/test-diff-filter/test32-ppc64le-struct-change-report0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test33-libelf.so.0.8.13-gcc",
|
|
"data/test-diff-filter/test33-libelf.so.0.8.13-intel16.0.3",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test33-report-0.txt",
|
|
"output/test-diff-filter/test33-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test34-libjemalloc.so.2-gcc-6.1.0",
|
|
"data/test-diff-filter/test34-libjemalloc.so.2-intel-16.0.3",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant",
|
|
"data/test-diff-filter/test34-report-0.txt",
|
|
"output/test-diff-filter/test34-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-liba.so",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-libb.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant --no-added-syms",
|
|
"data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt",
|
|
"output/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-liba.so",
|
|
"data/test-diff-filter/test30-pr18904-rvalueref-libb.so",
|
|
"--no-default-suppression --no-linkage-name --no-show-locs --no-redundant --deleted-fns --changed-vars --no-added-syms",
|
|
"data/test-diff-filter/test35-pr18754-no-added-syms-report-1.txt",
|
|
"output/test-diff-filter/test35-pr18754-no-added-syms-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest36-v0.so",
|
|
"data/test-diff-filter/libtest36-v1.so",
|
|
"--no-default-suppression --no-linkage-name",
|
|
"data/test-diff-filter/test36-report-0.txt",
|
|
"output/test-diff-filter/test36-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest37-v0.so",
|
|
"data/test-diff-filter/libtest37-v1.so",
|
|
"--no-default-suppression --no-linkage-name",
|
|
"data/test-diff-filter/test37-report-0.txt",
|
|
"output/test-diff-filter/test37-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test38/test38-v0",
|
|
"data/test-diff-filter/test38/test38-v1",
|
|
"--no-default-suppression --no-linkage-name",
|
|
"data/test-diff-filter/test38/test38-report-0.txt",
|
|
"output/test-diff-filter/test38/test38-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test39/test39-v0",
|
|
"data/test-diff-filter/test39/test39-v1",
|
|
"--no-default-suppression --no-linkage-name",
|
|
"data/test-diff-filter/test39/test39-report-0.txt",
|
|
"output/test-diff-filter/test39/test39-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest40-v0.so",
|
|
"data/test-diff-filter/libtest40-v1.so",
|
|
"--no-default-suppression --no-linkage-name",
|
|
"data/test-diff-filter/test40-report-0.txt",
|
|
"output/test-diff-filter/test40-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/test41-PR21486-abg-writer.gcc.o",
|
|
"data/test-diff-filter/test41-PR21486-abg-writer.llvm.o",
|
|
"--no-default-suppression",
|
|
"data/test-diff-filter/test41-report-0.txt",
|
|
"output/test-diff-filter/test41-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest42-leaf-report-v0.so",
|
|
"data/test-diff-filter/libtest42-leaf-report-v1.so",
|
|
"--no-default-suppression --leaf-changes-only --impacted-interfaces",
|
|
"data/test-diff-filter/test42-leaf-report-output-0.txt",
|
|
"output/test-diff-filter/test42-leaf-report-output-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest43-decl-only-def-change-leaf-report-v0.so",
|
|
"data/test-diff-filter/libtest43-decl-only-def-change-leaf-report-v1.so",
|
|
"--no-default-suppression --leaf-changes-only",
|
|
"data/test-diff-filter/test43-decl-only-def-change-leaf-report-0.txt",
|
|
"output/test-diff-filter/test43-decl-only-def-change-leaf-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest44-anonymous-data-member-v0.so",
|
|
"data/test-diff-filter/libtest44-anonymous-data-member-v1.so",
|
|
"--no-default-suppression",
|
|
"data/test-diff-filter/test44-anonymous-data-member-report-0.txt",
|
|
"output/test-diff-filter/test44-anonymous-data-member-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest44-anonymous-data-member-v0.so",
|
|
"data/test-diff-filter/libtest44-anonymous-data-member-v1.so",
|
|
"--no-default-suppression --leaf-changes-only",
|
|
"data/test-diff-filter/test44-anonymous-data-member-report-1.txt",
|
|
"output/test-diff-filter/test44-anonymous-data-member-report-1.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest45-basic-type-change-v0.so",
|
|
"data/test-diff-filter/libtest45-basic-type-change-v1.so",
|
|
"--no-default-suppression",
|
|
"data/test-diff-filter/libtest45-basic-type-change-report-0.txt",
|
|
"output/test-diff-filter/libtest45-basic-type-change-report-0.txt",
|
|
},
|
|
{
|
|
"data/test-diff-filter/libtest45-basic-type-change-v0.so",
|
|
"data/test-diff-filter/libtest45-basic-type-change-v1.so",
|
|
"--no-default-suppression --leaf-changes-only",
|
|
"data/test-diff-filter/libtest45-basic-type-change-report-1.txt",
|
|
"output/test-diff-filter/libtest45-basic-type-change-report-1.txt",
|
|
},
|
|
// This should be the last entry
|
|
{NULL, NULL, NULL, NULL, NULL}
|
|
};
|
|
|
|
/// A task which launches abidiff on the binaries passed to the
|
|
/// constructor of the task. The test also launches gnu diff on the
|
|
/// result of the abidiff to compare it against a reference abidiff
|
|
/// result.
|
|
struct test_task : public abigail::workers::task
|
|
{
|
|
InOutSpec spec;
|
|
bool is_ok;
|
|
string diff_cmd;
|
|
string error_message;
|
|
|
|
test_task(const InOutSpec& s)
|
|
: spec(s),
|
|
is_ok(true)
|
|
{}
|
|
|
|
/// This virtual function overload actually performs the job of the
|
|
/// task.
|
|
///
|
|
/// It actually launches abidiff on the binaries passed to the
|
|
/// constructor of the task. It also launches gnu diff on the
|
|
/// result of the abidiff to compare it against a reference abidiff
|
|
/// result.
|
|
virtual void
|
|
perform()
|
|
{
|
|
using abigail::tests::get_src_dir;
|
|
using abigail::tests::get_build_dir;
|
|
using abigail::tools_utils::ensure_parent_dir_created;
|
|
using abigail::tools_utils::abidiff_status;
|
|
|
|
string in_elfv0_path, in_elfv1_path,
|
|
abidiff_options, abidiff, cmd,
|
|
ref_diff_report_path, out_diff_report_path;
|
|
|
|
in_elfv0_path = string(get_src_dir()) + "/tests/" + spec.in_elfv0_path;
|
|
in_elfv1_path = string(get_src_dir()) + "/tests/" + spec.in_elfv1_path;
|
|
abidiff_options = spec.abidiff_options;
|
|
ref_diff_report_path =
|
|
string(get_src_dir()) + "/tests/" + spec.in_report_path;
|
|
out_diff_report_path =
|
|
string(get_build_dir()) + "/tests/" + spec.out_report_path;
|
|
|
|
if (!ensure_parent_dir_created(out_diff_report_path))
|
|
{
|
|
error_message = string("could not create parent directory for ")
|
|
+ out_diff_report_path;
|
|
is_ok = false;
|
|
return;
|
|
}
|
|
|
|
abidiff = string(get_build_dir()) + "/tools/abidiff";
|
|
abidiff += " " + abidiff_options;
|
|
|
|
cmd = abidiff + " " + in_elfv0_path + " " + in_elfv1_path;
|
|
cmd += " > " + out_diff_report_path;
|
|
|
|
bool abidiff_ok = true;
|
|
int code = system(cmd.c_str());
|
|
if (!WIFEXITED(code))
|
|
abidiff_ok = false;
|
|
else
|
|
{
|
|
abidiff_status status =
|
|
static_cast<abidiff_status>(WEXITSTATUS(code));
|
|
if (abigail::tools_utils::abidiff_status_has_error(status))
|
|
abidiff_ok = false;
|
|
}
|
|
|
|
if (abidiff_ok)
|
|
{
|
|
cmd = "diff -u " + ref_diff_report_path
|
|
+ " " + out_diff_report_path;
|
|
|
|
string cmd_no_out = cmd + " > /dev/null";
|
|
if (system(cmd_no_out.c_str()))
|
|
{
|
|
is_ok = false;
|
|
diff_cmd = cmd;
|
|
}
|
|
}
|
|
else
|
|
is_ok = false;
|
|
}
|
|
}; //end struct test_task.
|
|
|
|
/// A convenience typedef for shared
|
|
typedef shared_ptr<test_task> test_task_sptr;
|
|
|
|
int
|
|
main()
|
|
{
|
|
using std::vector;
|
|
using std::tr1::dynamic_pointer_cast;
|
|
using abigail::workers::queue;
|
|
using abigail::workers::task;
|
|
using abigail::workers::task_sptr;
|
|
using abigail::workers::get_number_of_threads;
|
|
|
|
/// Create a task queue. The max number of worker threads of the
|
|
/// queue is the number of the concurrent threads supported by the
|
|
/// processor of the machine this code runs on.
|
|
const size_t num_tests = sizeof(in_out_specs) / sizeof (InOutSpec) - 1;
|
|
size_t num_workers = std::min(get_number_of_threads(), num_tests);
|
|
queue task_queue(num_workers);
|
|
|
|
bool is_ok = true;
|
|
|
|
for (InOutSpec* s = in_out_specs; s->in_elfv0_path; ++s)
|
|
{
|
|
test_task_sptr t(new test_task(*s));
|
|
assert(task_queue.schedule_task(t));
|
|
}
|
|
|
|
/// Wait for all worker threads to finish their job, and wind down.
|
|
task_queue.wait_for_workers_to_complete();
|
|
|
|
// Now walk the results and print whatever error messages need to be
|
|
// printed.
|
|
|
|
const vector<task_sptr>& completed_tasks =
|
|
task_queue.get_completed_tasks();
|
|
|
|
assert(completed_tasks.size() == num_tests);
|
|
|
|
for (vector<task_sptr>::const_iterator ti = completed_tasks.begin();
|
|
ti != completed_tasks.end();
|
|
++ti)
|
|
{
|
|
test_task_sptr t = dynamic_pointer_cast<test_task>(*ti);
|
|
if (!t->is_ok)
|
|
{
|
|
is_ok = false;
|
|
if (!t->diff_cmd.empty())
|
|
system(t->diff_cmd.c_str());
|
|
if (!t->error_message.empty())
|
|
cerr << t->error_message << '\n';
|
|
}
|
|
}
|
|
|
|
return !is_ok;
|
|
}
|