[llvm] r182407 - Put RTDyldMemoryManager into its own file, and make it linked into
Filip Pizlo
fpizlo at apple.com
Tue May 21 13:02:45 PDT 2013
Rolling this out now.
-F
On May 21, 2013, at 1:00 PM, Justin Holewinski <justin.holewinski at gmail.com> wrote:
> 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/bdd10ecf/attachment.html>
More information about the llvm-commits
mailing list