diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc index 796b9aa3..9f1416a6 100644 --- a/src/abg-comparison.cc +++ b/src/abg-comparison.cc @@ -282,6 +282,10 @@ static void sort_string_fn_parm_diff_sptr_map(const string_fn_parm_diff_sptr_map& map, vector& sorted); +static void +sort_string_parm_map(const string_parm_map& map, + vector& sorted); + static type_base_sptr get_leaf_type(qualified_type_def_sptr t); @@ -9081,7 +9085,9 @@ struct function_type_diff::priv // useful lookup tables. string_parm_map deleted_parms_; + vector sorted_deleted_parms_; string_parm_map added_parms_; + vector sorted_added_parms_; // This map contains parameters sub-type changes that don't change // the name of the type of the parameter. string_fn_parm_diff_sptr_map subtype_changed_parms_; @@ -9168,6 +9174,12 @@ function_type_diff::ensure_lookup_tables_populated() } } } + + sort_string_parm_map(priv_->deleted_parms_, + priv_->sorted_deleted_parms_); + + sort_string_parm_map(priv_->added_parms_, + priv_->sorted_added_parms_); } /// In the vector of deleted parameters, get the one that is at a given @@ -9396,12 +9408,13 @@ function_type_diff::report(ostream& out, const string& indent) const // Report about the parameters that got removed. bool emitted = false; - for (string_parm_map::const_iterator i = priv_->deleted_parms_.begin(); - i != priv_->deleted_parms_.end(); + for (vector::const_iterator i = + priv_->sorted_deleted_parms_.begin(); + i != priv_->sorted_deleted_parms_.end(); ++i) { - out << indent << "parameter " << i->second->get_index() - << " of type '" << i->second->get_type_pretty_representation() + out << indent << "parameter " << (*i)->get_index() + << " of type '" << (*i)->get_type_pretty_representation() << "' was removed\n"; emitted = true; } @@ -9410,12 +9423,13 @@ function_type_diff::report(ostream& out, const string& indent) const // Report about the parameters that got added emitted = false; - for (string_parm_map::const_iterator i = priv_->added_parms_.begin(); - i != priv_->added_parms_.end(); + for (vector::const_iterator i = + priv_->sorted_added_parms_.begin(); + i != priv_->sorted_added_parms_.end(); ++i) { - out << indent << "parameter " << i->second->get_index() - << " of type '" << i->second->get_type_pretty_representation() + out << indent << "parameter " << (*i)->get_index() + << " of type '" << (*i)->get_type_pretty_representation() << "' was added\n"; emitted = true; } @@ -9645,6 +9659,59 @@ sort_string_fn_parm_diff_sptr_map(const string_fn_parm_diff_sptr_map& map, std::sort(sorted.begin(), sorted.end(), comp); } +/// Functor that compares two function parameters for the purpose of +/// sorting them. +struct parm_comp +{ + /// Returns true iff the index of the first parameter is smaller + /// than the of the second parameter. + /// + /// @param l the first parameter to compare. + /// + /// @param r the second parameter to compare. + /// + /// @return true iff the index of the first parameter is smaller + /// than the of the second parameter. + bool + operator()(const function_decl::parameter& l, + const function_decl::parameter& r) + {return l.get_index() < r.get_index();} + + /// Returns true iff the index of the first parameter is smaller + /// than the of the second parameter. + /// + /// @param l the first parameter to compare. + /// + /// @param r the second parameter to compare. + /// + /// @return true iff the index of the first parameter is smaller + /// than the of the second parameter. + bool + operator()(const function_decl::parameter_sptr& l, + const function_decl::parameter_sptr& r) + {return operator()(*l, *r);} +}; // end struct parm_comp + +/// Sort a map of string -> function parameters. +/// +/// @param map the map to sort. +/// +/// @param sorted the resulting sorted vector of +/// @ref vector +static void +sort_string_parm_map(const string_parm_map& map, + vector& sorted) +{ + for (string_parm_map::const_iterator i = map.begin(); + i != map.end(); + ++i) + sorted.push_back(i->second); + + // TODO: finish this. + parm_comp comp; + std::sort(sorted.begin(), sorted.end(), comp); +} + /// Serialize a report of the changes encapsulated in the current /// instance of function_decl_diff over to an output stream. /// diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index ac48ef06..cb816ae4 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -192,6 +192,16 @@ test-diff-dwarf/libtest-23-diff-arch-v0-32.so \ test-diff-dwarf/libtest-23-diff-arch-v0-64.so \ test-diff-dwarf/test-23-diff-arch-report-0.txt \ test-diff-dwarf/test-23-diff-arch-v0.cc \ +test-diff-dwarf/libtest24-added-fn-parms-v0.so \ +test-diff-dwarf/libtest24-added-fn-parms-v1.so \ +test-diff-dwarf/test24-added-fn-parms-report-0.txt \ +test-diff-dwarf/test24-added-fn-parms-v0.c \ +test-diff-dwarf/test24-added-fn-parms-v1.c \ +test-diff-dwarf/libtest25-removed-fn-parms-v0.so \ +test-diff-dwarf/libtest25-removed-fn-parms-v1.so \ +test-diff-dwarf/test25-removed-fn-parms-report-0.txt \ +test-diff-dwarf/test25-removed-fn-parms-v0.c \ +test-diff-dwarf/test25-removed-fn-parms-v1.c \ \ test-read-dwarf/test0 \ test-read-dwarf/test0.abi \ diff --git a/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v0.so b/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v0.so new file mode 100755 index 00000000..7055b023 Binary files /dev/null and b/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v0.so differ diff --git a/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v1.so b/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v1.so new file mode 100755 index 00000000..3e9d6edd Binary files /dev/null and b/tests/data/test-diff-dwarf/libtest24-added-fn-parms-v1.so differ diff --git a/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v0.so b/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v0.so new file mode 100755 index 00000000..6e347758 Binary files /dev/null and b/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v0.so differ diff --git a/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v1.so b/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v1.so new file mode 100755 index 00000000..ff8ba89a Binary files /dev/null and b/tests/data/test-diff-dwarf/libtest25-removed-fn-parms-v1.so differ diff --git a/tests/data/test-diff-dwarf/test24-added-fn-parms-report-0.txt b/tests/data/test-diff-dwarf/test24-added-fn-parms-report-0.txt new file mode 100644 index 00000000..c1553c11 --- /dev/null +++ b/tests/data/test-diff-dwarf/test24-added-fn-parms-report-0.txt @@ -0,0 +1,12 @@ +Functions changes summary: 0 Removed, 1 Changed, 0 Added function +Variables changes summary: 0 Removed, 0 Changed, 0 Added variable + +1 function with some indirect sub-type change: + + [C]'function void fun()' has some indirect sub-type changes: + parameter 0 of type 'unsigned int' was added + parameter 1 of type 'char' was added + parameter 2 of type 'int' was added + + + diff --git a/tests/data/test-diff-dwarf/test24-added-fn-parms-v0.c b/tests/data/test-diff-dwarf/test24-added-fn-parms-v0.c new file mode 100644 index 00000000..5a4678e9 --- /dev/null +++ b/tests/data/test-diff-dwarf/test24-added-fn-parms-v0.c @@ -0,0 +1,6 @@ +// To compile this type: +// gcc -g -Wall -shared -o libtest24-added-fn-parms-v0.so test24-added-fn-parms-v0.c +void +fun() +{ +} diff --git a/tests/data/test-diff-dwarf/test24-added-fn-parms-v1.c b/tests/data/test-diff-dwarf/test24-added-fn-parms-v1.c new file mode 100644 index 00000000..1e1eef7c --- /dev/null +++ b/tests/data/test-diff-dwarf/test24-added-fn-parms-v1.c @@ -0,0 +1,13 @@ +// To compile this type: +// gcc -g -Wall -shared -o libtest24-added-fn-parms-v1.so test24-added-fn-parms-v1.c +void +fun() +{ +} + +void +fun(__attribute__((unused))unsigned arg0, + __attribute__((unused)) char arg1, + __attribute__((unused)) int arg2) +{ +} diff --git a/tests/data/test-diff-dwarf/test25-removed-fn-parms-report-0.txt b/tests/data/test-diff-dwarf/test25-removed-fn-parms-report-0.txt new file mode 100644 index 00000000..24f35d8c --- /dev/null +++ b/tests/data/test-diff-dwarf/test25-removed-fn-parms-report-0.txt @@ -0,0 +1,12 @@ +Functions changes summary: 0 Removed, 1 Changed, 0 Added function +Variables changes summary: 0 Removed, 0 Changed, 0 Added variable + +1 function with some indirect sub-type change: + + [C]'function void fun(unsigned int, char, int)' has some indirect sub-type changes: + parameter 0 of type 'unsigned int' was removed + parameter 1 of type 'char' was removed + parameter 2 of type 'int' was removed + + + diff --git a/tests/data/test-diff-dwarf/test25-removed-fn-parms-v0.c b/tests/data/test-diff-dwarf/test25-removed-fn-parms-v0.c new file mode 100644 index 00000000..b6f66d0d --- /dev/null +++ b/tests/data/test-diff-dwarf/test25-removed-fn-parms-v0.c @@ -0,0 +1,8 @@ +// To compile this type: +// gcc -g -Wall -shared -o libtest25-added-fn-parms-v0.so test25-added-fn-parms-v0.c +void +fun(__attribute__((unused))unsigned arg0, + __attribute__((unused)) char arg1, + __attribute__((unused)) int arg2) +{ +} diff --git a/tests/data/test-diff-dwarf/test25-removed-fn-parms-v1.c b/tests/data/test-diff-dwarf/test25-removed-fn-parms-v1.c new file mode 100644 index 00000000..88be0ea6 --- /dev/null +++ b/tests/data/test-diff-dwarf/test25-removed-fn-parms-v1.c @@ -0,0 +1,6 @@ +// To compile this type: +// gcc -g -Wall -shared -o libtest25-added-fn-parms-v1.so test25-added-fn-parms-v1.c +void +fun() +{ +} diff --git a/tests/test-diff-dwarf.cc b/tests/test-diff-dwarf.cc index 8e33a5fe..04513859 100644 --- a/tests/test-diff-dwarf.cc +++ b/tests/test-diff-dwarf.cc @@ -205,6 +205,18 @@ InOutSpec in_out_specs[] = "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" }, // This should be the last entry {NULL, NULL, NULL, NULL}