--- - 2026-01-02 17:03:43.795228000 +1300 +++ src/include/jit/SectionMemoryManager.h 2026-01-02 16:52:50.352095000 +1300 @@ -1,3 +1,8 @@ +/* + * This is a copy of LLVM source code modified by the PostgreSQL project. + * See SectionMemoryManager.cpp for notes on provenance and license. + */ + //===- SectionMemoryManager.h - Memory manager for MCJIT/RtDyld -*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -11,18 +16,19 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_EXECUTIONENGINE_SECTIONMEMORYMANAGER_H -#define LLVM_EXECUTIONENGINE_SECTIONMEMORYMANAGER_H +#ifndef LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H +#define LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H -#include "llvm/ADT/SmallVector.h" -#include "llvm/ExecutionEngine/RTDyldMemoryManager.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Support/Memory.h" +#include +#include +#include +#include #include #include #include namespace llvm { +namespace backport { /// This is a simple memory manager which implements the methods called by /// the RuntimeDyld class to allocate memory for section-based loading of @@ -37,7 +43,7 @@ /// in the JITed object. Permissions can be applied either by calling /// MCJIT::finalizeObject or by calling SectionMemoryManager::finalizeMemory /// directly. Clients of MCJIT should call MCJIT::finalizeObject. -class LLVM_ABI SectionMemoryManager : public RTDyldMemoryManager { +class SectionMemoryManager : public RTDyldMemoryManager { public: /// This enum describes the various reasons to allocate pages from /// allocateMappedMemory. @@ -49,7 +55,7 @@ /// Implementations of this interface are used by SectionMemoryManager to /// request pages from the operating system. - class LLVM_ABI MemoryMapper { + class MemoryMapper { public: /// This method attempts to allocate \p NumBytes bytes of virtual memory for /// \p Purpose. \p NearBlock may point to an existing allocation, in which @@ -119,9 +125,17 @@ /// Implements allocating all memory in a single block. This is required to /// limit memory offsets to fit the ARM ABI; large memory systems may /// otherwise allocate separate sections too far apart. +#if LLVM_VERSION_MAJOR < 16 + virtual void reserveAllocationSpace(uintptr_t CodeSize, uint32_t CodeAlign, + uintptr_t RODataSize, + uint32_t RODataAlign, + uintptr_t RWDataSize, + uint32_t RWDataAlign) override; +#else void reserveAllocationSpace(uintptr_t CodeSize, Align CodeAlign, uintptr_t RODataSize, Align RODataAlign, uintptr_t RWDataSize, Align RWDataAlign) override; +#endif /// Allocates a memory block of (at least) the given size suitable for /// executable code. @@ -139,7 +153,7 @@ /// a default alignment of 16 will be used. uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName, - bool isReadOnly) override; + bool IsReadOnly) override; /// Update section-specific memory permissions and other attributes. /// @@ -168,7 +182,7 @@ // The actual block of free memory sys::MemoryBlock Free; // If there is a pending allocation from the same reservation right before - // this block, store it's index in PendingMem, to be able to update the + // this block, store its index in PendingMem, to be able to update the // pending region if part of this block is allocated, rather than having to // create a new one unsigned PendingPrefixIndex; @@ -206,6 +220,7 @@ bool ReserveAllocation; }; +} // end namespace backport } // end namespace llvm -#endif // LLVM_EXECUTIONENGINE_SECTIONMEMORYMANAGER_H +#endif // LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H --- - 2026-01-02 17:03:57.672285000 +1300 +++ src/backend/jit/llvm/SectionMemoryManager.cpp 2026-01-02 16:52:50.351938000 +1300 @@ -1,3 +1,19 @@ +/* + * This file is from LLVM 22 (originally pull request #71968), with minor + * modifications to avoid name clash and work with older LLVM versions. It + * replaces llvm::SectionMemoryManager, and is injected into llvm::RuntimeDyld + * to fix a memory layout bug on large memory ARM systems on LLVM < 22. + * + * We can remove this code (.cpp, .h, .LICENSE) once LLVM 22 is our minimum + * supported version or we've switched to JITLink for at least Aarch64. + * + * This file is a modified copy of a part of the LLVM source code that + * we would normally access from the LLVM library. It is therefore + * covered by the license at https://llvm.org/LICENSE.txt, reproduced + * verbatim in SectionMemoryManager.LICENSE in fulfillment of clause + * 4a. + */ + //===- SectionMemoryManager.cpp - Memory manager for MCJIT/RtDyld *- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -11,11 +27,16 @@ // //===----------------------------------------------------------------------===// -#include "llvm/ExecutionEngine/SectionMemoryManager.h" -#include "llvm/Config/config.h" -#include "llvm/Support/Process.h" +#include "jit/llvmjit_backport.h" +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER + +#include "jit/SectionMemoryManager.h" +#include +#include + namespace llvm { +namespace backport { bool SectionMemoryManager::hasSpace(const MemoryGroup &MemGroup, uintptr_t Size) const { @@ -26,9 +47,21 @@ return false; } +#if LLVM_VERSION_MAJOR < 16 +void SectionMemoryManager::reserveAllocationSpace(uintptr_t CodeSize, + uint32_t CodeAlign_i, + uintptr_t RODataSize, + uint32_t RODataAlign_i, + uintptr_t RWDataSize, + uint32_t RWDataAlign_i) { + Align CodeAlign(CodeAlign_i); + Align RODataAlign(RODataAlign_i); + Align RWDataAlign(RWDataAlign_i); +#else void SectionMemoryManager::reserveAllocationSpace( uintptr_t CodeSize, Align CodeAlign, uintptr_t RODataSize, Align RODataAlign, uintptr_t RWDataSize, Align RWDataAlign) { +#endif if (CodeSize == 0 && RODataSize == 0 && RWDataSize == 0) return; @@ -365,4 +398,7 @@ } } +} // namespace backport } // namespace llvm + +#endif