Hi! As the first of a few patches to enable libstdc++ for GCN, nvptx targets, and eventually for OpenACC, OpenMP offloading use, I intend to push the attached 'GCN, nvptx: Allow for "hosted" libstdc++ build'. Any objections? It's not exactly pretty, but gets the job done. (..., and some more fine-tuning is to follow later on.)
Grüße Thomas
>From cb01ed054f767511102264977ad5b33811c8bec5 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge <tschwi...@baylibre.com> Date: Thu, 20 Feb 2025 16:31:50 +0100 Subject: [PATCH] GCN, nvptx: Allow for "hosted" libstdc++ build We need '-fno-exceptions', '-fno-rtti', disable generation of PCH files, and for nvptx twiddle some more knobs. PR target/92713 PR target/101544 libstdc++-v3/ * config/cpu/nvptx/cpu_defines.h: New. * config/cpu/nvptx/t-nvptx: Likewise. * configure.host: Handle GCN, nvptx. --- libstdc++-v3/config/cpu/nvptx/cpu_defines.h | 36 ++++++++++++++++++++ libstdc++-v3/config/cpu/nvptx/t-nvptx | 7 ++++ libstdc++-v3/configure.host | 37 +++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 libstdc++-v3/config/cpu/nvptx/cpu_defines.h create mode 100644 libstdc++-v3/config/cpu/nvptx/t-nvptx diff --git a/libstdc++-v3/config/cpu/nvptx/cpu_defines.h b/libstdc++-v3/config/cpu/nvptx/cpu_defines.h new file mode 100644 index 00000000000..65744e08527 --- /dev/null +++ b/libstdc++-v3/config/cpu/nvptx/cpu_defines.h @@ -0,0 +1,36 @@ +// Specific definitions for nvptx platforms -*- C++ -*- + +// Copyright (C) 2025 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. 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/>. + +/** @file bits/cpu_defines.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{iosfwd} + */ + +#ifndef _GLIBCXX_CPU_DEFINES +#define _GLIBCXX_CPU_DEFINES 1 + +// No support for referencing weak symbols without a definition. +#define _GLIBCXX_USE_WEAK_REF 0 + +#endif diff --git a/libstdc++-v3/config/cpu/nvptx/t-nvptx b/libstdc++-v3/config/cpu/nvptx/t-nvptx new file mode 100644 index 00000000000..a2f0f2dcb60 --- /dev/null +++ b/libstdc++-v3/config/cpu/nvptx/t-nvptx @@ -0,0 +1,7 @@ +# Per-file flags, see '../../../configure.host', "inject per-file flags". + +# 'ptxas'/CUDA Driver rejects objects with a lot of global constant data: +# ptxas error : File uses too much global constant data ([...]) +# Cut short the assembly-time check; defer to actual use of the object file. +AM_MAKEFLAGS += CXXFLAGS-src/c++17/floating_to_chars.lo=-Wa,--no-verify +AM_MAKEFLAGS += CXXFLAGS-src/c++20/tzdb.lo=-Wa,--no-verify diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host index 933a43f241c..cb4c28a62bf 100644 --- a/libstdc++-v3/configure.host +++ b/libstdc++-v3/configure.host @@ -150,6 +150,9 @@ case "${host_cpu}" in arm*) cpu_defines_dir=cpu/arm ;; + nvptx) + cpu_defines_dir=cpu/nvptx + ;; powerpc* | rs6000) cpu_defines_dir=cpu/powerpc ;; @@ -367,6 +370,16 @@ case "${host}" in arm*-*-freebsd*) port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver" ;; + nvptx-*-none) + # For 'make all-target-libstdc++-v3', we need to inject per-file flags: + OPTIMIZE_CXXFLAGS="${OPTIMIZE_CXXFLAGS} \$(CXXFLAGS-\$(subdir)/\$@)" + # ..., see: + tmake_file="$tmake_file cpu/nvptx/t-nvptx" + + # For 'make all-target-libstdc++-v3', re 'alloca'/VLA usage: + EXTRA_CFLAGS="${EXTRA_CFLAGS} -mfake-ptx-alloca" + OPTIMIZE_CXXFLAGS="${OPTIMIZE_CXXFLAGS} -mfake-ptx-alloca" + ;; powerpc*-*-darwin*) port_specific_symbol_files="\$(srcdir)/../config/os/bsd/darwin/ppc-extra.ver" ;; @@ -383,3 +396,27 @@ case "${host}" in abi_baseline_subdir_switch=--print-multi-os-directory ;; esac + + +# Dumb down libstdc++ for certain configurations. +# THIS TABLE IS SORTED. KEEP IT THAT WAY. +case "${host}" in + amdgcn-*-amdhsa \ + | nvptx-*-none ) + # For 'make all-target-libstdc++-v3' and 'make check-target-libstdc++-v3', + # exception handling is not supported: in case that exception handling + # constructs survive compiler optimizations, the back ends error out: + # sorry, unimplemented: exception handling not supported + EXTRA_CXX_FLAGS="${EXTRA_CXX_FLAGS} -fno-exceptions" + + # For 'make all-target-libstdc++-v3' and 'make check-target-libstdc++-v3', + # RTTI is not supported. + EXTRA_CXX_FLAGS="${EXTRA_CXX_FLAGS} -fno-rtti" + + # Cannot '#include' all newlib header files without explosion, for example: + # error: 'jmp_buf' was not declared in this scope + # Just disable generation of PCH files here, instead of attempting to care + # for such special cases in some more complex way. + enable_libstdcxx_pch=no + ;; +esac -- 2.34.1