mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-30 05:42:05 +00:00
6a03c86a28
* src/abg-ir.h (function_decl::set_return_type): New inline definition. (class template_decl, struct template_decl_hash, class template_parameter, struct template_parameter_hash, struct dynamic_template_parameter_hash, struct template_parameter_shared_ptr_hash, class template_type_parameter) (struct template_type_parameter_hash, class template_non_type_parameter, struct template_non_type_parameter_hash, class template_template_parameter, struct template_template_parameter_hash, class function_template_decl) (struct function_template_decl_hash, struct fn_tmpl_shared_ptr_hash): New declarations. * src/abg-ir.cc (dynamic_type_hash::operator()): Add hashing for template template, and template type parameters. (template_decl_hash::operator, template_decl::~template_decl) (template_decl::operator==, template_parameter::operator==) (template_parameter_hash::operator()) (dynamic_template_parameter_hash::operator()) (template_type_parameter::operator==) (template_type_parameter::~template_type_parameter) (template_type_parameter_hash::operator()) (template_non_type_parameter::operator==) (template_non_type_parameter::~template_non_type_parameter) (template_non_type_parameter_hash::operator()) (template_template_parameter::operator==) (template_template_parameter::~template_template_parameter) (template_template_parameter_hash::operator()) (function_template_decl::operator==) (function_template_decl_hash::operator()) (fn_tmpl_shared_ptr_hash::operator()) (function_template_decl::~function_template_decl()): New definitions. * src/abg-reader.cc (read_context::get_fn_tmpl_decl) (read_context::key_fn_tmpl_decl): New functions. (read_context::m_fn_tmpl_map): New data member. (read_context::key_type_decl): Renamed read_context::add_type_decl into this. (read_context::push_decl_to_current_scope): Renamed read_context::finish_decl_creation into this. Add an assert. (read_context::push_and_key_type_decl): Renamed read_context::finish_type_decl_creation into this. Adjust to the use of push_decl_to_current_scope and key_type_decl. (build_function_template_decl, build_template_type_parameter) (build_template_non_type_parameter) (build_template_template_parameter, build_template_parameter) (handle_function_template_decl): New functions. (handle_element): Call handle_function_template_decl. (build_function_decl): Take a bool parameter to update depth information in parsing context. Move instantiation of function_decl before parsing its xml sub-nodes. Update the depth info in the parsing context if necessary. Push the newly intantiated decl to scope. And then parse the sub nodes. Do not forget to add the fn parameters and return type using function_decl::add_parameter and function_decl::set_return_type. (build_var_decl, build_type_decl, build_qualified_type_decl) (build_pointer_type_def, build_reference_type_def) (build_enum_type_decl, build_typedef_decl, handled_type_decl) (handle_qualified_type_decl, handle_pointer_type_def) (handle_reference_type_def, handle_enum_type_decl) (handle_typedef_decl, handle_var_decl, handle_function_decl) (handle_class_decl): Adjust. (build_class_decl): Take a bool parameter to update depth information in parsing context. Add comment. Wait for the class members to be built, before keying (and thus hashing it) the class. (build_type): Fix logic, and adjust. * src/abg-writer.cc (write_context::type_has_existing_id) (write_context::get_id_for_fn_tmpl, write_template_type_parameter) (write_template_non_type_parameter) (write_template_template_parameter, write_template_parameter) (write_function_template_decl): New functions. (write_context::get_id_for_type): Simplify logic. (write_decl): Support writing function template. * tests/data/test-read-write/test11.xml: New test input. * tests/test-read-write.cc (InoutSpec in_out_specs[]): De-serialize the new test11.xml test, serialize it back and diff output and input. * tests/Makefile.am: Add test11.xml to the distribution.
150 lines
3.9 KiB
C++
150 lines
3.9 KiB
C++
// Copyright (C) 2013 Free Software Foundation, 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 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 Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// and a copy of the GCC Runtime Library Exception along with this
|
|
// program; see the files COPYING3 and COPYING.RUNTIME respectively.
|
|
// If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
// -*- Mode: C++ -*-
|
|
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
#include "test-utils.h"
|
|
#include "abg-reader.h"
|
|
#include "abg-writer.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_path;
|
|
const char* out_path;
|
|
};// end struct InOutSpec
|
|
|
|
|
|
InOutSpec in_out_specs[] =
|
|
{
|
|
{
|
|
"data/test-read-write/test0.xml",
|
|
"output/test-read-write/test0.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test1.xml",
|
|
"output/test-read-write/test1.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test2.xml",
|
|
"output/test-read-write/test2.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test3.xml",
|
|
"output/test-read-write/test3.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test4.xml",
|
|
"output/test-read-write/test4.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test5.xml",
|
|
"output/test-read-write/test5.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test6.xml",
|
|
"output/test-read-write/test6.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test7.xml",
|
|
"output/test-read-write/test7.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test8.xml",
|
|
"output/test-read-write/test8.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test9.xml",
|
|
"output/test-read-write/test9.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test10.xml",
|
|
"output/test-read-write/test10.xml"
|
|
},
|
|
{
|
|
"data/test-read-write/test11.xml",
|
|
"output/test-read-write/test11.xml"
|
|
},
|
|
// This should be the last entry.
|
|
{NULL, NULL}
|
|
};
|
|
|
|
/// Walk the array of InOutSpecs above, read the input files it points
|
|
/// to, write it into the output it points to and diff them.
|
|
int
|
|
main()
|
|
{
|
|
unsigned result = 1;
|
|
|
|
bool is_ok = true;
|
|
string in_path, out_path;
|
|
for (InOutSpec *s = in_out_specs; s->in_path; ++s)
|
|
{
|
|
string input_suffix(s->in_path);
|
|
in_path = abigail::tests::get_src_dir() + "/tests/" + input_suffix;
|
|
abigail::translation_unit tu(input_suffix);
|
|
if (!abigail::reader::read_file(in_path, tu))
|
|
{
|
|
cerr << "failed to read " << in_path << "\n";
|
|
is_ok = false;
|
|
continue;
|
|
}
|
|
|
|
string output_suffix(s->out_path);
|
|
out_path = abigail::tests::get_build_dir() + "/tests/" + output_suffix;
|
|
if (!abigail::tests::ensure_parent_dir_created(out_path))
|
|
{
|
|
cerr << "Could not create parent director for " << out_path;
|
|
is_ok = false;
|
|
return result;
|
|
}
|
|
|
|
ofstream of(out_path.c_str(), std::ios_base::trunc);
|
|
if (!of.is_open())
|
|
{
|
|
cerr << "failed to read " << out_path << "\n";
|
|
is_ok = false;
|
|
continue;
|
|
}
|
|
|
|
bool r = abigail::writer::write_to_ostream(tu, of);
|
|
is_ok = (is_ok && r);
|
|
of.close();
|
|
string cmd = "diff -u " + in_path + " " + out_path;
|
|
if (system(cmd.c_str()))
|
|
is_ok = false;
|
|
}
|
|
|
|
return !is_ok;
|
|
}
|