struct symbol_info
{
enum category { none, function, object, error };
- category type;
+ category type;
std::string name;
std::string demangled_name;
int size;
bool
-check_version(const symbol_info& test)
+check_version(const symbol_info& test, bool added = false)
{
- bool ret = true;
-
typedef std::vector<std::string> compat_list;
- static compat_list known;
- if (known.empty())
+ static compat_list known_versions;
+ if (known_versions.empty())
{
- known.push_back("GLIBCPP_3.2");
- known.push_back("GLIBCPP_3.2.1");
- known.push_back("GLIBCPP_3.2.2");
- known.push_back("GLIBCPP_3.4");
- known.push_back("CXXABI_1.2");
- known.push_back("CXXABI_1.2.1");
- known.push_back("CXXABI_1.3");
+ known_versions.push_back("GLIBCPP_3.2"); // base version
+ known_versions.push_back("GLIBCPP_3.2.1");
+ known_versions.push_back("GLIBCPP_3.2.2");
+ known_versions.push_back("GLIBCPP_3.2.3"); // gcc-3.3.0
+ known_versions.push_back("GLIBCPP_3.4");
+ known_versions.push_back("CXXABI_1.2");
+ known_versions.push_back("CXXABI_1.2.1");
+ known_versions.push_back("CXXABI_1.3");
}
-
- compat_list::iterator end = known.end();
+ compat_list::iterator begin = known_versions.begin();
+ compat_list::iterator end = known_versions.end();
// Check version names for compatibility...
- compat_list::iterator it1 = find(known.begin(), end, test.version_name);
+ compat_list::iterator it1 = find(begin, end, test.version_name);
// Check for weak label.
- compat_list::iterator it2 = find(known.begin(), end, test.name);
- if (it1 != end || it2 != end)
- ret = true;
+ compat_list::iterator it2 = find(begin, end, test.name);
- return ret;
+ // Check that added symbols aren't added in the base version.
+ bool compat = true;
+ if (added && test.version_name == known_versions[0])
+ compat = false;
+
+ if (it1 == end && it2 == end)
+ compat = false;
+
+ return compat;
}
bool
added_names.erase(it);
}
else
- missing_names.push_back(what);
+ missing_names.push_back(what);
}
- // Check shared names for compatibility.
+ // Check missing names for compatibility.
typedef pair<symbol_info, symbol_info> symbol_pair;
vector<symbol_pair> incompatible;
+ for (size_t i = 0; i < missing_names.size(); ++i)
+ {
+ symbol_info base = baseline_symbols[missing_names[i]];
+ incompatible.push_back(symbol_pair(base, base));
+ }
+
+ // Check shared names for compatibility.
for (size_t i = 0; i < shared_names.size(); ++i)
{
symbol_info base = baseline_symbols[shared_names[i]];
for (size_t i = 0; i < added_names.size(); ++i)
{
symbol_info test = test_symbols[added_names[i]];
- if (!check_version(test))
- {
- incompatible.push_back(symbol_pair(test, test));
- cout << test.version_name << endl;
- }
+ if (!check_version(test, true))
+ incompatible.push_back(symbol_pair(test, test));
}
// Report results.