[clang] [libc] [llvm] [libc] Implement (v|f)printf on the GPU (PR #96369)
Jon Chesterfield via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 1 07:30:48 PDT 2024
================
@@ -54,7 +54,34 @@ class MockArgList {
}
template <class T> LIBC_INLINE T next_var() {
- ++arg_counter;
+ arg_counter++;
+ return T(arg_counter);
+ }
+
+ size_t read_count() const { return arg_counter; }
+};
+
+// Used by the GPU implementation to parse how many bytes need to be read from
+// the variadic argument buffer.
+class DummyArgList {
+ size_t arg_counter = 0;
+
+public:
+ LIBC_INLINE DummyArgList() = default;
+ LIBC_INLINE DummyArgList(va_list) { ; }
+ LIBC_INLINE DummyArgList(DummyArgList &other) {
+ arg_counter = other.arg_counter;
+ }
+ LIBC_INLINE ~DummyArgList() = default;
+
+ LIBC_INLINE DummyArgList &operator=(DummyArgList &rhs) {
+ arg_counter = rhs.arg_counter;
+ return *this;
+ }
+
+ template <class T> LIBC_INLINE T next_var() {
+ arg_counter =
+ ((arg_counter + alignof(T) - 1) / alignof(T)) * alignof(T) + sizeof(T);
return T(arg_counter);
----------------
JonChesterfield wrote:
maybe split this into separate increment by size and round for the alignment operations. There might be helper functions for the rounding which would be clearer than reading the division / multiplication and trying to pattern match on what alignment code usually looks like (e.g. I expected to see masking off bits so tripped over this)
https://github.com/llvm/llvm-project/pull/96369
More information about the cfe-commits
mailing list