[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
This commit is contained in:
Joseph Huber
2023-04-26 18:37:30 -05:00
parent db381405ce
commit 72bfe2c05a
6 changed files with 33 additions and 2 deletions

View File

@@ -12,3 +12,7 @@ def StdlibAPI : PublicAPI<"stdlib.h"> {
"__atexithandler_t",
];
}
def FenvAPI: PublicAPI<"fenv.h"> {
let Types = ["fenv_t"];
}

View File

@@ -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

View File

@@ -1,6 +1,7 @@
set(TARGET_PUBLIC_HEADERS
libc.include.ctype
libc.include.string
libc.include.fenv
libc.include.errno
libc.include.stdlib
)

View File

@@ -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|
============= ========= ============

View File

@@ -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

View File

@@ -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