Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*===---- openmp_wrapper/math.h -------- OpenMP math.h intercept ------ c++ -===
  2.  *
  3.  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4.  * See https://llvm.org/LICENSE.txt for license information.
  5.  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6.  *
  7.  *===-----------------------------------------------------------------------===
  8.  */
  9.  
  10. // If we are in C++ mode and include <math.h> (not <cmath>) first, we still need
  11. // to make sure <cmath> is read first. The problem otherwise is that we haven't
  12. // seen the declarations of the math.h functions when the system math.h includes
  13. // our cmath overlay. However, our cmath overlay, or better the underlying
  14. // overlay, e.g. CUDA, uses the math.h functions. Since we haven't declared them
  15. // yet we get errors. CUDA avoids this by eagerly declaring all math functions
  16. // (in the __device__ space) but we cannot do this. Instead we break the
  17. // dependence by forcing cmath to go first. While our cmath will in turn include
  18. // this file, the cmath guards will prevent recursion.
  19. #ifdef __cplusplus
  20. #include <cmath>
  21. #endif
  22.  
  23. #ifndef __CLANG_OPENMP_MATH_H__
  24. #define __CLANG_OPENMP_MATH_H__
  25.  
  26. #ifndef _OPENMP
  27. #error "This file is for OpenMP compilation only."
  28. #endif
  29.  
  30. #include_next <math.h>
  31.  
  32. // We need limits.h for __clang_cuda_math.h below and because it should not hurt
  33. // we include it eagerly here.
  34. #include <limits.h>
  35.  
  36. // We need stdlib.h because (for now) __clang_cuda_math.h below declares `abs`
  37. // which should live in stdlib.h.
  38. #include <stdlib.h>
  39.  
  40. #pragma omp begin declare variant match(                                       \
  41.     device = {arch(nvptx, nvptx64)}, implementation = {extension(match_any)})
  42.  
  43. #define __CUDA__
  44. #define __OPENMP_NVPTX__
  45. #include <__clang_cuda_math.h>
  46. #undef __OPENMP_NVPTX__
  47. #undef __CUDA__
  48.  
  49. #pragma omp end declare variant
  50.  
  51. #ifdef __AMDGCN__
  52. #pragma omp begin declare variant match(device = {arch(amdgcn)})
  53.  
  54. #define __OPENMP_AMDGCN__
  55. #include <__clang_hip_math.h>
  56. #undef __OPENMP_AMDGCN__
  57.  
  58. #pragma omp end declare variant
  59. #endif
  60.  
  61. #endif
  62.