[llvm-commits] [llvm] r168755 - in /llvm/trunk/lib/ExecutionEngine: MCJIT/CMakeLists.txt MCJIT/SectionMemoryManager.cpp RuntimeDyld/CMakeLists.txt RuntimeDyld/SectionMemoryManager.cpp

Kaylor, Andrew andrew.kaylor at intel.com
Wed Nov 28 10:30:09 PST 2012


Yeah, the dependency between MCJIT and JIT is ugly, but I don't think it's new and it's at least not circular.

I started trying to pull these components apart and put things that had to be common in ExecutionEngine (though RuntimeDyld really shouldn't depend on that either).  It turned out to be a bit of a rats nest, so I decided to defer it.

Eventually, and hopefully soon, I'd like to sever MCJIT and JIT completely.  Right now, for purely historical reasons, there are a number of interface classes that have functions for both of them but have almost zero overlap.  Everything is just side-by-side.  Having JITMemoryManager inherit from RuntimeDyldMemoryManager was meant as a first step in the direction of splitting them.

Most of the trouble is caused by the fact that they share a creation code path in the ExecutionEngine/Builder class.  If we split that, we should be able to clean things up a lot.  It just isn't a tiny project.

-Andy

-----Original Message-----
From: Benjamin Kramer [mailto:benny.kra at gmail.com] 
Sent: Wednesday, November 28, 2012 7:07 AM
To: Kaylor, Andrew
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm-commits] [llvm] r168755 - in /llvm/trunk/lib/ExecutionEngine: MCJIT/CMakeLists.txt MCJIT/SectionMemoryManager.cpp RuntimeDyld/CMakeLists.txt RuntimeDyld/SectionMemoryManager.cpp


On 28.11.2012, at 02:02, Andrew Kaylor <andrew.kaylor at intel.com> wrote:

> Author: akaylor
> Date: Tue Nov 27 19:02:06 2012
> New Revision: 168755
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=168755&view=rev
> Log:
> Moving SectionMemoryManager to MCJIT to avoid cross dependency between 
> JIT and RuntimeDyld

Now MCJIT depends on JIT, that doesn't look right either.

- Ben
> 
> Added:
>    llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp
>      - copied unchanged from r168721, 
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/SectionMemoryManager.cpp
> Removed:
>    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/SectionMemoryManager.cpp
> Modified:
>    llvm/trunk/lib/ExecutionEngine/MCJIT/CMakeLists.txt
>    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt
> 
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/CMakeLists.txt
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJ
> IT/CMakeLists.txt?rev=168755&r1=168754&r2=168755&view=diff
> ======================================================================
> ========
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/CMakeLists.txt (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/CMakeLists.txt Tue Nov 27 
> +++ 19:02:06 2012
> @@ -1,3 +1,4 @@
> add_llvm_library(LLVMMCJIT
>   MCJIT.cpp
> +  SectionMemoryManager.cpp
>   )
> 
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Run
> timeDyld/CMakeLists.txt?rev=168755&r1=168754&r2=168755&view=diff
> ======================================================================
> ========
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt 
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt Tue Nov 
> +++ 27 19:02:06 2012
> @@ -3,5 +3,4 @@
>   RuntimeDyld.cpp
>   RuntimeDyldELF.cpp
>   RuntimeDyldMachO.cpp
> -  SectionMemoryManager.cpp
>   )
> 
> Removed: 
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/SectionMemoryManager.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Run
> timeDyld/SectionMemoryManager.cpp?rev=168754&view=auto
> ======================================================================
> ========
> --- 
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/SectionMemoryManager.cpp 
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/SectionMemoryManager.cp
> +++ p (removed)
> @@ -1,226 +0,0 @@
> -//===- SectionMemoryManager.cpp - Memory manager for MCJIT/RtDyld *- 
> C++ -*-==// -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open 
> Source -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------
> ------===//
> -//
> -// This file implements the section-based memory manager used by the 
> MCJIT -// execution engine and RuntimeDyld -// 
> -//===----------------------------------------------------------------
> ------===//
> -
> -#include "llvm/Config/config.h"
> -#include "llvm/ExecutionEngine/SectionMemoryManager.h"
> -#include "llvm/Support/DynamicLibrary.h"
> -#include "llvm/Support/MathExtras.h"
> -
> -#ifdef __linux__
> -  // These includes used by 
> SectionMemoryManager::getPointerToNamedFunction()
> -  // for Glibc trickery. See comments in this function for more information.
> -  #ifdef HAVE_SYS_STAT_H
> -    #include <sys/stat.h>
> -  #endif
> -  #include <fcntl.h>
> -  #include <unistd.h>
> -#endif
> -
> -namespace llvm {
> -
> -uint8_t *SectionMemoryManager::allocateDataSection(uintptr_t Size,
> -                                                    unsigned Alignment,
> -                                                    unsigned SectionID,
> -                                                    bool IsReadOnly) {
> -  if (IsReadOnly)
> -    return allocateSection(RODataMem, Size, Alignment);
> -  return allocateSection(RWDataMem, Size, Alignment); -}
> -
> -uint8_t *SectionMemoryManager::allocateCodeSection(uintptr_t Size,
> -                                                   unsigned Alignment,
> -                                                   unsigned SectionID) {
> -  return allocateSection(CodeMem, Size, Alignment); -}
> -
> -uint8_t *SectionMemoryManager::allocateSection(MemoryGroup &MemGroup,
> -                                               uintptr_t Size,
> -                                               unsigned Alignment) {
> -  if (!Alignment)
> -    Alignment = 16;
> -
> -  assert(!(Alignment & (Alignment - 1)) && "Alignment must be a power 
> of two.");
> -
> -  uintptr_t RequiredSize = Alignment * ((Size + Alignment - 
> 1)/Alignment + 1);
> -  uintptr_t Addr = 0;
> -
> -  // Look in the list of free memory regions and use a block there if 
> one
> -  // is available.
> -  for (int i = 0, e = MemGroup.FreeMem.size(); i != e; ++i) {
> -    sys::MemoryBlock &MB = MemGroup.FreeMem[i];
> -    if (MB.size() >= RequiredSize) {
> -      Addr = (uintptr_t)MB.base();
> -      uintptr_t EndOfBlock = Addr + MB.size();
> -      // Align the address.
> -      Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1);
> -      // Store cutted free memory block.
> -      MemGroup.FreeMem[i] = sys::MemoryBlock((void*)(Addr + Size),
> -                                             EndOfBlock - Addr - Size);
> -      return (uint8_t*)Addr;
> -    }
> -  }
> -
> -  // No pre-allocated free block was large enough. Allocate a new memory region.
> -  // Note that all sections get allocated as read-write.  The 
> permissions will
> -  // be updated later based on memory group.
> -  //
> -  // FIXME: It would be useful to define a default allocation size 
> (or add
> -  // it as a constructor parameter) to minimize the number of allocations.
> -  //
> -  // FIXME: Initialize the Near member for each memory group to avoid
> -  // interleaving.
> -  error_code ec;
> -  sys::MemoryBlock MB = sys::Memory::allocateMappedMemory(RequiredSize,
> -                                                          &MemGroup.Near,
> -                                                          sys::Memory::MF_READ |
> -                                                            sys::Memory::MF_WRITE,
> -                                                          ec);
> -  if (ec) {
> -    // FIXME: Add error propogation to the interface.
> -    return NULL;
> -  }
> -
> -  // Save this address as the basis for our next request
> -  MemGroup.Near = MB;
> -
> -  MemGroup.AllocatedMem.push_back(MB);
> -  Addr = (uintptr_t)MB.base();
> -  uintptr_t EndOfBlock = Addr + MB.size();
> -
> -  // Align the address.
> -  Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1);
> -
> -  // The allocateMappedMemory may allocate much more memory than we 
> need. In
> -  // this case, we store the unused memory as a free memory block.
> -  unsigned FreeSize = EndOfBlock-Addr-Size;
> -  if (FreeSize > 16)
> -    MemGroup.FreeMem.push_back(sys::MemoryBlock((void*)(Addr + Size), FreeSize));
> -
> -  // Return aligned address
> -  return (uint8_t*)Addr;
> -}
> -
> -bool SectionMemoryManager::applyPermissions(std::string *ErrMsg) -{
> -  // FIXME: Should in-progress permissions be reverted if an error occurs?
> -  error_code ec;
> -
> -  // Make code memory executable.
> -  ec = applyMemoryGroupPermissions(CodeMem,
> -                                   sys::Memory::MF_READ | sys::Memory::MF_EXEC);
> -  if (ec) {
> -    if (ErrMsg) {
> -      *ErrMsg = ec.message();
> -    }
> -    return true;
> -  }
> -
> -  // Make read-only data memory read-only.
> -  ec = applyMemoryGroupPermissions(RODataMem,
> -                                   sys::Memory::MF_READ | sys::Memory::MF_EXEC);
> -  if (ec) {
> -    if (ErrMsg) {
> -      *ErrMsg = ec.message();
> -    }
> -    return true;
> -  }
> -
> -  // Read-write data memory already has the correct permissions
> -
> -  return false;
> -}
> -
> -error_code SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,
> -                                                             unsigned Permissions) {
> -
> -  for (int i = 0, e = MemGroup.AllocatedMem.size(); i != e; ++i) {
> -      error_code ec;
> -      ec = sys::Memory::protectMappedMemory(MemGroup.AllocatedMem[i],
> -                                            Permissions);
> -      if (ec) {
> -        return ec;
> -      }
> -  }
> -
> -  return error_code::success();
> -}
> -
> -void SectionMemoryManager::invalidateInstructionCache() {
> -  for (int i = 0, e = CodeMem.AllocatedMem.size(); i != e; ++i)
> -    sys::Memory::InvalidateInstructionCache(CodeMem.AllocatedMem[i].base(),
> -                                            CodeMem.AllocatedMem[i].size());
> -}
> -
> -static int jit_noop() {
> -  return 0;
> -}
> -
> -void *SectionMemoryManager::getPointerToNamedFunction(const std::string &Name,
> -                                                       bool AbortOnFailure) {
> -#if defined(__linux__)
> -  
> //===-----------------------------------------------------------------
> ---===//
> -  // Function stubs that are invoked instead of certain library calls
> -  //
> -  // Force the following functions to be linked in to anything that 
> uses the
> -  // JIT. This is a hack designed to work around the all-too-clever 
> Glibc
> -  // strategy of making these functions work differently when inlined 
> vs. when
> -  // not inlined, and hiding their real definitions in a separate 
> archive file
> -  // that the dynamic linker can't see. For more info, search for
> -  // 'libc_nonshared.a' on Google, or read http://llvm.org/PR274.
> -  if (Name == "stat") return (void*)(intptr_t)&stat;
> -  if (Name == "fstat") return (void*)(intptr_t)&fstat;
> -  if (Name == "lstat") return (void*)(intptr_t)&lstat;
> -  if (Name == "stat64") return (void*)(intptr_t)&stat64;
> -  if (Name == "fstat64") return (void*)(intptr_t)&fstat64;
> -  if (Name == "lstat64") return (void*)(intptr_t)&lstat64;
> -  if (Name == "atexit") return (void*)(intptr_t)&atexit;
> -  if (Name == "mknod") return (void*)(intptr_t)&mknod; -#endif // 
> __linux__
> -
> -  // We should not invoke parent's ctors/dtors from generated main()!
> -  // On Mingw and Cygwin, the symbol __main is resolved to
> -  // callee's(eg. tools/lli) one, to invoke wrong duplicated ctors
> -  // (and register wrong callee's dtors with atexit(3)).
> -  // We expect ExecutionEngine::runStaticConstructorsDestructors()
> -  // is called before ExecutionEngine::runFunctionAsMain() is called.
> -  if (Name == "__main") return (void*)(intptr_t)&jit_noop;
> -
> -  const char *NameStr = Name.c_str();
> -  void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);
> -  if (Ptr) return Ptr;
> -
> -  // If it wasn't found and if it starts with an underscore ('_') 
> character,
> -  // try again without the underscore.
> -  if (NameStr[0] == '_') {
> -    Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr+1);
> -    if (Ptr) return Ptr;
> -  }
> -
> -  if (AbortOnFailure)
> -    report_fatal_error("Program used external function '" + Name +
> -                      "' which could not be resolved!");
> -  return 0;
> -}
> -
> -SectionMemoryManager::~SectionMemoryManager() {
> -  for (unsigned i = 0, e = CodeMem.AllocatedMem.size(); i != e; ++i)
> -    sys::Memory::releaseMappedMemory(CodeMem.AllocatedMem[i]);
> -  for (unsigned i = 0, e = RWDataMem.AllocatedMem.size(); i != e; ++i)
> -    sys::Memory::releaseMappedMemory(RWDataMem.AllocatedMem[i]);
> -  for (unsigned i = 0, e = RODataMem.AllocatedMem.size(); i != e; ++i)
> -    sys::Memory::releaseMappedMemory(RODataMem.AllocatedMem[i]);
> -}
> -
> -} // namespace llvm
> -
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list