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