Re: [llvm] 7aaff8f - [ADT] Move allocate_buffer to MemAlloc.h and out of line
David Zarzycki via llvm-commits
llvm-commits at lists.llvm.org
Tue May 12 07:25:35 PDT 2020
Hi Benjamin,
I've been using DenseMap in a static, freestanding project where no libraries are linked. After this change, now LLVM libraries are required. Can we create a new LLVM build flag to enable the old behavior? Or enable the behavior you want? For example, I'd like a "LLVM_HEADER_ONLY_USAGE" flag to get the old behavior.
Does that work for you?
Dave
On Fri, Apr 24, 2020, at 7:33 AM, Benjamin Kramer via llvm-commits wrote:
>
> Author: Benjamin Kramer
> Date: 2020-04-24T13:32:50+02:00
> New Revision: 7aaff8fd2da2812a2b3cbc8a41af29774b10a7d6
>
> URL:
> https://github.com/llvm/llvm-project/commit/7aaff8fd2da2812a2b3cbc8a41af29774b10a7d6
> DIFF:
> https://github.com/llvm/llvm-project/commit/7aaff8fd2da2812a2b3cbc8a41af29774b10a7d6.diff
>
> LOG: [ADT] Move allocate_buffer to MemAlloc.h and out of line
>
> There's an ABI breakage here if LLVM is compiled in C++14 without
> aligned allocation and a user tries to use the result with aligned
> allocation. If DenseMap or unique_function is used across that ABI
> boundary it will break (PR45413). Moving it out of line is a bit of
> a band-aid and LLVM doesn't really give ABI guarantees at this level,
> but given the number of complaints I've received over this it still
> seems worth fixing.
>
> Added:
> llvm/lib/Support/MemAlloc.cpp
>
> Modified:
> llvm/include/llvm/ADT/DenseMap.h
> llvm/include/llvm/ADT/FunctionExtras.h
> llvm/include/llvm/Support/Compiler.h
> llvm/include/llvm/Support/MemAlloc.h
> llvm/lib/Support/CMakeLists.txt
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/include/llvm/ADT/DenseMap.h
> b/llvm/include/llvm/ADT/DenseMap.h
> index d68f90ef68db..2a6f67c7fa21 100644
> --- a/llvm/include/llvm/ADT/DenseMap.h
> +++ b/llvm/include/llvm/ADT/DenseMap.h
> @@ -18,6 +18,7 @@
> #include "llvm/Support/AlignOf.h"
> #include "llvm/Support/Compiler.h"
> #include "llvm/Support/MathExtras.h"
> +#include "llvm/Support/MemAlloc.h"
> #include "llvm/Support/ReverseIteration.h"
> #include "llvm/Support/type_traits.h"
> #include <algorithm>
>
> diff --git a/llvm/include/llvm/ADT/FunctionExtras.h
> b/llvm/include/llvm/ADT/FunctionExtras.h
> index 121aa527a5da..ad84bbc35b78 100644
> --- a/llvm/include/llvm/ADT/FunctionExtras.h
> +++ b/llvm/include/llvm/ADT/FunctionExtras.h
> @@ -34,6 +34,7 @@
>
> #include "llvm/ADT/PointerIntPair.h"
> #include "llvm/ADT/PointerUnion.h"
> +#include "llvm/Support/MemAlloc.h"
> #include "llvm/Support/type_traits.h"
> #include <memory>
>
>
> diff --git a/llvm/include/llvm/Support/Compiler.h
> b/llvm/include/llvm/Support/Compiler.h
> index a8356ccf812d..cc64b54e31f8 100644
> --- a/llvm/include/llvm/Support/Compiler.h
> +++ b/llvm/include/llvm/Support/Compiler.h
> @@ -551,48 +551,4 @@ void AnnotateIgnoreWritesEnd(const char *file, int
> line);
> #define LLVM_ENABLE_EXCEPTIONS 1
> #endif
>
> -#ifdef __cplusplus
> -namespace llvm {
> -
> -/// Allocate a buffer of memory with the given size and alignment.
> -///
> -/// When the compiler supports aligned operator new, this will use it to to
> -/// handle even over-aligned allocations.
> -///
> -/// However, this doesn't make any attempt to leverage the fancier techniques
> -/// like posix_memalign due to portability. It is mostly intended to allow
> -/// compatibility with platforms that, after aligned allocation was added, use
> -/// reduced default alignment.
> -inline void *allocate_buffer(size_t Size, size_t Alignment) {
> - return ::operator new(Size
> -#ifdef __cpp_aligned_new
> - ,
> - std::align_val_t(Alignment)
> -#endif
> - );
> -}
> -
> -/// Deallocate a buffer of memory with the given size and alignment.
> -///
> -/// If supported, this will used the sized delete operator. Also if supported,
> -/// this will pass the alignment to the delete operator.
> -///
> -/// The pointer must have been allocated with the corresponding new operator,
> -/// most likely using the above helper.
> -inline void deallocate_buffer(void *Ptr, size_t Size, size_t Alignment) {
> - ::operator delete(Ptr
> -#ifdef __cpp_sized_deallocation
> - ,
> - Size
> -#endif
> -#ifdef __cpp_aligned_new
> - ,
> - std::align_val_t(Alignment)
> -#endif
> - );
> -}
> -
> -} // End namespace llvm
> -
> -#endif // __cplusplus
> #endif
>
> diff --git a/llvm/include/llvm/Support/MemAlloc.h
> b/llvm/include/llvm/Support/MemAlloc.h
> index 0e5869141fd3..d6012bd5a698 100644
> --- a/llvm/include/llvm/Support/MemAlloc.h
> +++ b/llvm/include/llvm/Support/MemAlloc.h
> @@ -62,5 +62,26 @@ LLVM_ATTRIBUTE_RETURNS_NONNULL inline void
> *safe_realloc(void *Ptr, size_t Sz) {
> return Result;
> }
>
> -}
> +/// Allocate a buffer of memory with the given size and alignment.
> +///
> +/// When the compiler supports aligned operator new, this will use it to to
> +/// handle even over-aligned allocations.
> +///
> +/// However, this doesn't make any attempt to leverage the fancier techniques
> +/// like posix_memalign due to portability. It is mostly intended to allow
> +/// compatibility with platforms that, after aligned allocation was added, use
> +/// reduced default alignment.
> +LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void *
> +allocate_buffer(size_t Size, size_t Alignment);
> +
> +/// Deallocate a buffer of memory with the given size and alignment.
> +///
> +/// If supported, this will used the sized delete operator. Also if supported,
> +/// this will pass the alignment to the delete operator.
> +///
> +/// The pointer must have been allocated with the corresponding new operator,
> +/// most likely using the above helper.
> +void deallocate_buffer(void *Ptr, size_t Size, size_t Alignment);
> +
> +} // namespace llvm
> #endif
>
> diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
> index 185aff780bd8..9e81e464c681 100644
> --- a/llvm/lib/Support/CMakeLists.txt
> +++ b/llvm/lib/Support/CMakeLists.txt
> @@ -115,6 +115,7 @@ add_llvm_component_library(LLVMSupport
> LowLevelType.cpp
> ManagedStatic.cpp
> MathExtras.cpp
> + MemAlloc.cpp
> MemoryBuffer.cpp
> MD5.cpp
> NativeFormatting.cpp
>
> diff --git a/llvm/lib/Support/MemAlloc.cpp
> b/llvm/lib/Support/MemAlloc.cpp
> new file mode 100644
> index 000000000000..bc5a26dc7218
> --- /dev/null
> +++ b/llvm/lib/Support/MemAlloc.cpp
> @@ -0,0 +1,33 @@
> +//===- MemAlloc.cpp - Memory allocation functions
> -------------------------===//
> +//
> +// 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
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/Support/MemAlloc.h"
> +
> +// These are out of line to have __cpp_aligned_new not affect ABI.
> +
> +void *llvm::allocate_buffer(size_t Size, size_t Alignment) {
> + return ::operator new(Size
> +#ifdef __cpp_aligned_new
> + ,
> + std::align_val_t(Alignment)
> +#endif
> + );
> +}
> +
> +void llvm::deallocate_buffer(void *Ptr, size_t Size, size_t Alignment)
> {
> + ::operator delete(Ptr
> +#ifdef __cpp_sized_deallocation
> + ,
> + Size
> +#endif
> +#ifdef __cpp_aligned_new
> + ,
> + std::align_val_t(Alignment)
> +#endif
> + );
> +}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list