The `strdup` family of functions rely on `malloc` to be implemented.
Its presence in the `string_utils.h` header meant that compiling many of
the string functions relied on `malloc` being implementated as well.
This patch simply moves the implementation into a new file to avoid
including `stdlib.h` from the other string functions. This was a barrier
for compiling string functions for the GPU where there is no malloc
currently.
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/D138607
.memory_utils.bzero_implementation
)
+add_header_library(
+ allocating_string_utils
+ HDRS
+ allocating_string_utils.h
+ DEPENDS
+ libc.include.stdlib
+ .memory_utils.memcpy_implementation
+)
+
add_entrypoint_object(
memccpy
SRCS
--- /dev/null
+//===-- Allocating string utils ---------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LIBC_SRC_STRING_ALLOCATING_STRING_UTILS_H
+#define LIBC_SRC_STRING_ALLOCATING_STRING_UTILS_H
+
+#include "src/__support/CPP/bitset.h"
+#include "src/__support/common.h"
+#include "src/string/memory_utils/bzero_implementations.h"
+#include "src/string/memory_utils/memcpy_implementations.h"
+#include "src/string/string_utils.h"
+#include <stddef.h> // For size_t
+#include <stdlib.h> // For malloc
+
+namespace __llvm_libc {
+namespace internal {
+
+inline char *strdup(const char *src) {
+ if (src == nullptr)
+ return nullptr;
+ size_t len = string_length(src) + 1;
+ char *newstr = reinterpret_cast<char *>(::malloc(len));
+ if (newstr == nullptr)
+ return nullptr;
+ inline_memcpy(newstr, src, len);
+ return newstr;
+}
+
+} // namespace internal
+} // namespace __llvm_libc
+
+#endif
//===----------------------------------------------------------------------===//
#include "src/string/strdup.h"
+#include "src/string/allocating_string_utils.h"
#include "src/string/memory_utils/memcpy_implementations.h"
-#include "src/string/string_utils.h"
#include "src/__support/common.h"
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
+//
+// Standalone string utility functions. Utilities requiring memory allocations
+// should be placed in allocating_string_utils.h intead.
+//
+//===----------------------------------------------------------------------===//
#ifndef LIBC_SRC_STRING_STRING_UTILS_H
#define LIBC_SRC_STRING_STRING_UTILS_H
#include "src/string/memory_utils/bzero_implementations.h"
#include "src/string/memory_utils/memcpy_implementations.h"
#include <stddef.h> // For size_t
-#include <stdlib.h> // For malloc and free
namespace __llvm_libc {
namespace internal {
return len;
}
-inline char *strdup(const char *src) {
- if (src == nullptr)
- return nullptr;
- size_t len = string_length(src) + 1;
- char *newstr = reinterpret_cast<char *>(::malloc(len));
- if (newstr == nullptr)
- return nullptr;
- inline_memcpy(newstr, src, len);
- return newstr;
-}
-
} // namespace internal
} // namespace __llvm_libc
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
-#include "src/string/string_utils.h" // For strdup.
+#include "src/string/allocating_string_utils.h" // For strdup.
#include <errno.h>
#include <linux/limits.h> // This is safe to include without any name pollution.