globals.cc (__gnu_cxx::c_locale_impl_compat): Add, alias to c_locale_impl.
2002-10-14 Benjamin Kosnik <bkoz@redhat.com> * src/globals.cc (__gnu_cxx::c_locale_impl_compat): Add, alias to c_locale_impl. * testsuite/abi_check.cc (line_to_symbol_info): Collect size info. * docs/html/abi.txt: Update. From-SVN: r58147
This commit is contained in:
parent
51502ebc13
commit
8c536ae9dc
|
@ -1,3 +1,10 @@
|
|||
2002-10-14 Benjamin Kosnik <bkoz@redhat.com>
|
||||
|
||||
* src/globals.cc (__gnu_cxx::c_locale_impl_compat): Add, alias to
|
||||
c_locale_impl.
|
||||
* testsuite/abi_check.cc (line_to_symbol_info): Collect size info.
|
||||
* docs/html/abi.txt: Update.
|
||||
|
||||
2002-10-14 Benjamin Kosnik <bkoz@redhat.com>
|
||||
|
||||
* testsuite/22_locale/static_members.cc (test02): Less provincial.
|
||||
|
|
|
@ -1,12 +1,5 @@
|
|||
|
||||
===========================
|
||||
|
||||
See http://gcc.gnu.org/ml/libstdc++/2002-07/msg00054.html for why this
|
||||
document exists, why it's incomplete, and what needs to be done still.
|
||||
|
||||
===========================
|
||||
|
||||
2002-09-06 Benjamin Kosnik
|
||||
2002-10-14 Benjamin Kosnik
|
||||
|
||||
Description of the libstdc++ ABI.
|
||||
|
||||
|
@ -244,7 +237,7 @@ II. Library ABI changes
|
|||
The following will cause the library major version number to
|
||||
increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.4.0.0".
|
||||
|
||||
- any g++ compiler ABI changes
|
||||
- (anything) changing in the gcc/g++ compiler ABI
|
||||
|
||||
- (anything) changing size of an exported symbol
|
||||
|
||||
|
@ -256,7 +249,14 @@ increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.4.0.0".
|
|||
|
||||
- (anything) deleting an exported symbol
|
||||
|
||||
Note: adding an exported symbol, if it's in a new linker map name, is ok.
|
||||
- (anything) changing the size, alignment, or layout of types
|
||||
specified in the C++ standard. These may not necessarily be
|
||||
instantiated or otherwise exported in the library binary, and
|
||||
include all the required locale facets, as well as things like
|
||||
std::basic_streambuf, et al.
|
||||
|
||||
Note: adding an exported symbol, if it's in a new and dependent
|
||||
interface name, is ok.
|
||||
|
||||
The following will cause the library revision version number to
|
||||
increase, say from "libstdc++.so.5.0.0" to "libstdc++.so.5.0.1".
|
||||
|
@ -331,17 +331,20 @@ addition, all exported names are demangled, and the exported objects
|
|||
are checked to make sure they are the same size as the same object in
|
||||
the baseline.
|
||||
|
||||
In the future, more tests should be added. In particular, vtable
|
||||
information, offsets of data members in class objects, and other
|
||||
layout information should be checked.
|
||||
This dataset is insufficient, yet a start. Also needed is a
|
||||
comprehensive check for all user-visible types part of the standard
|
||||
library for sizeof() and alignof() changes.
|
||||
|
||||
It should be possible to use sizeof, alignof, and offset to compute
|
||||
Verifying compatible layouts of objects is not even attempted. It
|
||||
should be possible to use sizeof, alignof, and offsetof to compute
|
||||
offsets for each structure and type in the standard library, saving to
|
||||
another datafile. Then, compute this for new binaries, and look for
|
||||
differences.
|
||||
another datafile. Then, compute this in a similar way for new
|
||||
binaries, and look for differences.
|
||||
|
||||
Another approach might be to use the -fdump-class-hierarchy flag to
|
||||
get information.
|
||||
get information. However, currently this approach gives insufficient
|
||||
data for use in library testing, as class data members, their offsets,
|
||||
and other detailed data is not displayed with this flag.
|
||||
(See g++/7470 on how this was used to find bugs.)
|
||||
|
||||
Perhaps there are other C++ ABI checkers. If so, please notify
|
||||
|
|
|
@ -48,6 +48,15 @@ namespace __gnu_cxx
|
|||
{
|
||||
using namespace std;
|
||||
|
||||
typedef char fake_facet_name[sizeof(char*)]
|
||||
__attribute__ ((aligned(__alignof__(char*))));
|
||||
fake_facet_name facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
|
||||
|
||||
typedef char fake_locale_Impl[sizeof(locale::_Impl)]
|
||||
__attribute__ ((aligned(__alignof__(locale::_Impl))));
|
||||
fake_locale_Impl c_locale_impl;
|
||||
|
||||
|
||||
// NB: The asm directives renames these non-exported, namespace
|
||||
// __gnu_cxx symbols into the mistakenly exported, namespace std
|
||||
// symbols in GLIBCPP_3.2.
|
||||
|
@ -61,19 +70,20 @@ namespace __gnu_cxx
|
|||
fake_locale c_locale;
|
||||
_GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx8c_localeE, _ZSt8c_locale, GLIBCPP_3.2)
|
||||
|
||||
typedef char fake_locale_Impl[sizeof(locale::_Impl)]
|
||||
__attribute__ ((aligned(__alignof__(locale::_Impl))));
|
||||
fake_locale_Impl c_locale_impl;
|
||||
_GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx13c_locale_implE, _ZSt13c_locale_impl, GLIBCPP_3.2)
|
||||
// GLIBCXX_ABI > 5 will not need this symbol at all.
|
||||
// It's here just as a placeholder, as the size of this exported
|
||||
// object changed. The new symbol is not exported.
|
||||
const int o = sizeof(locale::_Impl) - sizeof(char*[_GLIBCPP_NUM_CATEGORIES]);
|
||||
typedef char fake_locale_Impl_compat[o]
|
||||
__attribute__ ((aligned(__alignof__(o))));
|
||||
fake_locale_Impl_compat c_locale_impl_compat;
|
||||
_GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx20c_locale_impl_compatE, _ZSt13c_locale_impl, GLIBCPP_3.2)
|
||||
|
||||
typedef char fake_facet_vec[sizeof(locale::facet*)]
|
||||
__attribute__ ((aligned(__alignof__(locale::facet*))));
|
||||
fake_facet_vec facet_vec[_GLIBCPP_NUM_FACETS];
|
||||
_GLIBCPP_ASM_SYMVER(_ZN9__gnu_cxx9facet_vecE, _ZSt9facet_vec, GLIBCPP_3.2)
|
||||
|
||||
typedef char fake_facet_name[sizeof(char*)]
|
||||
__attribute__ ((aligned(__alignof__(char*))));
|
||||
fake_facet_name facet_name[6 + _GLIBCPP_NUM_CATEGORIES];
|
||||
|
||||
typedef char fake_ctype_c[sizeof(std::ctype<char>)]
|
||||
__attribute__ ((aligned(__alignof__(std::ctype<char>))));
|
||||
fake_ctype_c ctype_c;
|
||||
|
|
|
@ -191,7 +191,7 @@ line_to_symbol_info(std::string& input, symbol_info& output)
|
|||
istringstream iss(size);
|
||||
int x;
|
||||
iss >> x;
|
||||
if (iss.good())
|
||||
if (!iss.fail())
|
||||
output.size = x;
|
||||
input.erase(input.begin(), input.begin() + n + 1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue