Warning: This file is not a C or C++ file. It does not have highlighting.
1 | //===-- Wrapper for C standard ctype.h declarations on the GPU ------------===// |
---|---|
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 | #ifndef __CLANG_LLVM_LIBC_WRAPPERS_CTYPE_H__ |
10 | #define __CLANG_LLVM_LIBC_WRAPPERS_CTYPE_H__ |
11 | |
12 | #if !defined(_OPENMP) && !defined(__HIP__) && !defined(__CUDA__) |
13 | #error "This file is for GPU offloading compilation only" |
14 | #endif |
15 | |
16 | // The GNU headers like to define 'toupper' and 'tolower' redundantly. This is |
17 | // necessary to prevent it from doing that and remapping our implementation. |
18 | #if (defined(__NVPTX__) || defined(__AMDGPU__)) && defined(__GLIBC__) |
19 | #pragma push_macro("__USE_EXTERN_INLINES") |
20 | #undef __USE_EXTERN_INLINES |
21 | #endif |
22 | |
23 | #include_next <ctype.h> |
24 | |
25 | #if (defined(__NVPTX__) || defined(__AMDGPU__)) && defined(__GLIBC__) |
26 | #pragma pop_macro("__USE_EXTERN_INLINES") |
27 | #endif |
28 | |
29 | #if __has_include(<llvm-libc-decls/ctype.h>) |
30 | |
31 | #if defined(__HIP__) || defined(__CUDA__) |
32 | #define __LIBC_ATTRS __attribute__((device)) |
33 | #endif |
34 | |
35 | // The GNU headers like to provide these as macros, we need to undefine them so |
36 | // they do not conflict with the following definitions for the GPU. |
37 | |
38 | #pragma push_macro("isalnum") |
39 | #pragma push_macro("isalpha") |
40 | #pragma push_macro("isascii") |
41 | #pragma push_macro("isblank") |
42 | #pragma push_macro("iscntrl") |
43 | #pragma push_macro("isdigit") |
44 | #pragma push_macro("isgraph") |
45 | #pragma push_macro("islower") |
46 | #pragma push_macro("isprint") |
47 | #pragma push_macro("ispunct") |
48 | #pragma push_macro("isspace") |
49 | #pragma push_macro("isupper") |
50 | #pragma push_macro("isxdigit") |
51 | #pragma push_macro("toascii") |
52 | #pragma push_macro("tolower") |
53 | #pragma push_macro("toupper") |
54 | |
55 | #undef isalnum |
56 | #undef isalpha |
57 | #undef isascii |
58 | #undef iscntrl |
59 | #undef isdigit |
60 | #undef islower |
61 | #undef isgraph |
62 | #undef isprint |
63 | #undef ispunct |
64 | #undef isspace |
65 | #undef isupper |
66 | #undef isblank |
67 | #undef isxdigit |
68 | #undef toascii |
69 | #undef tolower |
70 | #undef toupper |
71 | |
72 | #pragma omp begin declare target |
73 | |
74 | #include <llvm-libc-decls/ctype.h> |
75 | |
76 | #pragma omp end declare target |
77 | |
78 | // Restore the original macros when compiling on the host. |
79 | #if !defined(__NVPTX__) && !defined(__AMDGPU__) |
80 | #pragma pop_macro("isalnum") |
81 | #pragma pop_macro("isalpha") |
82 | #pragma pop_macro("isascii") |
83 | #pragma pop_macro("isblank") |
84 | #pragma pop_macro("iscntrl") |
85 | #pragma pop_macro("isdigit") |
86 | #pragma pop_macro("isgraph") |
87 | #pragma pop_macro("islower") |
88 | #pragma pop_macro("isprint") |
89 | #pragma pop_macro("ispunct") |
90 | #pragma pop_macro("isspace") |
91 | #pragma pop_macro("isupper") |
92 | #pragma pop_macro("isxdigit") |
93 | #pragma pop_macro("toascii") |
94 | #pragma pop_macro("tolower") |
95 | #pragma pop_macro("toupper") |
96 | #endif |
97 | |
98 | #undef __LIBC_ATTRS |
99 | |
100 | #endif |
101 | |
102 | #endif // __CLANG_LLVM_LIBC_WRAPPERS_CTYPE_H__ |
103 |
Warning: This file is not a C or C++ file. It does not have highlighting.