On Fri, Jun 6, 2014 at 3:16 PM, Marc Glisse <marc.gli...@inria.fr> wrote:
> Hello,
>
> here is a new try on adding __float128 typeinfo to libsupc++. The front-end
> part is based on the discussion with Jason yesterday. The libstdc++ part is
> copied from:
> https://gcc.gnu.org/ml/libstdc++/2014-04/msg00077.html
> (which wasn't reviewed), but I changed the testsuite.
>
> Michael will likely need to make some adjustments to his __float128 patch,
> but I believe it will only be a small configure tweak.
>
> Ramana, does it look safe for ARM? By the way, do you want to remove the
> XFmode defined in arm-modes.def and apparently unused?

Thanks for this though I know Tejas is actually trying to fix AArch64
first and then we'll move on to ARM for cleaning up all these types -
as you realize it's quite a chunky project.

A patch to remove XFmode is pre-approved. I have no idea why this is
in here. Archeaology shows this came in

    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72440

and with a FIXME:

I'll try and have a look at this patch later today or over the weekend
to see if it doesn't affect ARM / AArch64.

regards
Ramana

>
> Bootstrap+testsuite on x86_64-linux-gnu. I manually checked that
> libstdc++.{a,so} gained exactly the symbols related to typeinfo for
> __float128.
>
> abi_check is broken before my patch (134 incompatible symbols). After it,
> the number of added symbols increases by 7, but the number of incompatible
> symbols remains the same, so I take it as a pass.
>
> 2014-06-06  Marc Glisse  <marc.gli...@inria.fr>
>
>         PR libstdc++/43622
> gcc/cp/
>         * rtti.c (emit_support_tinfos): Handle __float128.
> libstdc++-v3/
>         * config/abi/pre/float128.ver: New file.
>         * configure.ac: Use float128.ver when relevant.
>         * configure: Regenerate.
>         * testsuite/util/testsuite_abi.cc (check_version): Accept new
>         CXXABI_FLOAT128_1.3.9 version.
>
> --
> Marc Glisse
> Index: gcc/cp/rtti.c
> ===================================================================
> --- gcc/cp/rtti.c       (revision 211311)
> +++ gcc/cp/rtti.c       (working copy)
> @@ -1540,20 +1540,31 @@ emit_support_tinfos (void)
>                         /*tag_scope=*/ts_current, false);
>    pop_abi_namespace ();
>    if (!COMPLETE_TYPE_P (bltn_type))
>      return;
>    dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
>    if (!dtor || DECL_EXTERNAL (dtor))
>      return;
>    doing_runtime = 1;
>    for (ix = 0; fundamentals[ix]; ix++)
>      emit_support_tinfo_1 (*fundamentals[ix]);
> +
> +  /* Search for an extra floating point type like __float128.  */
> +  for (enum machine_mode mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
> +       mode != VOIDmode;
> +       mode = GET_MODE_WIDER_MODE (mode))
> +    {
> +      tree type = c_common_type_for_mode (mode, false);
> +      if (type && type != float_type_node && type != double_type_node
> +         && type != long_double_type_node)
> +       emit_support_tinfo_1 (type);
> +    }
>  }
>
>  /* Finish a type info decl. DECL_PTR is a pointer to an unemitted
>     tinfo decl.  Determine whether it needs emitting, and if so
>     generate the initializer.  */
>
>  bool
>  emit_tinfo_decl (tree decl)
>  {
>    tree type = TREE_TYPE (DECL_NAME (decl));
> Index: libstdc++-v3/config/abi/pre/float128.ver
> ===================================================================
> --- libstdc++-v3/config/abi/pre/float128.ver    (revision 0)
> +++ libstdc++-v3/config/abi/pre/float128.ver    (working copy)
> @@ -0,0 +1,10 @@
> +# Appended to version file.
> +
> +CXXABI_FLOAT128_1.3.9 {
> +
> +    # typeinfo and typeinfo name for __float128
> +    _ZT[IS]g;
> +    _ZT[IS]Pg;
> +    _ZT[IS]PKg;
> +
> +};
> Index: libstdc++-v3/configure
> ===================================================================
> --- libstdc++-v3/configure      (revision 211311)
> +++ libstdc++-v3/configure      (working copy)
> @@ -15698,20 +15698,23 @@ $as_echo "#define _GLIBCXX_USE_FLOAT128
>  $as_echo "$enable_float128" >&6; }
>      rm -f conftest*
>
>    ac_ext=c
>  ac_cpp='$CPP $CPPFLAGS'
>  ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
>  ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS
> conftest.$ac_ext $LIBS >&5'
>  ac_compiler_gnu=$ac_cv_c_compiler_gnu
>
>
> +if test "$enable_float128" = yes; then
> +  port_specific_symbol_files="$port_specific_symbol_files
> \$(top_srcdir)/config/abi/pre/float128.ver"
> +fi
>
>  # Checks for compiler support that doesn't require linking.
>
>    # All these tests are for C++; save the language and the compiler flags.
>    # The CXXFLAGS thing is suspicious, but based on similar bits previously
>    # found in GLIBCXX_CONFIGURE.
>
>    ac_ext=cpp
>  ac_cpp='$CXXCPP $CPPFLAGS'
>  ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> Index: libstdc++-v3/configure.ac
> ===================================================================
> --- libstdc++-v3/configure.ac   (revision 211311)
> +++ libstdc++-v3/configure.ac   (working copy)
> @@ -146,20 +146,23 @@ GLIBCXX_ENABLE_HOSTED
>  # Enable descriptive messages to standard output on termination.
>  GLIBCXX_ENABLE_VERBOSE
>
>  # Enable compiler support that doesn't require linking.
>  GLIBCXX_ENABLE_SJLJ_EXCEPTIONS
>  GLIBCXX_ENABLE_PCH($is_hosted)
>  GLIBCXX_ENABLE_THREADS
>  GLIBCXX_ENABLE_ATOMIC_BUILTINS
>  GLIBCXX_ENABLE_DECIMAL_FLOAT
>  GLIBCXX_ENABLE_INT128_FLOAT128
> +if test "$enable_float128" = yes; then
> +  port_specific_symbol_files="$port_specific_symbol_files
> \$(top_srcdir)/config/abi/pre/float128.ver"
> +fi
>
>  # Checks for compiler support that doesn't require linking.
>  GLIBCXX_CHECK_COMPILER_FEATURES
>
>  # Enable all the variable C++ runtime options that don't require linking.
>  GLIBCXX_ENABLE_CSTDIO
>  GLIBCXX_ENABLE_CLOCALE
>  GLIBCXX_ENABLE_ALLOCATOR
>  GLIBCXX_ENABLE_CHEADERS($c_model)  dnl c_model from configure.host
>  GLIBCXX_ENABLE_LONG_LONG([yes])
> Index: libstdc++-v3/testsuite/util/testsuite_abi.cc
> ===================================================================
> --- libstdc++-v3/testsuite/util/testsuite_abi.cc        (revision 211311)
> +++ libstdc++-v3/testsuite/util/testsuite_abi.cc        (working copy)
> @@ -205,48 +205,51 @@ check_version(symbol& test, bool added)
>        known_versions.push_back("CXXABI_LDBL_1.3");
>        known_versions.push_back("CXXABI_1.3.1");
>        known_versions.push_back("CXXABI_1.3.2");
>        known_versions.push_back("CXXABI_1.3.3");
>        known_versions.push_back("CXXABI_1.3.4");
>        known_versions.push_back("CXXABI_1.3.5");
>        known_versions.push_back("CXXABI_1.3.6");
>        known_versions.push_back("CXXABI_1.3.7");
>        known_versions.push_back("CXXABI_1.3.8");
>        known_versions.push_back("CXXABI_1.3.9");
> +      known_versions.push_back("CXXABI_FLOAT128_1.3.9");
>        known_versions.push_back("CXXABI_TM_1");
>      }
>    compat_list::iterator begin = known_versions.begin();
>    compat_list::iterator end = known_versions.end();
>
>    // Check for compatible version.
>    if (test.version_name.size())
>      {
>        compat_list::iterator it1 = find(begin, end, test.version_name);
>        compat_list::iterator it2 = find(begin, end, test.name);
>        if (it1 != end)
>         test.version_status = symbol::compatible;
>        else
>         test.version_status = symbol::incompatible;
>
>        // Check that added symbols are added in the latest pre-release
> version.
>        bool latestp = (test.version_name == "GLIBCXX_3.4.21"
>                      || test.version_name == "CXXABI_1.3.9"
> +                    || test.version_name == "CXXABI_FLOAT128_1.3.9"
>                      || test.version_name == "CXXABI_TM_1");
>        if (added && !latestp)
>         test.version_status = symbol::incompatible;
>
>        // Check that long double compatibility symbols demangled as
> -      // __float128 are put into some _LDBL_ version name.
> +      // __float128 and regular __float128 symbols are put into some _LDBL_
> +      // or _FLOAT128_ version name.
>        if (added && test.demangled_name.find("__float128") !=
> std::string::npos)
>         {
> -         // Has to be in _LDBL_ version name.
> -         if (test.version_name.find("_LDBL_") == std::string::npos)
> +         if (test.version_name.find("_LDBL_") == std::string::npos
> +             && test.version_name.find("_FLOAT128_") == std::string::npos)
>             test.version_status = symbol::incompatible;
>         }
>
>        // Check for weak label.
>        if (it1 == end && it2 == end)
>         test.version_status = symbol::incompatible;
>
>        // Check that
>        // GLIBCXX_3.4
>        // GLIBCXX_3.4.5
>

Reply via email to