This is an archive of the discontinued LLVM Phabricator instance.

[libc] Ignore 'errno' on the GPU and support 'atoi'
ClosedPublic

Authored by jhuber6 on Apr 24 2023, 4:33 PM.

Details

Summary

The 'errno' value is most likely not useful on the GPU and it prevents
us from providing certain functions on the GPU that depend on it, like
atoi. This patch makes the necessary changes to support errno by
simple replacing it with a consumer class.

Supporting errno on the GPU is possible in some aspects. The first
approach would be to use a buffer of shared memory that has enough space
for all threads. Another option would be to change code generation to
support thread_local using address_space(5) memory allocated at
kernel launch. The former could look like the following, which could be
implemented in a later patch:

template <typename T>
using SharedBuffer = T[gpu::MAX_THREADS] [[clang::address_space(3)]];
template <typename T> struct ErrnoSetter {
  constexpr ErrnoSetter(SharedBuffer<T> &storage) : storage(storage) {}
  SharedBuffer<T> &storage;
  void operator=(const T &val) { storage[gpu::get_thread_id()] = val; }
};

static SharedBuffer<int> thread_local_buffer [[clang::loader_uninitialized]];
ErrnoSetter<int> __llvmlibc_internal_errno(thread_local_buffer);

Diff Detail

Event Timeline

jhuber6 created this revision.Apr 24 2023, 4:33 PM
Herald added projects: Restricted Project, Restricted Project. · View Herald TranscriptApr 24 2023, 4:33 PM
jhuber6 requested review of this revision.Apr 24 2023, 4:33 PM
sivachandra accepted this revision.Apr 25 2023, 10:01 AM
sivachandra added inline comments.
libc/src/errno/libc_errno.h
28–32

Nit: May be a nested ifdef similar to the #else case below?

This revision is now accepted and ready to land.Apr 25 2023, 10:01 AM
This revision was landed with ongoing or failed builds.Apr 25 2023, 10:42 AM
This revision was automatically updated to reflect the committed changes.