[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