libabigail/tests/test-annotate.cc
Dodji Seketeli d65585a772 Fix virtual members sorting to unbreak the build on EL6
When two virtual members functions have the same virtual index, the
same pretty representation, and one of them has no ELF symbols, then
they might be sorted in a way or in an other.  This sorting hazard
breaks the runtestreaddwarf test on EL6.

This patch addresses that to make the virtual member function that has
no ELF symbol to come before the one with an ELF symbol.

Also, it turned out that runtestannotate is broken on EL6 too because
we are trying to demangle c++11-mangled symbols in there, and the
demangler (which is C++<11 only) on that platform doesn't really like
that.  So this patch removes the tests in which there are c++11 symbols
that we try to demangle.

	* src/abg-ir.cc (virtual_member_function_less_than::operator()):
	Update comment.  When two virtual functions have the same virtual
	index and one of them has no ELF symbol, then that function is
	less than the one with an ELF symbol.
	* tests/data/Makefile.am: Remove
	test-annotate/{test9-pr18818-clang.so.abi, test11-pr18828.so.abi,
	test12-pr18844.so.abi, test16-pr18904.so.abi,
	test22-pr19097-libstdc++.so.6.0.17.so.abi}.
	* tests/data/test-annotate/test10-pr18818-gcc.so.abi: Remove.
	* tests/data/test-annotate/test11-pr18828.so.abi: Likewise.
	* tests/data/test-annotate/test12-pr18844.so.abi: Likewise.
	* tests/data/test-annotate/test16-pr18904.so.abi: Likewise.
	* tests/data/test-annotate/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.
	* tests/test-annotate.cc (in_out_specs):  Remove those tests above
	which input files have been removed.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2017-03-03 12:56:44 +01:00

194 lines
5.4 KiB
C++

// -*- Mode: C++ -*-
//
// 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: Ondrej Oprala
/// @file
///
/// This program tests the annotation capabilities of the library.
#include <iostream>
#include <cstdlib>
#include "abg-tools-utils.h"
#include "test-utils.h"
using std::cerr;
using std::string;
struct InOutSpec
{
const char* in_elf_path;
const char* in_report_path;
const char* out_report_path;
};
InOutSpec in_out_specs[] =
{
{
"data/test-read-dwarf/test0",
"data/test-annotate/test0.abi",
"output/test-annotate/test0.abi"
},
{
"data/test-read-dwarf/test1",
"data/test-annotate/test1.abi",
"output/test-annotate/test1.abi"
},
{
"data/test-read-dwarf/test2.so",
"data/test-annotate/test2.so.abi",
"output/test-annotate/test2.so.abi"
},
{
"data/test-read-dwarf/test3.so",
"data/test-annotate/test3.so.abi",
"output/test-annotate/test3.so.abi"
},
{
"data/test-read-dwarf/test4.so",
"data/test-annotate/test4.so.abi",
"output/test-annotate/test4.so.abi"
},
{
"data/test-read-dwarf/test5.o",
"data/test-annotate/test5.o.abi",
"output/test-annotate/test5.o.abi"
},
{
"data/test-read-dwarf/test6.so",
"data/test-annotate/test6.so.abi",
"output/test-annotate/test6.so.abi"
},
{
"data/test-read-dwarf/test7.so",
"data/test-annotate/test7.so.abi",
"output/test-annotate/test7.so.abi"
},
{
"data/test-read-dwarf/test8-qualified-this-pointer.so",
"data/test-annotate/test8-qualified-this-pointer.so.abi",
"output/test-annotate/test8-qualified-this-pointer.so.abi"
},
{
"data/test-read-dwarf/test13-pr18894.so",
"data/test-annotate/test13-pr18894.so.abi",
"output/test-annotate/test13-pr18894.so.abi",
},
{
"data/test-read-dwarf/test14-pr18893.so",
"data/test-annotate/test14-pr18893.so.abi",
"output/test-annotate/test14-pr18893.so.abi",
},
{
"data/test-read-dwarf/test15-pr18892.so",
"data/test-annotate/test15-pr18892.so.abi",
"output/test-annotate/test15-pr18892.so.abi",
},
{
"data/test-read-dwarf/test17-pr19027.so",
"data/test-annotate/test17-pr19027.so.abi",
"output/test-annotate/test17-pr19027.so.abi",
},
{
"data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so",
"data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi",
"output/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi",
},
{
"data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so",
"data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi",
"output/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi",
},
{
"data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so",
"data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi",
"output/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi",
},
{
"data/test-read-dwarf/test21-pr19092.so",
"data/test-annotate/test21-pr19092.so.abi",
"output/test-annotate/test21-pr19092.so.abi",
},
{
"data/test-read-dwarf/libtest23.so",
"data/test-annotate/libtest23.so.abi",
"output/test-annotate/libtest23.so.abi",
},
{
"data/test-read-dwarf/libtest24-drop-fns.so",
"data/test-annotate/libtest24-drop-fns.so.abi",
"output/test-annotate/libtest24-drop-fns.so.abi",
},
{
"data/test-read-dwarf/libtest24-drop-fns.so",
"data/test-annotate/libtest24-drop-fns-2.so.abi",
"output/test-annotate/libtest24-drop-fns-2.so.abi",
},
// This should be the last entry.
{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;
bool is_ok = true;
string in_elf_path, ref_report_path, out_report_path;
string abidw;
abidw = string(get_build_dir()) + "/tools/abidw "
"--annotate --no-show-locs --no-corpus-path";
for (InOutSpec* s = in_out_specs; s->in_elf_path; ++s)
{
in_elf_path = string(get_src_dir()) + "/tests/" + s->in_elf_path;
ref_report_path = string(get_src_dir()) + "/tests/" + s->in_report_path;
out_report_path =
string(get_build_dir()) + "/tests/" + s->out_report_path;
if (!ensure_parent_dir_created(out_report_path))
{
cerr << "could not create parent directory for "
<< out_report_path;
is_ok = false;
continue;
}
string cmd = abidw + " " + in_elf_path + " > " + out_report_path;
bool abidw_ok = true;
if (system(cmd.c_str()))
abidw_ok = false;
if (abidw_ok)
{
cmd = "diff -u " + ref_report_path + " " + out_report_path;
if (system(cmd.c_str()))
is_ok &=false;
}
else
{
cerr << "command failed: " << cmd << "\n";
is_ok &= false;
}
}
return !is_ok;
}