libabigail/tests/test-diff-dwarf.cc
Dodji Seketeli 5ed0e40bfd Bug 20887 - Show relative change of offsets
Until now, an offset change is reported by showing the old and new
offsets of the data member that changed.

This patch adds the string "(by +N bits)" with 'N' being the number of
bits by which the offset of the data member was increased, or "(by -N
bits) if the offset of the data member was decreased of N bits.

The patch also emits a string that says "size hasn't changed" if the
size of the structure did not change.

This can be disabled by a new --no-show-relative-offset-changes
option.

	* doc/manuals/abidiff.rst: Document the new
	--no-show-relative-offset-changes.
	* doc/manuals/abipkgdiff.rst: Likewise.
	* include/abg-comparison.h
	(diff_context::show_relative_offset_changes): New accessors.
	* include/abg-ir.h ({set,get}_data_member_offset): Return uint64_t
	instead of the less portable size_t.
	* src/abg-comparison.cc
	(diff_context::priv::show_relative_offset_changes_): New data
	member.
	(dif_context::show_relative_offset_changes): Define accessor.
	(maybe_show_relative_offset_change): Define new function.
	(represent): In the overload for var_diff, call the new
	maybe_show_relative_offset_change.
	(report_size_and_alignment_changes):  If the size of the type
	didn't change then say it now.
	* src/abg-ir.cc (set_data_member_offset, get_data_member_offset):
	Take or return a uint64_t instead of a size_t.
	* tools/abidiff.cc (options::show_relative_offset_changes): New
	data member.
	(options::options): Initialize it.
	(display_usage): Display help string for the new
	--no-show-relative-offset-changes.
	(parse_command_line): Parse the new
	--no-show-relative-offset-changes options.
	(set_diff_context_from_opts): Set the
	"show-relative-offset-changes" flag according to the new option.n
	* tools/abipkgdiff.cc (options::show_relative_offset_changes): New
	data member.
	(options::options): Initialize it.
	(display_usage): Add help string for the new
	--no-show-relative-offset-changes option.
	(set_diff_context_from_opts): Set the
	"show-relative-offset-changes" flag according to the new option.
	(parse_command_line): Parse the new command line option.
	* tests/data/test-diff-dwarf/test40-report-0.txt: Add new
	reference output.
	* tests/data/test-diff-dwarf/test40-v0.c: Source code of the first
	test binary.
	* tests/data/test-diff-dwarf/test40-v1.c: Source code of the
	second test binay.
	* tests/data/test-diff-dwarf/libtest40-v0.so: New first test binary.
	* tests/data/test-diff-dwarf/libtest40-v1.so: New second test binary.
	* tests/test-diff-dwarf.cc (in_out_spec): Add the new test
	binaries above to the set of binaries that are compared.
	* tests/data/Makefile.am: Add the new test material to source
	distribution.
	* tests/data/test-abicompat/test7-fn-changed-report-0.txt: Adjust.
	* tests/data/test-abidiff/test-PR18791-report0.txt: Likewise.
	* tests/data/test-abidiff/test-enum0-report.txt: Likewise.
	* tests/data/test-abidiff/test-enum1-report.txt: Likewise.
	* tests/data/test-abidiff/test-struct1-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test0-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test1-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test10-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test11-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test13-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test15-enum-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test27-local-base-diff-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test32-fnptr-changes-report-0.txt: Likewise.
	* tests/data/test-diff-dwarf/test33-fnref-changes-report-0.txt: Likewise.
	* tests/data/test-diff-dwarf/test38-union-report-0.txt: Likewise.
	* tests/data/test-diff-dwarf/test4-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test5-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test6-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test8-report.txt: Likewise.
	* tests/data/test-diff-filter/test0-report.txt: Likewise.
	* tests/data/test-diff-filter/test01-report.txt: Likewise.
	* tests/data/test-diff-filter/test1-report.txt: Likewise.
	* tests/data/test-diff-filter/test13-report.txt: Likewise.
	* tests/data/test-diff-filter/test16-report-2.txt: Likewise.
	* tests/data/test-diff-filter/test16-report.txt: Likewise.
	* tests/data/test-diff-filter/test17-0-report.txt: Likewise.
	* tests/data/test-diff-filter/test17-1-report.txt: Likewise.
	* tests/data/test-diff-filter/test18-report.txt: Likewise.
	* tests/data/test-diff-filter/test19-enum-report-1.txt: Likewise.
	* tests/data/test-diff-filter/test2-report.txt: Likewise.
	* tests/data/test-diff-filter/test23-redundant-fn-parm-change-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test24-compatible-vars-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test25-cyclic-type-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test25-cyclic-type-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test26-qualified-redundant-node-report-0.t:
	Likewise.xt
	* tests/data/test-diff-filter/test26-qualified-redundant-node-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-2.txt:
	Likewise.
	* tests/data/test-diff-filter/test29-finer-redundancy-marking-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test3-report.txt: Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
	Likewise.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
	Likewise.
	* tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt: Likewise.
	* tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt: Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt: Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test0-type-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test0-type-suppr-report-3.txt: Likewise.
	* tests/data/test-diff-suppr/test0-type-suppr-report-5.txt: Likewise.
	* tests/data/test-diff-suppr/test0-type-suppr-report-7.txt: Likewise.
	* tests/data/test-diff-suppr/test1-typedef-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test1-typedef-suppr-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test10-changed-parm-c-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test2-struct-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test23-alias-filter-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test23-alias-filter-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test3-struct-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test3-struct-suppr-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test3-struct-suppr-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test30-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test4-local-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test4-local-suppr-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-3.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-4.txt: Likewise.
	* tests/data/test-diff-suppr/test5-fn-suppr-report-5.txt: Likewise.
	* tests/data/test-diff-suppr/test6-fn-suppr-report-0-1.txt: Likewise.
	* tests/data/test-diff-suppr/test6-fn-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test6-fn-suppr-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test6-fn-suppr-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test6-fn-suppr-report-3.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-0.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-2.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-3.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-4.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-7.txt: Likewise.
	* tests/data/test-diff-suppr/test7-var-suppr-report-8.txt: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-12-02 21:29:28 +01:00

425 lines
14 KiB
C++

// -*- Mode: C++ -*-
//
// Copyright (C) 2013-2016 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 dwarf files 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 libabigail
/// library directly.
///
/// The set of input files and reference reports to consider should be
/// present in the source distribution.
#include <string>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include "abg-tools-utils.h"
#include "test-utils.h"
#include "abg-dwarf-reader.h"
#include "abg-comparison.h"
using std::string;
using std::ofstream;
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* in_report_path;
const char* out_report_path;
};// end struct InOutSpec
InOutSpec in_out_specs[] =
{
{
"data/test-diff-dwarf/test0-v0.o",
"data/test-diff-dwarf/test0-v1.o",
"data/test-diff-dwarf/test0-report.txt",
"output/test-diff-dwarf/test0-report.txt"
},
{
"data/test-diff-dwarf/test1-v0.o",
"data/test-diff-dwarf/test1-v1.o",
"data/test-diff-dwarf/test1-report.txt",
"output/test-diff-dwarf/test1-report.txt"
},
{
"data/test-diff-dwarf/test2-v0.o",
"data/test-diff-dwarf/test2-v1.o",
"data/test-diff-dwarf/test2-report.txt",
"output/test-diff-dwarf/test2-report.txt"
},
{
"data/test-diff-dwarf/test3-v0.o",
"data/test-diff-dwarf/test3-v1.o",
"data/test-diff-dwarf/test3-report.txt",
"output/test-diff-dwarf/test3-report.txt"
},
{
"data/test-diff-dwarf/test3-v0.o",
"data/test-diff-dwarf/test3-v1.o",
"data/test-diff-dwarf/test3-report.txt",
"output/test-diff-dwarf/test3-report.txt"
},
{
"data/test-diff-dwarf/test4-v0.o",
"data/test-diff-dwarf/test4-v1.o",
"data/test-diff-dwarf/test4-report.txt",
"output/test-diff-dwarf/test4-report.txt"
},
{
"data/test-diff-dwarf/test5-v0.o",
"data/test-diff-dwarf/test5-v1.o",
"data/test-diff-dwarf/test5-report.txt",
"output/test-diff-dwarf/test5-report.txt"
},
{
"data/test-diff-dwarf/test6-v0.o",
"data/test-diff-dwarf/test6-v1.o",
"data/test-diff-dwarf/test6-report.txt",
"output/test-diff-dwarf/test6-report.txt"
},
{
"data/test-diff-dwarf/test7-v0.o",
"data/test-diff-dwarf/test7-v1.o",
"data/test-diff-dwarf/test7-report.txt",
"output/test-diff-dwarf/test7-report.txt"
},
{
"data/test-diff-dwarf/test8-v0.o",
"data/test-diff-dwarf/test8-v1.o",
"data/test-diff-dwarf/test8-report.txt",
"output/test-diff-dwarf/test8-report.txt"
},
{
"data/test-diff-dwarf/libtest9-v0.so",
"data/test-diff-dwarf/libtest9-v1.so",
"data/test-diff-dwarf/test9-report.txt",
"output/test-diff-dwarf/test9-report.txt"
},
{
"data/test-diff-dwarf/test10-v0.o",
"data/test-diff-dwarf/test10-v1.o",
"data/test-diff-dwarf/test10-report.txt",
"output/test-diff-dwarf/test10-report.txt"
},
{
"data/test-diff-dwarf/test11-v0.o",
"data/test-diff-dwarf/test11-v1.o",
"data/test-diff-dwarf/test11-report.txt",
"output/test-diff-dwarf/test11-report.txt"
},
{
"data/test-diff-dwarf/libtest12-v0.so",
"data/test-diff-dwarf/libtest12-v1.so",
"data/test-diff-dwarf/test12-report.txt",
"output/test-diff-dwarf/test12-report.txt"
},
{
"data/test-diff-dwarf/test13-v0.o",
"data/test-diff-dwarf/test13-v1.o",
"data/test-diff-dwarf/test13-report.txt",
"output/test-diff-dwarf/test13-report.txt"
},
{
"data/test-diff-dwarf/test14-inline-v0.o",
"data/test-diff-dwarf/test14-inline-v1.o",
"data/test-diff-dwarf/test14-inline-report.txt",
"output/test-diff-dwarf/test14-inline-report.txt"
},
{
"data/test-diff-dwarf/test15-enum-v0.o",
"data/test-diff-dwarf/test15-enum-v1.o",
"data/test-diff-dwarf/test15-enum-report.txt",
"output/test-diff-dwarf/test15-enum-report.txt"
},
{
"data/test-diff-dwarf/test16-syms-only-v0.o",
"data/test-diff-dwarf/test16-syms-only-v1.o",
"data/test-diff-dwarf/test16-syms-only-report.txt",
"output/test-diff-dwarf/test16-syms-only-report.txt"
},
{
"data/test-diff-dwarf/test17-non-refed-syms-v0.o",
"data/test-diff-dwarf/test17-non-refed-syms-v1.o",
"data/test-diff-dwarf/test17-non-refed-syms-report-0.txt",
"output/test-diff-dwarf/test17-non-refed-syms-report-0.txt"
},
{
"data/test-diff-dwarf/libtest18-alias-sym-v0.so",
"data/test-diff-dwarf/libtest18-alias-sym-v1.so",
"data/test-diff-dwarf/test18-alias-sym-report-0.txt",
"output/test-diff-dwarf/test18-alias-sym-report-0.txt"
},
{
"data/test-diff-dwarf/libtest19-soname-v0.so",
"data/test-diff-dwarf/libtest19-soname-v1.so",
"data/test-diff-dwarf/test19-soname-report-0.txt",
"output/test-diff-dwarf/test19-soname-report-0.txt"
},
{
"data/test-diff-dwarf/libtest20-add-fn-parm-v0.so",
"data/test-diff-dwarf/libtest20-add-fn-parm-v1.so",
"data/test-diff-dwarf/test20-add-fn-parm-report-0.txt",
"output/test-diff-dwarf/test20-add-fn-parm-report-0.txt"
},
{
"data/test-diff-dwarf/libtest21-redundant-fn-v0.so",
"data/test-diff-dwarf/libtest21-redundant-fn-v1.so",
"data/test-diff-dwarf/test21-redundant-fn-report-0.txt",
"output/test-diff-dwarf/test21-redundant-fn-report-0.txt"
},
{
"data/test-diff-dwarf/libtest22-changed-parm-c-v0.so",
"data/test-diff-dwarf/libtest22-changed-parm-c-v1.so",
"data/test-diff-dwarf/test22-changed-parm-c-report-0.txt",
"output/test-diff-dwarf/test22-changed-parm-c-report-0.txt"
},
{
"data/test-diff-dwarf/libtest-23-diff-arch-v0-32.so",
"data/test-diff-dwarf/libtest-23-diff-arch-v0-64.so",
"data/test-diff-dwarf/test-23-diff-arch-report-0.txt",
"output/test-diff-dwarf/test-23-diff-arch-report-0.txt"
},
{
"data/test-diff-dwarf/libtest24-added-fn-parms-v0.so",
"data/test-diff-dwarf/libtest24-added-fn-parms-v1.so",
"data/test-diff-dwarf/test24-added-fn-parms-report-0.txt",
"output/test-diff-dwarf/test24-added-fn-parms-report-0.txt"
},
{
"data/test-diff-dwarf/libtest25-removed-fn-parms-v0.so",
"data/test-diff-dwarf/libtest25-removed-fn-parms-v1.so",
"data/test-diff-dwarf/test25-removed-fn-parms-report-0.txt",
"output/test-diff-dwarf/test25-removed-fn-parms-report-0.txt"
},
{
"data/test-diff-dwarf/libtest26-added-parms-before-variadic-v0.so",
"data/test-diff-dwarf/libtest26-added-parms-before-variadic-v1.so",
"data/test-diff-dwarf/test26-added-parms-before-variadic-report.txt",
"output/test-diff-dwarf/test26-added-parms-before-variadic-report.txt"
},
{
"data/test-diff-dwarf/test27-local-base-diff-v0.o",
"data/test-diff-dwarf/test27-local-base-diff-v1.o",
"data/test-diff-dwarf/test27-local-base-diff-report.txt",
"output/test-diff-dwarf/test27-local-base-diff-report.txt"
},
{
"data/test-diff-dwarf/test28-vtable-changes-v0.o",
"data/test-diff-dwarf/test28-vtable-changes-v1.o",
"data/test-diff-dwarf/test28-vtable-changes-report-0.txt",
"output/test-diff-dwarf/test28-vtable-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test29-vtable-changes-v0.o",
"data/test-diff-dwarf/test29-vtable-changes-v1.o",
"data/test-diff-dwarf/test29-vtable-changes-report-0.txt",
"output/test-diff-dwarf/test29-vtable-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test30-vtable-changes-v0.o",
"data/test-diff-dwarf/test30-vtable-changes-v1.o",
"data/test-diff-dwarf/test30-vtable-changes-report-0.txt",
"output/test-diff-dwarf/test30-vtable-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test31-vtable-changes-v0.o",
"data/test-diff-dwarf/test31-vtable-changes-v1.o",
"data/test-diff-dwarf/test31-vtable-changes-report-0.txt",
"output/test-diff-dwarf/test31-vtable-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test32-fnptr-changes-v0.o",
"data/test-diff-dwarf/test32-fnptr-changes-v1.o",
"data/test-diff-dwarf/test32-fnptr-changes-report-0.txt",
"output/test-diff-dwarf/test32-fnptr-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test33-fnref-changes-v0.o",
"data/test-diff-dwarf/test33-fnref-changes-v1.o",
"data/test-diff-dwarf/test33-fnref-changes-report-0.txt",
"output/test-diff-dwarf/test33-fnref-changes-report-0.txt"
},
{
"data/test-diff-dwarf/test34-pr19173-libfoo.so",
"data/test-diff-dwarf/test34-pr19173-libfoo2.so",
"data/test-diff-dwarf/test34-pr19173-libfoo-report-0.txt",
"output/test-diff-dwarf/test34-pr19173-libfoo-report-0.txt"
},
{
"data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc.so",
"data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc2.so",
"data/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt",
"output/test-diff-dwarf/test35-pr19173-libfoo-long-gcc-report-0.txt"
},
{
"data/test-diff-dwarf/test35-pr19173-libfoo-long-clang.so",
"data/test-diff-dwarf/test35-pr19173-libfoo-long-clang2.so",
"data/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt",
"output/test-diff-dwarf/test35-pr19173-libfoo-long-clang-report-0.txt"
},
{
"data/test-diff-dwarf/libtest36-ppc64-aliases-v0.so",
"data/test-diff-dwarf/libtest36-ppc64-aliases-v1.so",
"data/test-diff-dwarf/test36-ppc64-aliases-report-0.txt",
"output/test-diff-dwarf/test36-ppc64-aliases-report-0.txt"
},
{
"data/test-diff-dwarf/libtest37-union-v0.so",
"data/test-diff-dwarf/libtest37-union-v1.so",
"data/test-diff-dwarf/test37-union-report-0.txt",
"output/test-diff-dwarf/test37-union-report-0.txt"
},
{
"data/test-diff-dwarf/libtest38-union-v0.so",
"data/test-diff-dwarf/libtest38-union-v1.so",
"data/test-diff-dwarf/test38-union-report-0.txt",
"output/test-diff-dwarf/test38-union-report-0.txt"
},
{
"data/test-diff-dwarf/libtest39-union-v0.so",
"data/test-diff-dwarf/libtest39-union-v1.so",
"data/test-diff-dwarf/test39-union-report-0.txt",
"output/test-diff-dwarf/test39-union-report-0.txt"
},
{
"data/test-diff-dwarf/libtest40-v0.so",
"data/test-diff-dwarf/libtest40-v1.so",
"data/test-diff-dwarf/test40-report-0.txt",
"output/test-diff-dwarf/test40-report-0.txt"
},
// This should be the last entry
{NULL, NULL, NULL, NULL}
};
int
main()
{
using abigail::tests::get_src_dir;
using abigail::tests::get_build_dir;
using abigail::tools_utils::ensure_parent_dir_created;
using abigail::dwarf_reader::read_corpus_from_elf;
using abigail::comparison::compute_diff;
using abigail::comparison::corpus_diff_sptr;
using abigail::ir::environment;
using abigail::ir::environment_sptr;
using abigail::comparison::diff_context_sptr;
using abigail::comparison::diff_context;
bool is_ok = true;
string in_elfv0_path, in_elfv1_path,
ref_diff_report_path, out_diff_report_path;
for (InOutSpec* s = in_out_specs; s->in_elfv0_path; ++s)
{
in_elfv0_path = string(get_src_dir()) + "/tests/" + s->in_elfv0_path;
in_elfv1_path = string(get_src_dir()) + "/tests/" + s->in_elfv1_path;
out_diff_report_path =
string(get_build_dir()) + "/tests/" + s->out_report_path;
if (!ensure_parent_dir_created(out_diff_report_path))
{
cerr << "could not create parent directory for "
<< out_diff_report_path;
is_ok = false;
continue;
}
abigail::dwarf_reader::status status =
abigail::dwarf_reader::STATUS_UNKNOWN;
environment_sptr env(new environment);
abigail::corpus_sptr corp0 =
read_corpus_from_elf(in_elfv0_path,
/*debug_info_root_path=*/0,
env.get(),
/*load_all_types=*/false,
status);
abigail::corpus_sptr corp1 =
read_corpus_from_elf(in_elfv1_path,
/*debug_info_root_path=*/0,
env.get(),
/*load_all_types=*/false,
status);
if (!corp0)
{
cerr << "failed to read " << in_elfv0_path << "\n";
is_ok = false;
continue;
}
if (!corp1)
{
cerr << "failed to read " << in_elfv1_path << "\n";
is_ok = false;
continue;
}
corp0->set_path(s->in_elfv0_path);
corp1->set_path(s->in_elfv1_path);
diff_context_sptr ctxt(new diff_context);
ctxt->show_locs(false);
corpus_diff_sptr d = compute_diff(corp0, corp1, ctxt);
if (!d)
{
cerr << "failed to compute diff\n";
is_ok = false;
continue;
}
ref_diff_report_path =
string(get_src_dir()) + "/tests/" + s->in_report_path;
out_diff_report_path =
string(get_build_dir()) + "/tests/" + s->out_report_path;
ofstream of(out_diff_report_path.c_str(), std::ios_base::trunc);
if (!of.is_open())
{
cerr << "failed to read " << out_diff_report_path << "\n";
is_ok = false;
continue;
}
if (d->has_changes())
d->report(of);
of.close();
string cmd =
"diff -u " + ref_diff_report_path + " " + out_diff_report_path;
if (system(cmd.c_str()))
is_ok = false;
}
return !is_ok;
}