mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-15 14:34:38 +00:00
b3c3049fdd
Happy New Year 2018, I guess :-) * update-copyright.sh: New sed-based script to update the year in the copyright notice. * include/abg-comp-filter.h: Updated the year in the copyright notice. * include/abg-comparison.h: Likewise. * include/abg-config.h: Likewise. * include/abg-corpus.h: Likewise. * include/abg-diff-utils.h: Likewise. * include/abg-dwarf-reader.h: Likewise. * include/abg-fwd.h: Likewise. * include/abg-hash.h: Likewise. * include/abg-ini.h: Likewise. * include/abg-interned-str.h: Likewise. * include/abg-ir.h: Likewise. * include/abg-libxml-utils.h: Likewise. * include/abg-libzip-utils.h: Likewise. * include/abg-reader.h: Likewise. * include/abg-reporter.h: Likewise. * include/abg-sptr-utils.h: Likewise. * include/abg-suppression.h: Likewise. * include/abg-tools-utils.h: Likewise. * include/abg-traverse.h: Likewise. * include/abg-viz-common.h: Likewise. * include/abg-viz-dot.h: Likewise. * include/abg-viz-svg.h: Likewise. * include/abg-workers.h: Likewise. * include/abg-writer.h: Likewise. * src/abg-comp-filter.cc: Likewise. * src/abg-comparison-priv.h: Likewise. * src/abg-comparison.cc: Likewise. * src/abg-config.cc: Likewise. * src/abg-corpus-priv.h: Likewise. * src/abg-corpus.cc: Likewise. * src/abg-default-reporter.cc: Likewise. * src/abg-diff-utils.cc: Likewise. * src/abg-dwarf-reader.cc: Likewise. * src/abg-hash.cc: Likewise. * src/abg-ini.cc: Likewise. * src/abg-internal.h: Likewise. * src/abg-ir-priv.h: Likewise. * src/abg-ir.cc: Likewise. * src/abg-leaf-reporter.cc: Likewise. * src/abg-libxml-utils.cc: Likewise. * src/abg-libzip-utils.cc: Likewise. * src/abg-reader.cc: Likewise. * src/abg-reporter-priv.cc: Likewise. * src/abg-reporter-priv.h: Likewise. * src/abg-sptr-utils.cc: Likewise. * src/abg-suppression-priv.h: Likewise. * src/abg-suppression.cc: Likewise. * src/abg-tools-utils.cc: Likewise. * src/abg-traverse.cc: Likewise. * src/abg-viz-common.cc: Likewise. * src/abg-viz-dot.cc: Likewise. * src/abg-viz-svg.cc: Likewise. * src/abg-workers.cc: Likewise. * src/abg-writer.cc: Likewise. * tests/print-diff-tree.cc: Likewise. * tests/test-abicompat.cc: Likewise. * tests/test-abidiff-exit.cc: Likewise. * tests/test-abidiff.cc: Likewise. * tests/test-alt-dwarf-file.cc: Likewise. * tests/test-core-diff.cc: Likewise. * tests/test-diff-dwarf-abixml.cc: Likewise. * tests/test-diff-dwarf.cc: Likewise. * tests/test-diff-filter.cc: Likewise. * tests/test-diff-pkg.cc: Likewise. * tests/test-diff-suppr.cc: Likewise. * tests/test-diff2.cc: Likewise. * tests/test-ir-walker.cc: Likewise. * tests/test-lookup-syms.cc: Likewise. * tests/test-read-dwarf.cc: Likewise. * tests/test-read-write.cc: Likewise. * tests/test-types-stability.cc: Likewise. * tests/test-utils.cc: Likewise. * tests/test-utils.h: Likewise. * tests/test-write-read-archive.cc: Likewise. * tools/abiar.cc: Likewise. * tools/abicompat.cc: Likewise. * tools/abidiff.cc: Likewise. * tools/abidw.cc: Likewise. * tools/abilint.cc: Likewise. * tools/abipkgdiff.cc: Likewise. * tools/abisym.cc: Likewise. * tools/binilint.cc: Likewise. * tools/kmidiff.cc: Likewise. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
163 lines
5.2 KiB
C++
163 lines
5.2 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 tests that the representation of types by the
|
|
/// internal representation of libabigail is stable through reading
|
|
/// from ELF/DWARF, constructing an internal represenation, saving that
|
|
/// internal presentation to the abixml format, reading from that
|
|
/// abixml format and constructing an internal representation from it
|
|
/// again.
|
|
///
|
|
/// This program thus compares the internal representation that is
|
|
/// built from reading from ELF/DWARF and the one that is built from
|
|
/// the abixml (which itself results from the serialization of the
|
|
/// first internal representation to abixml).
|
|
///
|
|
/// The comparison is expected to yield the empty set.
|
|
|
|
#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"
|
|
#include "abg-workers.h"
|
|
|
|
using std::string;
|
|
using std::ofstream;
|
|
using std::cerr;
|
|
|
|
// A set of elf files to test type stability for.
|
|
const char* elf_paths[] =
|
|
{
|
|
"data/test-types-stability/pr19434-elf0",
|
|
"data/test-types-stability/pr19139-DomainNeighborMapInst.o",
|
|
"data/test-types-stability/pr19202-libmpi_gpfs.so.5.0",
|
|
"data/test-types-stability/pr19026-libvtkIOSQL-6.1.so.1",
|
|
"data/test-types-stability/pr19138-elf0",
|
|
"data/test-types-stability/pr19433-custom0",
|
|
"data/test-types-stability/pr19141-get5d.o",
|
|
"data/test-types-stability/pr19142-topo.o",
|
|
"data/test-types-stability/pr19204-libtcmalloc.so.4.2.6-xlc",
|
|
// The below should always be the last element of array.
|
|
0
|
|
};
|
|
|
|
/// A task which launches abidw --abidiff on a binary
|
|
/// passed to the constructor of the task.
|
|
struct test_task : public abigail::workers::task
|
|
{
|
|
string path;
|
|
string error_message;
|
|
bool is_ok;
|
|
|
|
/// The constructor of the test task.
|
|
///
|
|
/// @param elf_path the path to the elf binary on which we are
|
|
/// supposed to launch abidw --abidiff.
|
|
test_task(const string& elf_path)
|
|
: path(elf_path),
|
|
is_ok(true)
|
|
{}
|
|
|
|
/// This virtual function overload actually performs the job of the task.
|
|
///
|
|
/// It calls abidw --abidiff on the binary refered to by the task.
|
|
/// It thus stores a flag saying if the result of abidw --abidiff is
|
|
/// OK or not.
|
|
virtual void
|
|
perform()
|
|
{
|
|
using abigail::tests::get_src_dir;
|
|
using abigail::tests::get_build_dir;
|
|
|
|
string abidw = string(get_build_dir()) + "/tools/abidw";
|
|
string elf_path = string(get_src_dir()) + "/tests/" + path;
|
|
string cmd = abidw + " --abidiff " + elf_path;
|
|
if (system(cmd.c_str()))
|
|
{
|
|
error_message = "IR stability issue detected for binary " + elf_path;
|
|
is_ok = false;
|
|
}
|
|
}
|
|
}; // end struct test_task
|
|
|
|
/// A convenience typedef for a shared_ptr to @ref test_task.
|
|
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(elf_paths) / sizeof (char*) - 1;
|
|
size_t num_workers = std::min(get_number_of_threads(), num_tests);
|
|
queue task_queue(num_workers);
|
|
|
|
/// Create one task per binary registered for this test, and push
|
|
/// them to the task queue. Pushing a task to the queue triggers
|
|
/// a worker thread that starts working on the task.
|
|
for (const char** p = elf_paths; p && *p; ++p)
|
|
{
|
|
test_task_sptr t(new test_task(*p));
|
|
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);
|
|
|
|
bool is_ok = true;
|
|
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;
|
|
cerr << t->error_message << "\n";
|
|
}
|
|
}
|
|
|
|
return !is_ok;
|
|
}
|