<div dir="ltr">Ubuntu 13.04, GCC 4.7.3, fresh build LLVM w/ CMake + Debug + Clang:<div><br></div><div><div><font face="courier new, monospace">[349/1621] Building CXX object lib/ExecutionEngine/CMakeFiles/LLVMExecutionEngine.dir/RTDyldMemoryManager.cpp.o</font></div>
<div><font face="courier new, monospace">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</font></div>
<div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp: In member function ‘virtual void* llvm::RTDyldMemoryManager::getPointerToNamedFunction(const string&, bool)’:</font></div>
<div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:70:48: error: ‘stat’ was not declared in this scope</font></div><div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:71:49: error: ‘fstat’ was not declared in this scope</font></div>
<div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:72:49: error: ‘lstat’ was not declared in this scope</font></div><div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:73:50: error: ‘stat64’ was not declared in this scope</font></div>
<div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:74:51: error: ‘fstat64’ was not declared in this scope</font></div><div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:75:51: error: ‘lstat64’ was not declared in this scope</font></div>
<div><font face="courier new, monospace">/scratch/jholewinski/llvm/src/llvm/lib/ExecutionEngine/RTDyldMemoryManager.cpp:77:49: error: ‘mknod’ was not declared in this scope</font></div><div><font face="courier new, monospace">[349/1621] Linking CXX static library lib/libLLVMAnalysis.a</font></div>
<div><font face="courier new, monospace">ninja: build stopped: subcommand failed.</font></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 21, 2013 at 3:56 PM, Filip Pizlo <span dir="ltr"><<a href="mailto:fpizlo@apple.com" target="_blank">fpizlo@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fpizlo<br>
Date: Tue May 21 14:56:00 2013<br>
New Revision: 182407<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182407&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182407&view=rev</a><br>
Log:<br>
Put RTDyldMemoryManager into its own file, and make it linked into<br>
libExecutionEngine. Move method implementations that aren't specific to<br>
allocation out of SectionMemoryManager and into RTDyldMemoryManager.<br>
<br>
This is in preparation for exposing RTDyldMemoryManager through the C<br>
API.<br>
<br>
<br>
Added:<br>
    llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h<br>
    llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp<br>
Modified:<br>
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
    llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h<br>
    llvm/trunk/lib/ExecutionEngine/CMakeLists.txt<br>
    llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp<br>
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
<br>
Added: llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=182407&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=182407&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h (added)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h Tue May 21 14:56:00 2013<br>
@@ -0,0 +1,76 @@<br>
+//===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// Interface of the runtime dynamic memory manager base class.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H<br>
+#define LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H<br>
+<br>
+#include "llvm/ADT/StringRef.h"<br>
+#include "llvm/Support/CBindingWrapping.h"<br>
+#include "llvm/Support/Memory.h"<br>
+#include "llvm-c/ExecutionEngine.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+// RuntimeDyld clients often want to handle the memory management of<br>
+// what gets placed where. For JIT clients, this is the subset of<br>
+// JITMemoryManager required for dynamic loading of binaries.<br>
+//<br>
+// FIXME: As the RuntimeDyld fills out, additional routines will be needed<br>
+//        for the varying types of objects to be allocated.<br>
+class RTDyldMemoryManager {<br>
+  RTDyldMemoryManager(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;<br>
+  void operator=(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;<br>
+public:<br>
+  RTDyldMemoryManager() {}<br>
+  virtual ~RTDyldMemoryManager();<br>
+<br>
+  /// Allocate a memory block of (at least) the given size suitable for<br>
+  /// executable code. The SectionID is a unique identifier assigned by the JIT<br>
+  /// engine, and optionally recorded by the memory manager to access a loaded<br>
+  /// section.<br>
+  virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,<br>
+                                       unsigned SectionID) = 0;<br>
+<br>
+  /// Allocate a memory block of (at least) the given size suitable for data.<br>
+  /// The SectionID is a unique identifier assigned by the JIT engine, and<br>
+  /// optionally recorded by the memory manager to access a loaded section.<br>
+  virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,<br>
+                                       unsigned SectionID, bool IsReadOnly) = 0;<br>
+<br>
+  /// Register the EH frames with the runtime so that c++ exceptions work.<br>
+  virtual void registerEHFrames(StringRef SectionData);<br>
+<br>
+  /// This method returns the address of the specified function. As such it is<br>
+  /// only useful for resolving library symbols, not code generated symbols.<br>
+  ///<br>
+  /// If \p AbortOnFailure is false and no function with the given name is<br>
+  /// found, this function returns a null pointer. Otherwise, it prints a<br>
+  /// message to stderr and aborts.<br>
+  virtual void *getPointerToNamedFunction(const std::string &Name,<br>
+                                          bool AbortOnFailure = true);<br>
+<br>
+  /// This method is called when object loading is complete and section page<br>
+  /// permissions can be applied.  It is up to the memory manager implementation<br>
+  /// to decide whether or not to act on this method.  The memory manager will<br>
+  /// typically allocate all sections as read-write and then apply specific<br>
+  /// permissions when this method is called.  Code sections cannot be executed<br>
+  /// until this function has been called.  In addition, any cache coherency<br>
+  /// operations needed to reliably use the memory are also performed.<br>
+  ///<br>
+  /// Returns true if an error occurred, false otherwise.<br>
+  virtual bool finalizeMemory(std::string *ErrMsg = 0) = 0;<br>
+};<br>
+<br>
+} // namespace llvm<br>
+<br>
+#endif // LLVM_EXECUTIONENGINE_RT_DYLD_MEMORY_MANAGER_H<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=182407&r1=182406&r2=182407&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=182407&r1=182406&r2=182407&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Tue May 21 14:56:00 2013<br>
@@ -16,6 +16,7 @@<br>
<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/ExecutionEngine/ObjectBuffer.h"<br>
+#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"<br>
 #include "llvm/Support/Memory.h"<br>
<br>
 namespace llvm {<br>
@@ -23,58 +24,6 @@ namespace llvm {<br>
 class RuntimeDyldImpl;<br>
 class ObjectImage;<br>
<br>
-// RuntimeDyld clients often want to handle the memory management of<br>
-// what gets placed where. For JIT clients, this is the subset of<br>
-// JITMemoryManager required for dynamic loading of binaries.<br>
-//<br>
-// FIXME: As the RuntimeDyld fills out, additional routines will be needed<br>
-//        for the varying types of objects to be allocated.<br>
-class RTDyldMemoryManager {<br>
-  RTDyldMemoryManager(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;<br>
-  void operator=(const RTDyldMemoryManager&) LLVM_DELETED_FUNCTION;<br>
-public:<br>
-  RTDyldMemoryManager() {}<br>
-  virtual ~RTDyldMemoryManager();<br>
-<br>
-  /// Allocate a memory block of (at least) the given size suitable for<br>
-  /// executable code. The SectionID is a unique identifier assigned by the JIT<br>
-  /// engine, and optionally recorded by the memory manager to access a loaded<br>
-  /// section.<br>
-  virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,<br>
-                                       unsigned SectionID) = 0;<br>
-<br>
-  /// Allocate a memory block of (at least) the given size suitable for data.<br>
-  /// The SectionID is a unique identifier assigned by the JIT engine, and<br>
-  /// optionally recorded by the memory manager to access a loaded section.<br>
-  virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,<br>
-                                       unsigned SectionID, bool IsReadOnly) = 0;<br>
-<br>
-  /// This method returns the address of the specified function. As such it is<br>
-  /// only useful for resolving library symbols, not code generated symbols.<br>
-  ///<br>
-  /// If AbortOnFailure is false and no function with the given name is<br>
-  /// found, this function returns a null pointer. Otherwise, it prints a<br>
-  /// message to stderr and aborts.<br>
-  virtual void *getPointerToNamedFunction(const std::string &Name,<br>
-                                          bool AbortOnFailure = true) = 0;<br>
-<br>
-  /// This method is called when object loading is complete and section page<br>
-  /// permissions can be applied.  It is up to the memory manager implementation<br>
-  /// to decide whether or not to act on this method.  The memory manager will<br>
-  /// typically allocate all sections as read-write and then apply specific<br>
-  /// permissions when this method is called.  Code sections cannot be executed<br>
-  /// until this function has been called.  In addition, any cache coherency<br>
-  /// operations needed to reliably use the memory are also performed.<br>
-  ///<br>
-  /// Returns true if an error occurred, false otherwise.<br>
-  virtual bool finalizeMemory(std::string *ErrMsg = 0) = 0;<br>
-<br>
-  /// Register the EH frames with the runtime so that c++ exceptions work. The<br>
-  /// default implementation does nothing. Look at SectionMemoryManager for one<br>
-  /// that uses __register_frame.<br>
-  virtual void registerEHFrames(StringRef SectionData);<br>
-};<br>
-<br>
 class RuntimeDyld {<br>
   RuntimeDyld(const RuntimeDyld &) LLVM_DELETED_FUNCTION;<br>
   void operator=(const RuntimeDyld &) LLVM_DELETED_FUNCTION;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h?rev=182407&r1=182406&r2=182407&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h?rev=182407&r1=182406&r2=182407&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/SectionMemoryManager.h Tue May 21 14:56:00 2013<br>
@@ -73,17 +73,6 @@ public:<br>
   /// \returns true if an error occurred, false otherwise.<br>
   virtual bool finalizeMemory(std::string *ErrMsg = 0);<br>
<br>
-  void registerEHFrames(StringRef SectionData);<br>
-<br>
-  /// This method returns the address of the specified function. As such it is<br>
-  /// only useful for resolving library symbols, not code generated symbols.<br>
-  ///<br>
-  /// If \p AbortOnFailure is false and no function with the given name is<br>
-  /// found, this function returns a null pointer. Otherwise, it prints a<br>
-  /// message to stderr and aborts.<br>
-  virtual void *getPointerToNamedFunction(const std::string &Name,<br>
-                                          bool AbortOnFailure = true);<br>
-<br>
   /// \brief Invalidate instruction cache for code sections.<br>
   ///<br>
   /// Some platforms with separate data cache and instruction cache require<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/CMakeLists.txt?rev=182407&r1=182406&r2=182407&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/CMakeLists.txt?rev=182407&r1=182406&r2=182407&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/CMakeLists.txt Tue May 21 14:56:00 2013<br>
@@ -3,6 +3,7 @@<br>
 add_llvm_library(LLVMExecutionEngine<br>
   ExecutionEngine.cpp<br>
   ExecutionEngineBindings.cpp<br>
+  RTDyldMemoryManager.cpp<br>
   TargetSelect.cpp<br>
   )<br>
<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp?rev=182407&r1=182406&r2=182407&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp?rev=182407&r1=182406&r2=182407&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/MCJIT/SectionMemoryManager.cpp Tue May 21 14:56:00 2013<br>
@@ -14,7 +14,6 @@<br>
<br>
 #include "llvm/Config/config.h"<br>
 #include "llvm/ExecutionEngine/SectionMemoryManager.h"<br>
-#include "llvm/Support/DynamicLibrary.h"<br>
 #include "llvm/Support/MathExtras.h"<br>
<br>
 #ifdef __linux__<br>
@@ -146,38 +145,6 @@ bool SectionMemoryManager::finalizeMemor<br>
   return false;<br>
 }<br>
<br>
-// Determine whether we can register EH tables.<br>
-#if (defined(__GNUC__) && !defined(__ARM_EABI__) && \<br>
-     !defined(__USING_SJLJ_EXCEPTIONS__))<br>
-#define HAVE_EHTABLE_SUPPORT 1<br>
-#else<br>
-#define HAVE_EHTABLE_SUPPORT 0<br>
-#endif<br>
-<br>
-#if HAVE_EHTABLE_SUPPORT<br>
-extern "C" void __register_frame(void*);<br>
-<br>
-static const char *processFDE(const char *Entry) {<br>
-  const char *P = Entry;<br>
-  uint32_t Length = *((uint32_t*)P);<br>
-  P += 4;<br>
-  uint32_t Offset = *((uint32_t*)P);<br>
-  if (Offset != 0)<br>
-    __register_frame((void*)Entry);<br>
-  return P + Length;<br>
-}<br>
-#endif<br>
-<br>
-void SectionMemoryManager::registerEHFrames(StringRef SectionData) {<br>
-#if HAVE_EHTABLE_SUPPORT<br>
-  const char *P = SectionData.data();<br>
-  const char *End = SectionData.data() + SectionData.size();<br>
-  do  {<br>
-    P = processFDE(P);<br>
-  } while(P != End);<br>
-#endif<br>
-}<br>
-<br>
 error_code SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,<br>
                                                              unsigned Permissions) {<br>
<br>
@@ -199,57 +166,6 @@ void SectionMemoryManager::invalidateIns<br>
                                             CodeMem.AllocatedMem[i].size());<br>
 }<br>
<br>
-static int jit_noop() {<br>
-  return 0;<br>
-}<br>
-<br>
-void *SectionMemoryManager::getPointerToNamedFunction(const std::string &Name,<br>
-                                                       bool AbortOnFailure) {<br>
-#if defined(__linux__)<br>
-  //===--------------------------------------------------------------------===//<br>
-  // Function stubs that are invoked instead of certain library calls<br>
-  //<br>
-  // Force the following functions to be linked in to anything that uses the<br>
-  // JIT. This is a hack designed to work around the all-too-clever Glibc<br>
-  // strategy of making these functions work differently when inlined vs. when<br>
-  // not inlined, and hiding their real definitions in a separate archive file<br>
-  // that the dynamic linker can't see. For more info, search for<br>
-  // 'libc_nonshared.a' on Google, or read <a href="http://llvm.org/PR274" target="_blank">http://llvm.org/PR274</a>.<br>
-  if (Name == "stat") return (void*)(intptr_t)&stat;<br>
-  if (Name == "fstat") return (void*)(intptr_t)&fstat;<br>
-  if (Name == "lstat") return (void*)(intptr_t)&lstat;<br>
-  if (Name == "stat64") return (void*)(intptr_t)&stat64;<br>
-  if (Name == "fstat64") return (void*)(intptr_t)&fstat64;<br>
-  if (Name == "lstat64") return (void*)(intptr_t)&lstat64;<br>
-  if (Name == "atexit") return (void*)(intptr_t)&atexit;<br>
-  if (Name == "mknod") return (void*)(intptr_t)&mknod;<br>
-#endif // __linux__<br>
-<br>
-  // We should not invoke parent's ctors/dtors from generated main()!<br>
-  // On Mingw and Cygwin, the symbol __main is resolved to<br>
-  // callee's(eg. tools/lli) one, to invoke wrong duplicated ctors<br>
-  // (and register wrong callee's dtors with atexit(3)).<br>
-  // We expect ExecutionEngine::runStaticConstructorsDestructors()<br>
-  // is called before ExecutionEngine::runFunctionAsMain() is called.<br>
-  if (Name == "__main") return (void*)(intptr_t)&jit_noop;<br>
-<br>
-  const char *NameStr = Name.c_str();<br>
-  void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);<br>
-  if (Ptr) return Ptr;<br>
-<br>
-  // If it wasn't found and if it starts with an underscore ('_') character,<br>
-  // try again without the underscore.<br>
-  if (NameStr[0] == '_') {<br>
-    Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr+1);<br>
-    if (Ptr) return Ptr;<br>
-  }<br>
-<br>
-  if (AbortOnFailure)<br>
-    report_fatal_error("Program used external function '" + Name +<br>
-                      "' which could not be resolved!");<br>
-  return 0;<br>
-}<br>
-<br>
 SectionMemoryManager::~SectionMemoryManager() {<br>
   for (unsigned i = 0, e = CodeMem.AllocatedMem.size(); i != e; ++i)<br>
     sys::Memory::releaseMappedMemory(CodeMem.AllocatedMem[i]);<br>
<br>
Added: llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp?rev=182407&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp?rev=182407&view=auto</a><br>

==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp (added)<br>
+++ llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp Tue May 21 14:56:00 2013<br>
@@ -0,0 +1,105 @@<br>
+//===-- RTDyldMemoryManager.cpp - Memory manager for MC-JIT -----*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// Implementation of the runtime dynamic memory manager base class.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"<br>
+#include "llvm/Support/DynamicLibrary.h"<br>
+#include "llvm/Support/ErrorHandling.h"<br>
+<br>
+namespace llvm {<br>
+<br>
+RTDyldMemoryManager::~RTDyldMemoryManager() {}<br>
+<br>
+// Determine whether we can register EH tables.<br>
+#if (defined(__GNUC__) && !defined(__ARM_EABI__) && \<br>
+     !defined(__USING_SJLJ_EXCEPTIONS__))<br>
+#define HAVE_EHTABLE_SUPPORT 1<br>
+#else<br>
+#define HAVE_EHTABLE_SUPPORT 0<br>
+#endif<br>
+<br>
+#if HAVE_EHTABLE_SUPPORT<br>
+extern "C" void __register_frame(void*);<br>
+<br>
+static const char *processFDE(const char *Entry) {<br>
+  const char *P = Entry;<br>
+  uint32_t Length = *((uint32_t*)P);<br>
+  P += 4;<br>
+  uint32_t Offset = *((uint32_t*)P);<br>
+  if (Offset != 0)<br>
+    __register_frame((void*)Entry);<br>
+  return P + Length;<br>
+}<br>
+#endif<br>
+<br>
+void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) {<br>
+#if HAVE_EHTABLE_SUPPORT<br>
+  const char *P = SectionData.data();<br>
+  const char *End = SectionData.data() + SectionData.size();<br>
+  do  {<br>
+    P = processFDE(P);<br>
+  } while(P != End);<br>
+#endif<br>
+}<br>
+<br>
+static int jit_noop() {<br>
+  return 0;<br>
+}<br>
+<br>
+void *RTDyldMemoryManager::getPointerToNamedFunction(const std::string &Name,<br>
+                                                     bool AbortOnFailure) {<br>
+#if defined(__linux__)<br>
+  //===--------------------------------------------------------------------===//<br>
+  // Function stubs that are invoked instead of certain library calls<br>
+  //<br>
+  // Force the following functions to be linked in to anything that uses the<br>
+  // JIT. This is a hack designed to work around the all-too-clever Glibc<br>
+  // strategy of making these functions work differently when inlined vs. when<br>
+  // not inlined, and hiding their real definitions in a separate archive file<br>
+  // that the dynamic linker can't see. For more info, search for<br>
+  // 'libc_nonshared.a' on Google, or read <a href="http://llvm.org/PR274" target="_blank">http://llvm.org/PR274</a>.<br>
+  if (Name == "stat") return (void*)(intptr_t)&stat;<br>
+  if (Name == "fstat") return (void*)(intptr_t)&fstat;<br>
+  if (Name == "lstat") return (void*)(intptr_t)&lstat;<br>
+  if (Name == "stat64") return (void*)(intptr_t)&stat64;<br>
+  if (Name == "fstat64") return (void*)(intptr_t)&fstat64;<br>
+  if (Name == "lstat64") return (void*)(intptr_t)&lstat64;<br>
+  if (Name == "atexit") return (void*)(intptr_t)&atexit;<br>
+  if (Name == "mknod") return (void*)(intptr_t)&mknod;<br>
+#endif // __linux__<br>
+<br>
+  // We should not invoke parent's ctors/dtors from generated main()!<br>
+  // On Mingw and Cygwin, the symbol __main is resolved to<br>
+  // callee's(eg. tools/lli) one, to invoke wrong duplicated ctors<br>
+  // (and register wrong callee's dtors with atexit(3)).<br>
+  // We expect ExecutionEngine::runStaticConstructorsDestructors()<br>
+  // is called before ExecutionEngine::runFunctionAsMain() is called.<br>
+  if (Name == "__main") return (void*)(intptr_t)&jit_noop;<br>
+<br>
+  const char *NameStr = Name.c_str();<br>
+  void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);<br>
+  if (Ptr) return Ptr;<br>
+<br>
+  // If it wasn't found and if it starts with an underscore ('_') character,<br>
+  // try again without the underscore.<br>
+  if (NameStr[0] == '_') {<br>
+    Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr+1);<br>
+    if (Ptr) return Ptr;<br>
+  }<br>
+<br>
+  if (AbortOnFailure)<br>
+    report_fatal_error("Program used external function '" + Name +<br>
+                       "' which could not be resolved!");<br>
+  return 0;<br>
+}<br>
+<br>
+} // namespace llvm<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=182407&r1=182406&r2=182407&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=182407&r1=182406&r2=182407&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Tue May 21 14:56:00 2013<br>
@@ -24,8 +24,6 @@ using namespace llvm;<br>
 using namespace llvm::object;<br>
<br>
 // Empty out-of-line virtual destructor as the key function.<br>
-RTDyldMemoryManager::~RTDyldMemoryManager() {}<br>
-void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) {}<br>
 RuntimeDyldImpl::~RuntimeDyldImpl() {}<br>
<br>
 namespace llvm {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div>
</div>