jdoerfert updated this revision to Diff 342433. jdoerfert marked an inline comment as done. jdoerfert added a comment. Herald added a subscriber: mgorny.
Avoid including <new> by not wrapping <new> Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D100620/new/ https://reviews.llvm.org/D100620 Files: clang/lib/Headers/CMakeLists.txt clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h clang/lib/Headers/openmp_wrappers/new clang/test/Headers/Inputs/include/new clang/test/Headers/Inputs/include/stdlib.h clang/test/Headers/target_include_new.cpp
Index: clang/test/Headers/target_include_new.cpp =================================================================== --- /dev/null +++ clang/test/Headers/target_include_new.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -internal-isystem %S/Inputs/include -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64 -emit-llvm-bc %s -o %t-ppc-host.bc +// RUN: %clang_cc1 -internal-isystem %S/../../lib/Headers/openmp_wrappers -include __clang_openmp_device_functions.h -internal-isystem %S/Inputs/include -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64 -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s +// expected-no-diagnostics + +// Ensure we make `_ZdlPv`, aka. `operator delete(void*)` available without the need to `include <new>`. + +// CHECK: define {{.*}}_ZdlPv + +#ifndef HEADER +#define HEADER + +class Base { + public: + virtual ~Base() = default; +}; + +class Derived : public Base { + public: + #pragma omp declare target + Derived(); + #pragma omp end declare target +}; + +Derived::Derived() { } + +int main(void) { + #pragma omp target + { + } + return 0; +} +#endif Index: clang/test/Headers/Inputs/include/stdlib.h =================================================================== --- clang/test/Headers/Inputs/include/stdlib.h +++ clang/test/Headers/Inputs/include/stdlib.h @@ -1,6 +1,9 @@ #pragma once typedef __SIZE_TYPE__ size_t; +void *malloc(size_t); +void free(void*); + #ifndef __cplusplus extern int abs(int __x) __attribute__((__const__)); #endif Index: clang/test/Headers/Inputs/include/new =================================================================== --- /dev/null +++ clang/test/Headers/Inputs/include/new @@ -0,0 +1,7 @@ + +namespace std +{ + +struct nothrow_t { explicit nothrow_t() = default; }; + +} Index: clang/lib/Headers/openmp_wrappers/new =================================================================== --- clang/lib/Headers/openmp_wrappers/new +++ /dev/null @@ -1,70 +0,0 @@ -//===--------- new - OPENMP wrapper for <new> ------------------------------=== -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===-----------------------------------------------------------------------=== - -#ifndef __CLANG_OPENMP_WRAPPERS_NEW -#define __CLANG_OPENMP_WRAPPERS_NEW - -#include_next <new> - -#if defined(__NVPTX__) && defined(_OPENMP) - -#include <cstdlib> - -#pragma push_macro("OPENMP_NOEXCEPT") -#if __cplusplus >= 201103L -#define OPENMP_NOEXCEPT noexcept -#else -#define OPENMP_NOEXCEPT -#endif - -// Device overrides for non-placement new and delete. -inline void *operator new(__SIZE_TYPE__ size) { - if (size == 0) - size = 1; - return ::malloc(size); -} -inline void *operator new(__SIZE_TYPE__ size, - const std::nothrow_t &) OPENMP_NOEXCEPT { - return ::operator new(size); -} - -inline void *operator new[](__SIZE_TYPE__ size) { return ::operator new(size); } -inline void *operator new[](__SIZE_TYPE__ size, const std::nothrow_t &) { - return ::operator new(size); -} - -inline void operator delete(void *ptr)OPENMP_NOEXCEPT { - if (ptr) - ::free(ptr); -} -inline void operator delete(void *ptr, const std::nothrow_t &)OPENMP_NOEXCEPT { - ::operator delete(ptr); -} - -inline void operator delete[](void *ptr) OPENMP_NOEXCEPT { - ::operator delete(ptr); -} -inline void operator delete[](void *ptr, - const std::nothrow_t &) OPENMP_NOEXCEPT { - ::operator delete(ptr); -} - -// Sized delete, C++14 only. -#if __cplusplus >= 201402L -inline void operator delete(void *ptr, __SIZE_TYPE__ size)OPENMP_NOEXCEPT { - ::operator delete(ptr); -} -inline void operator delete[](void *ptr, __SIZE_TYPE__ size) OPENMP_NOEXCEPT { - ::operator delete(ptr); -} -#endif - -#pragma pop_macro("OPENMP_NOEXCEPT") -#endif - -#endif // include guard Index: clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h =================================================================== --- clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h +++ clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h @@ -39,4 +39,63 @@ #pragma omp end declare variant +// Ensure we make `_ZdlPv`, aka. `operator delete(void*)` available without the +// need to `include <new>` in C++ mode. +#ifdef __cplusplus + +// We require malloc/free. +#include <cstdlib> + +#pragma push_macro("OPENMP_NOEXCEPT") +#if __cplusplus >= 201103L +#define OPENMP_NOEXCEPT noexcept +#else +#define OPENMP_NOEXCEPT +#endif + +// Device overrides for non-placement new and delete. +inline void *operator new(__SIZE_TYPE__ size) { + if (size == 0) + size = 1; + return ::malloc(size); +} +inline void *operator new(__SIZE_TYPE__ size, + const std::nothrow_t &) OPENMP_NOEXCEPT { + return ::operator new(size); +} + +inline void *operator new[](__SIZE_TYPE__ size) { return ::operator new(size); } +inline void *operator new[](__SIZE_TYPE__ size, const std::nothrow_t &) { + return ::operator new(size); +} + +inline void operator delete(void *ptr)OPENMP_NOEXCEPT { + if (ptr) + ::free(ptr); +} +inline void operator delete(void *ptr, const std::nothrow_t &)OPENMP_NOEXCEPT { + ::operator delete(ptr); +} + +inline void operator delete[](void *ptr) OPENMP_NOEXCEPT { + ::operator delete(ptr); +} +inline void operator delete[](void *ptr, + const std::nothrow_t &) OPENMP_NOEXCEPT { + ::operator delete(ptr); +} + +// Sized delete, C++14 only. +#if __cplusplus >= 201402L +inline void operator delete(void *ptr, __SIZE_TYPE__ size)OPENMP_NOEXCEPT { + ::operator delete(ptr); +} +inline void operator delete[](void *ptr, __SIZE_TYPE__ size) OPENMP_NOEXCEPT { + ::operator delete(ptr); +} +#endif + +#pragma pop_macro("OPENMP_NOEXCEPT") +#endif + #endif Index: clang/lib/Headers/CMakeLists.txt =================================================================== --- clang/lib/Headers/CMakeLists.txt +++ clang/lib/Headers/CMakeLists.txt @@ -161,7 +161,6 @@ openmp_wrappers/complex openmp_wrappers/__clang_openmp_device_functions.h openmp_wrappers/complex_cmath.h - openmp_wrappers/new ) set(output_dir ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION}/include)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits