libabigail/tests/test-annotate.cc
Ondrej Oprala aba99e5106 Bug 20970 - Add a --annotate option to abidw
This option annotates (read "pretty-prints") the types and elf symbols
in the form of XML comments in the ABIXML output emitted by the abidw
command.

Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>

	* doc/manuals/abidiff.rst: Document the '--no-corpus-path'
	option.
	* doc/manuals/abidw.rst: Document the '--no-corpus-path'
	and '--annotate' options.
	* include/abg-libxml-utils.h ({un,}escape_xml_comment): Add
	new function declarations.
	* include/abg-writer.h: Add new annotate functions
	(write_{translation_unit,corpus_to_{archive,native_xml_file}}):
	Add an optional "annotate" parameter defaulting to "false".
	* src/abg-libxml-utils.cc ({un,}escape_xml_comment): Add
	new function definitions.
	* src/abg-writer.cc (annotate): Define new templatized function
	and specialize it for necessary cases.
	* tests/Makefile.am: Add runtestannotate as a new test.
	* tests/data/Makefile.am: Add paths to below reference test
	outputs.
	* tests/data/test-annotate/libtest23.so.abi: New reference test
	output.
	* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Likewise.
	* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
	* tests/data/test-annotate/test0.abi: Likewise.
	* tests/data/test-annotate/test1.abi: Likewise.
	* tests/data/test-annotate/test10-pr18818-gcc.so.abi: Likewise.
	* tests/data/test-annotate/test11-pr18828.so.abi: Likewise.
	* tests/data/test-annotate/test12-pr18844.so.abi: Likewise.
	* tests/data/test-annotate/test13-pr18894.so.abi: Likewise.
	* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test16-pr18904.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi: Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi: Likewise.
	* tests/data/test-annotate/test2.so.abi: Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise.
	* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
	* tests/data/test-annotate/test22-pr19097-libstdc++.so.6.0.17.so.abi: Likewise.
	* tests/data/test-annotate/test3.so.abi: Likewise.
	* tests/data/test-annotate/test4.so.abi: Likewise.
	* tests/data/test-annotate/test5.o.abi: Likewise.
	* tests/data/test-annotate/test6.so.abi: Likewise.
	* tests/data/test-annotate/test7.so.abi: Likewise.
	* tests/data/test-annotate/test8-qualified-this-pointer.so.abi: Likewise.
	* tests/data/test-annotate/test9-pr18818-clang.so.abi: Likewise.
	* tests/test-annotate.cc: New test for ABIXML annotations.
	* tools/abidiff.cc: Add the new option '--no-corpus-path'.
	* tools/abidw.cc: Likewise. Also add the '--annotate' option.

reviews round 1

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2017-01-24 15:41:37 +01:00

224 lines
6.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/test9-pr18818-clang.so",
"data/test-annotate/test9-pr18818-clang.so.abi",
"output/test-annotate/test9-pr18818-clang.so.abi"
},
{
"data/test-read-dwarf/test10-pr18818-gcc.so",
"data/test-annotate/test10-pr18818-gcc.so.abi",
"output/test-annotate/test10-pr18818-gcc.so.abi"
},
{
"data/test-read-dwarf/test11-pr18828.so",
"data/test-annotate/test11-pr18828.so.abi",
"output/test-annotate/test11-pr18828.so.abi",
},
{
"data/test-read-dwarf/test12-pr18844.so",
"data/test-annotate/test12-pr18844.so.abi",
"output/test-annotate/test12-pr18844.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/test16-pr18904.so",
"data/test-annotate/test16-pr18904.so.abi",
"output/test-annotate/test16-pr18904.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/test22-pr19097-libstdc++.so.6.0.17.so",
"data/test-annotate/test22-pr19097-libstdc++.so.6.0.17.so.abi",
"output/test-annotate/test22-pr19097-libstdc++.so.6.0.17.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;
}