From 96c96b46e962c801c610ba878751d8c0ee1359c9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 9 Mar 2009 21:34:10 +0000 Subject: [PATCH] Fix PR3724 by searching for the largest free block when allocating memory in the JIT. This is insanely inefficient, but hey, most people implement their own memory managers anyway. Patch by Eric Yew! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66472 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ExecutionEngine/JIT/JITMemoryManager.cpp | 21 ++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/ExecutionEngine/JIT/JITMemoryManager.cpp b/lib/ExecutionEngine/JIT/JITMemoryManager.cpp index 0dcc71f837c..b2bf8529d45 100644 --- a/lib/ExecutionEngine/JIT/JITMemoryManager.cpp +++ b/lib/ExecutionEngine/JIT/JITMemoryManager.cpp @@ -278,10 +278,27 @@ namespace { /// startFunctionBody - When a function starts, allocate a block of free /// executable memory, returning a pointer to it and its actual size. unsigned char *startFunctionBody(const Function *F, uintptr_t &ActualSize) { - CurBlock = FreeMemoryList; + FreeRangeHeader* candidateBlock = FreeMemoryList; + FreeRangeHeader* head = FreeMemoryList; + FreeRangeHeader* iter = head->Next; + + uintptr_t largest = candidateBlock->BlockSize; + + // Search for the largest free block + while (iter != head) { + if (iter->BlockSize > largest) { + largest = iter->BlockSize; + candidateBlock = iter; + } + iter = iter->Next; + } + + // Select this candidate block for allocation + CurBlock = candidateBlock; + // Allocate the entire memory block. - FreeMemoryList = FreeMemoryList->AllocateBlock(); + FreeMemoryList = candidateBlock->AllocateBlock(); ActualSize = CurBlock->BlockSize-sizeof(MemoryRangeHeader); return (unsigned char *)(CurBlock+1); } -- 2.34.1