zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

string.h (4028B) - Raw


      1 //===-- Wrapper for C standard string.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_STRING_H__
     10 #define __CLANG_LLVM_LIBC_WRAPPERS_STRING_H__
     11 
     12 #if !defined(_OPENMP) && !defined(__HIP__) && !defined(__CUDA__)
     13 #error "This file is for GPU offloading compilation only"
     14 #endif
     15 
     16 #include_next <string.h>
     17 
     18 #if __has_include(<llvm-libc-decls/string.h>)
     19 
     20 #if defined(__HIP__) || defined(__CUDA__)
     21 #define __LIBC_ATTRS __attribute__((device))
     22 #endif
     23 
     24 #pragma omp begin declare target
     25 
     26 // The GNU headers provide C++ standard compliant headers when in C++ mode and
     27 // the LLVM libc does not. We need to manually provide the definitions using the
     28 // same prototypes.
     29 #if defined(__cplusplus) && defined(__GLIBC__) &&                              \
     30     defined(__CORRECT_ISO_CPP_STRING_H_PROTO)
     31 
     32 #ifndef __LIBC_ATTRS
     33 #define __LIBC_ATTRS
     34 #endif
     35 
     36 extern "C" {
     37 void *memccpy(void *__restrict, const void *__restrict, int,
     38               size_t) __LIBC_ATTRS;
     39 int memcmp(const void *, const void *, size_t) __LIBC_ATTRS;
     40 void *memcpy(void *__restrict, const void *__restrict, size_t) __LIBC_ATTRS;
     41 void *memmem(const void *, size_t, const void *, size_t) __LIBC_ATTRS;
     42 void *memmove(void *, const void *, size_t) __LIBC_ATTRS;
     43 void *mempcpy(void *__restrict, const void *__restrict, size_t) __LIBC_ATTRS;
     44 void *memset(void *, int, size_t) __LIBC_ATTRS;
     45 char *stpcpy(char *__restrict, const char *__restrict) __LIBC_ATTRS;
     46 char *stpncpy(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS;
     47 char *strcat(char *__restrict, const char *__restrict) __LIBC_ATTRS;
     48 int strcmp(const char *, const char *) __LIBC_ATTRS;
     49 int strcoll(const char *, const char *) __LIBC_ATTRS;
     50 char *strcpy(char *__restrict, const char *__restrict) __LIBC_ATTRS;
     51 size_t strcspn(const char *, const char *) __LIBC_ATTRS;
     52 char *strdup(const char *) __LIBC_ATTRS;
     53 size_t strlen(const char *) __LIBC_ATTRS;
     54 char *strncat(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS;
     55 int strncmp(const char *, const char *, size_t) __LIBC_ATTRS;
     56 char *strncpy(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS;
     57 char *strndup(const char *, size_t) __LIBC_ATTRS;
     58 size_t strnlen(const char *, size_t) __LIBC_ATTRS;
     59 size_t strspn(const char *, const char *) __LIBC_ATTRS;
     60 char *strtok(char *__restrict, const char *__restrict) __LIBC_ATTRS;
     61 char *strtok_r(char *__restrict, const char *__restrict,
     62                char **__restrict) __LIBC_ATTRS;
     63 size_t strxfrm(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS;
     64 }
     65 
     66 extern "C++" {
     67 char *strstr(char *, const char *) noexcept __LIBC_ATTRS;
     68 const char *strstr(const char *, const char *) noexcept __LIBC_ATTRS;
     69 char *strpbrk(char *, const char *) noexcept __LIBC_ATTRS;
     70 const char *strpbrk(const char *, const char *) noexcept __LIBC_ATTRS;
     71 char *strrchr(char *, int) noexcept __LIBC_ATTRS;
     72 const char *strrchr(const char *, int) noexcept __LIBC_ATTRS;
     73 char *strchr(char *, int) noexcept __LIBC_ATTRS;
     74 const char *strchr(const char *, int) noexcept __LIBC_ATTRS;
     75 char *strchrnul(char *, int) noexcept __LIBC_ATTRS;
     76 const char *strchrnul(const char *, int) noexcept __LIBC_ATTRS;
     77 char *strcasestr(char *, const char *) noexcept __LIBC_ATTRS;
     78 const char *strcasestr(const char *, const char *) noexcept __LIBC_ATTRS;
     79 void *memrchr(void *__s, int __c, size_t __n) noexcept __LIBC_ATTRS;
     80 const void *memrchr(const void *__s, int __c, size_t __n) noexcept __LIBC_ATTRS;
     81 void *memchr(void *__s, int __c, size_t __n) noexcept __LIBC_ATTRS;
     82 const void *memchr(const void *__s, int __c, size_t __n) noexcept __LIBC_ATTRS;
     83 }
     84 
     85 #else
     86 #include <llvm-libc-decls/string.h>
     87 
     88 #endif
     89 
     90 #pragma omp end declare target
     91 
     92 #undef __LIBC_ATTRS
     93 
     94 #endif
     95 
     96 #endif // __CLANG_LLVM_LIBC_WRAPPERS_STRING_H__