[llvm] r182407 - Put RTDyldMemoryManager into its own file, and make it linked into

Justin Holewinski justin.holewinski at gmail.com
Tue May 21 13:00:58 PDT 2013


Ubuntu 13.04, GCC 4.7.3, fresh build LLVM w/ CMake + Debug + Clang:

[349/1621] Building CXX object
lib/ExecutionEngine/CMakeFiles/LLVMExecutionEngine.dir/RTDyldMemoryManager.cpp.o
FAILED: /usr/bin/c++   -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fPIC
-fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings
-Wno-missing-field-initializers -pedantic -Wno-long-long
-Wno-maybe-uninitialized -Wnon-virtual-dtor -fno-rtti -g
-Ilib/ExecutionEngine
-I/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine -Iinclude
-I/scratch/jholewinski/llvm/src/llvm/include    -fno-exceptions -MMD -MT
lib/ExecutionEngine/CMakeFiles/LLVMExecutionEngine.dir/RTDyldMemoryManager.cpp.o
-MF
"lib/ExecutionEngine/CMakeFiles/LLVMExecutionEngine.dir/RTDyldMemoryManager.cpp.o.d"
-o
lib/ExecutionEngine/CMakeFiles/LLVMExecutionEngine.dir/RTDyldMemoryManager.cpp.o
-c
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:
In member function ‘virtual void*
llvm::RTDyldMemoryManager::getPointerToNamedFunction(const string&, bool)’:
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:70:48:
error: ‘stat’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:71:49:
error: ‘fstat’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:72:49:
error: ‘lstat’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:73:50:
error: ‘stat64’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:74:51:
error: ‘fstat64’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:75:51:
error: ‘lstat64’ was not declared in this scope
/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:77:49:
error: ‘mknod’ was not declared in this scope
[349/1621] Linking CXX static library lib/libLLVMAnalysis.a
ninja: build stopped: subcommand failed.


On Tue, May 21, 2013 at 3:56 PM, Filip Pizlo <fpizlo at apple.com> wrote:

> Author: fpizlo
> Date: Tue May 21 14:56:00 2013
> New Revision: 182407
>
> URL: http://llvm.org/viewvc/llvm-project?rev=182407&view=rev
> Log:
> Put RTDyldMemoryManager into its own file, and make it linked into
> libExecutionEngine. Move method implementations that aren't specific to
> allocation out of SectionMemoryManager and into RTDyldMemoryManager.
>
> This is in preparation for exposing RTDyldMemoryManager through the C
> API.
>
>
> Added:
>     llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h
>     llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp
> Modified:
>     llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
>     llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h
>     llvm/trunk/lib/ExecutionEngine/CMakeLists.txt
>     llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp
>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
>
> Added: llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=182407&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h (added)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h Tue May
> 21 14:56:00 2013
> @@ -0,0 +1,76 @@
> +//===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// Interface of the runtime dynamic memory manager base class.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
> +#define LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
> +
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/CBindingWrapping.h"
> +#include "llvm/Support/Memory.h"
> +#include "llvm-c/ExecutionEngine.h"
> +
> +namespace llvm {
> +
> +// RuntimeDyld clients often want to handle the memory management of
> +// what gets placed where. For JIT clients, this is the subset of
> +// JITMemoryManager required for dynamic loading of binaries.
> +//
> +// FIXME: As the RuntimeDyld fills out, additional routines will be needed
> +//        for the varying types of objects to be allocated.
> +class RTDyldMemoryManager {
> +  RTDyldMemoryManager(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
> +  void operator=(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
> +public:
> +  RTDyldMemoryManager() {}
> +  virtual ~RTDyldMemoryManager();
> +
> +  /// Allocate a memory block of (at least) the given size suitable for
> +  /// executable code. The SectionID is a unique identifier assigned by
> the JIT
> +  /// engine, and optionally recorded by the memory manager to access a
> loaded
> +  /// section.
> +  virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
> +                                       unsigned SectionID) = 0;
> +
> +  /// Allocate a memory block of (at least) the given size suitable for
> data.
> +  /// The SectionID is a unique identifier assigned by the JIT engine, and
> +  /// optionally recorded by the memory manager to access a loaded
> section.
> +  virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
> +                                       unsigned SectionID, bool
> IsReadOnly) = 0;
> +
> +  /// Register the EH frames with the runtime so that c++ exceptions work.
> +  virtual void registerEHFrames(StringRef SectionData);
> +
> +  /// This method returns the address of the specified function. As such
> it is
> +  /// only useful for resolving library symbols, not code generated
> symbols.
> +  ///
> +  /// If \p AbortOnFailure is false and no function with the given name is
> +  /// found, this function returns a null pointer. Otherwise, it prints a
> +  /// message to stderr and aborts.
> +  virtual void *getPointerToNamedFunction(const std::string &Name,
> +                                          bool AbortOnFailure = true);
> +
> +  /// This method is called when object loading is complete and section
> page
> +  /// permissions can be applied.  It is up to the memory manager
> implementation
> +  /// to decide whether or not to act on this method.  The memory manager
> will
> +  /// typically allocate all sections as read-write and then apply
> specific
> +  /// permissions when this method is called.  Code sections cannot be
> executed
> +  /// until this function has been called.  In addition, any cache
> coherency
> +  /// operations needed to reliably use the memory are also performed.
> +  ///
> +  /// Returns true if an error occurred, false otherwise.
> +  virtual bool finalizeMemory(std::string *ErrMsg = 0) = 0;
> +};
> +
> +} // namespace llvm
> +
> +#endif // LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=182407&r1=182406&r2=182407&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Tue May 21
> 14:56:00 2013
> @@ -16,6 +16,7 @@
>
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/ExecutionEngine/ObjectBuffer.h"
> +#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
>  #include "llvm/Support/Memory.h"
>
>  namespace llvm {
> @@ -23,58 +24,6 @@ namespace llvm {
>  class RuntimeDyldImpl;
>  class ObjectImage;
>
> -// RuntimeDyld clients often want to handle the memory management of
> -// what gets placed where. For JIT clients, this is the subset of
> -// JITMemoryManager required for dynamic loading of binaries.
> -//
> -// FIXME: As the RuntimeDyld fills out, additional routines will be needed
> -//        for the varying types of objects to be allocated.
> -class RTDyldMemoryManager {
> -  RTDyldMemoryManager(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
> -  void operator=(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;
> -public:
> -  RTDyldMemoryManager() {}
> -  virtual ~RTDyldMemoryManager();
> -
> -  /// Allocate a memory block of (at least) the given size suitable for
> -  /// executable code. The SectionID is a unique identifier assigned by
> the JIT
> -  /// engine, and optionally recorded by the memory manager to access a
> loaded
> -  /// section.
> -  virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
> -                                       unsigned SectionID) = 0;
> -
> -  /// Allocate a memory block of (at least) the given size suitable for
> data.
> -  /// The SectionID is a unique identifier assigned by the JIT engine, and
> -  /// optionally recorded by the memory manager to access a loaded
> section.
> -  virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
> -                                       unsigned SectionID, bool
> IsReadOnly) = 0;
> -
> -  /// This method returns the address of the specified function. As such
> it is
> -  /// only useful for resolving library symbols, not code generated
> symbols.
> -  ///
> -  /// If AbortOnFailure is false and no function with the given name is
> -  /// found, this function returns a null pointer. Otherwise, it prints a
> -  /// message to stderr and aborts.
> -  virtual void *getPointerToNamedFunction(const std::string &Name,
> -                                          bool AbortOnFailure = true) = 0;
> -
> -  /// This method is called when object loading is complete and section
> page
> -  /// permissions can be applied.  It is up to the memory manager
> implementation
> -  /// to decide whether or not to act on this method.  The memory manager
> will
> -  /// typically allocate all sections as read-write and then apply
> specific
> -  /// permissions when this method is called.  Code sections cannot be
> executed
> -  /// until this function has been called.  In addition, any cache
> coherency
> -  /// operations needed to reliably use the memory are also performed.
> -  ///
> -  /// Returns true if an error occurred, false otherwise.
> -  virtual bool finalizeMemory(std::string *ErrMsg = 0) = 0;
> -
> -  /// Register the EH frames with the runtime so that c++ exceptions
> work. The
> -  /// default implementation does nothing. Look at SectionMemoryManager
> for one
> -  /// that uses __register_frame.
> -  virtual void registerEHFrames(StringRef SectionData);
> -};
> -
>  class RuntimeDyld {
>    RuntimeDyld(const RuntimeDyld &) LLVM_DELETED_FUNCTION;
>    void operator=(const RuntimeDyld &) LLVM_DELETED_FUNCTION;
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h?rev=182407&r1=182406&r2=182407&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h
> (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h Tue May
> 21 14:56:00 2013
> @@ -73,17 +73,6 @@ public:
>    /// \returns true if an error occurred, false otherwise.
>    virtual bool finalizeMemory(std::string *ErrMsg = 0);
>
> -  void registerEHFrames(StringRef SectionData);
> -
> -  /// This method returns the address of the specified function. As such
> it is
> -  /// only useful for resolving library symbols, not code generated
> symbols.
> -  ///
> -  /// If \p AbortOnFailure is false and no function with the given name is
> -  /// found, this function returns a null pointer. Otherwise, it prints a
> -  /// message to stderr and aborts.
> -  virtual void *getPointerToNamedFunction(const std::string &Name,
> -                                          bool AbortOnFailure = true);
> -
>    /// \brief Invalidate instruction cache for code sections.
>    ///
>    /// Some platforms with separate data cache and instruction cache
> require
>
> Modified: llvm/trunk/lib/ExecutionEngine/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/CMakeLists.txt?rev=182407&r1=182406&r2=182407&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/CMakeLists.txt (original)
> +++ llvm/trunk/lib/ExecutionEngine/CMakeLists.txt Tue May 21 14:56:00 2013
> @@ -3,6 +3,7 @@
>  add_llvm_library(LLVMExecutionEngine
>    ExecutionEngine.cpp
>    ExecutionEngineBindings.cpp
> +  RTDyldMemoryManager.cpp
>    TargetSelect.cpp
>    )
>
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp?rev=182407&r1=182406&r2=182407&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp
> (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp Tue May
> 21 14:56:00 2013
> @@ -14,7 +14,6 @@
>
>  #include "llvm/Config/config.h"
>  #include "llvm/ExecutionEngine/SectionMemoryManager.h"
> -#include "llvm/Support/DynamicLibrary.h"
>  #include "llvm/Support/MathExtras.h"
>
>  #ifdef __linux__
> @@ -146,38 +145,6 @@ bool SectionMemoryManager::finalizeMemor
>    return false;
>  }
>
> -// Determine whether we can register EH tables.
> -#if (defined(__GNUC__) && !defined(__ARM_EABI__) && \
> -     !defined(__USING_SJLJ_EXCEPTIONS__))
> -#define HAVE_EHTABLE_SUPPORT 1
> -#else
> -#define HAVE_EHTABLE_SUPPORT 0
> -#endif
> -
> -#if HAVE_EHTABLE_SUPPORT
> -extern "C" void __register_frame(void*);
> -
> -static const char *processFDE(const char *Entry) {
> -  const char *P = Entry;
> -  uint32_t Length = *((uint32_t*)P);
> -  P += 4;
> -  uint32_t Offset = *((uint32_t*)P);
> -  if (Offset != 0)
> -    __register_frame((void*)Entry);
> -  return P + Length;
> -}
> -#endif
> -
> -void SectionMemoryManager::registerEHFrames(StringRef SectionData) {
> -#if HAVE_EHTABLE_SUPPORT
> -  const char *P = SectionData.data();
> -  const char *End = SectionData.data() + SectionData.size();
> -  do  {
> -    P = processFDE(P);
> -  } while(P != End);
> -#endif
> -}
> -
>  error_code SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup
> &MemGroup,
>                                                               unsigned
> Permissions) {
>
> @@ -199,57 +166,6 @@ void SectionMemoryManager::invalidateIns
>
>  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]);
>
> Added: llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp?rev=182407&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp (added)
> +++ llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp Tue May 21
> 14:56:00 2013
> @@ -0,0 +1,105 @@
> +//===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// Implementation of the runtime dynamic memory manager base class.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
> +#include "llvm/Support/DynamicLibrary.h"
> +#include "llvm/Support/ErrorHandling.h"
> +
> +namespace llvm {
> +
> +RTDyldMemoryManager::~RTDyldMemoryManager() {}
> +
> +// Determine whether we can register EH tables.
> +#if (defined(__GNUC__) && !defined(__ARM_EABI__) && \
> +     !defined(__USING_SJLJ_EXCEPTIONS__))
> +#define HAVE_EHTABLE_SUPPORT 1
> +#else
> +#define HAVE_EHTABLE_SUPPORT 0
> +#endif
> +
> +#if HAVE_EHTABLE_SUPPORT
> +extern "C" void __register_frame(void*);
> +
> +static const char *processFDE(const char *Entry) {
> +  const char *P = Entry;
> +  uint32_t Length = *((uint32_t*)P);
> +  P += 4;
> +  uint32_t Offset = *((uint32_t*)P);
> +  if (Offset != 0)
> +    __register_frame((void*)Entry);
> +  return P + Length;
> +}
> +#endif
> +
> +void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) {
> +#if HAVE_EHTABLE_SUPPORT
> +  const char *P = SectionData.data();
> +  const char *End = SectionData.data() + SectionData.size();
> +  do  {
> +    P = processFDE(P);
> +  } while(P != End);
> +#endif
> +}
> +
> +static int jit_noop() {
> +  return 0;
> +}
> +
> +void *RTDyldMemoryManager::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;
> +}
> +
> +} // namespace llvm
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=182407&r1=182406&r2=182407&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Tue May 21
> 14:56:00 2013
> @@ -24,8 +24,6 @@ using namespace llvm;
>  using namespace llvm::object;
>
>  // Empty out-of-line virtual destructor as the key function.
> -RTDyldMemoryManager::~RTDyldMemoryManager() {}
> -void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) {}
>  RuntimeDyldImpl::~RuntimeDyldImpl() {}
>
>  namespace llvm {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 

Thanks,

Justin Holewinski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130521/a625eae6/attachment.html>


More information about the llvm-commits mailing list