From 72bfe2c05a09e39c6e9c8f35fcbbd9322ed56432 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Wed, 26 Apr 2023 18:37:30 -0500 Subject: [PATCH] [libc] Support the string conversion methods on the GPU This patch enables us to use the existing `libc` support for string conversion functions on the GPU. This required setting the `fenv_t` and long double configuration. As far as I am aware, long doubles are converted to doubles on the GPU and the floating point environment is just an `uint32_t`. This code is still untested as we are still working out how to run the unit tests on the GPU. Reviewed By: michaelrj Differential Revision: https://reviews.llvm.org/D149306 --- libc/config/gpu/api.td | 4 ++++ libc/config/gpu/entrypoints.txt | 10 ++++++++++ libc/config/gpu/headers.txt | 1 + libc/docs/gpu/support.rst | 11 +++++++++++ libc/include/llvm-libc-types/fenv_t.h | 4 ++++ libc/src/__support/FPUtil/PlatformDefs.h | 5 +++-- 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/libc/config/gpu/api.td b/libc/config/gpu/api.td index 3e6927d..c5f555c 100644 --- a/libc/config/gpu/api.td +++ b/libc/config/gpu/api.td @@ -12,3 +12,7 @@ def StdlibAPI : PublicAPI<"stdlib.h"> { "__atexithandler_t", ]; } + +def FenvAPI: PublicAPI<"fenv.h"> { + let Types = ["fenv_t"]; +} diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt index c5ed1e3..13d70f9 100644 --- a/libc/config/gpu/entrypoints.txt +++ b/libc/config/gpu/entrypoints.txt @@ -56,7 +56,17 @@ set(TARGET_LIBC_ENTRYPOINTS # stdlib.h entrypoints libc.src.stdlib.atoi + libc.src.stdlib.atof + libc.src.stdlib.atol + libc.src.stdlib.atoll libc.src.stdlib.atexit + libc.src.stdlib.strtod + libc.src.stdlib.strtof + libc.src.stdlib.strtol + libc.src.stdlib.strtold + libc.src.stdlib.strtoll + libc.src.stdlib.strtoul + libc.src.stdlib.strtoull # Only implemented in the test suite libc.src.stdlib.malloc diff --git a/libc/config/gpu/headers.txt b/libc/config/gpu/headers.txt index 1b77c97..608ff42 100644 --- a/libc/config/gpu/headers.txt +++ b/libc/config/gpu/headers.txt @@ -1,6 +1,7 @@ set(TARGET_PUBLIC_HEADERS libc.include.ctype libc.include.string + libc.include.fenv libc.include.errno libc.include.stdlib ) diff --git a/libc/docs/gpu/support.rst b/libc/docs/gpu/support.rst index 59fdb61..5638e51 100644 --- a/libc/docs/gpu/support.rst +++ b/libc/docs/gpu/support.rst @@ -85,4 +85,15 @@ stdlib.h Function Name Available RPC Required ============= ========= ============ atoi |check| +atof |check| +atol |check| +atoll |check| +atexit |check| +strtod |check| +strtof |check| +strtol |check| +strtold |check| +strtoll |check| +strtoul |check| +strtoull |check| ============= ========= ============ diff --git a/libc/include/llvm-libc-types/fenv_t.h b/libc/include/llvm-libc-types/fenv_t.h index 6d2bea7..86fcf2e 100644 --- a/libc/include/llvm-libc-types/fenv_t.h +++ b/libc/include/llvm-libc-types/fenv_t.h @@ -25,6 +25,10 @@ typedef struct { } fenv_t; #elif defined(__riscv) typedef unsigned int fenv_t; +#elif defined(__AMDGPU__) || defined(__NVPTX__) +typedef struct { + unsigned int __fpc; +} fenv_t; #else #error "fenv_t not defined for your platform" #endif diff --git a/libc/src/__support/FPUtil/PlatformDefs.h b/libc/src/__support/FPUtil/PlatformDefs.h index 488bfc3..175a62a 100644 --- a/libc/src/__support/FPUtil/PlatformDefs.h +++ b/libc/src/__support/FPUtil/PlatformDefs.h @@ -17,8 +17,9 @@ // https://developer.arm.com/documentation/dui0491/i/C-and-C---Implementation-Details/Basic-data-types // https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms -#if defined(_WIN32) || defined(__arm__) || \ - (defined(__APPLE__) && defined(__aarch64__)) +// https://docs.amd.com/bundle/HIP-Programming-Guide-v5.1/page/Programming_with_HIP.html +#if defined(_WIN32) || defined(__arm__) || defined(__NVPTX__) || \ + defined(__AMDGPU__) || (defined(__APPLE__) && defined(__aarch64__)) #define LONG_DOUBLE_IS_DOUBLE #endif -- 2.7.4