It also doesn't compile:<div><br></div><div><a href="http://lab.llvm.org:8011/builders/llvm-x86_64-linux/builds/4242/steps/compile/logs/stdio">http://lab.llvm.org:8011/builders/llvm-x86_64-linux/builds/4242/steps/compile/logs/stdio</a></div>
<div><br></div><div><pre style="font-family:'Courier New',courier,monotype,monospace;font-size:medium"><span class="stdout">llvm[3]: Compiling RuntimeDyld.cpp for Debug+Asserts build
</span><span class="stderr" style="color:red">In file included from RuntimeDyld.cpp:15:0:
RuntimeDyldImpl.h:32:25: fatal error: ObjectImage.h: No such file or directory
compilation terminated.</span></pre><br><div class="gmail_quote">On Tue, Apr 17, 2012 at 12:21 AM, Gurd, Preston <span dir="ltr"><<a href="mailto:preston.gurd@intel.com">preston.gurd@intel.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Thanks and apologies. We will fix ASAP.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Preston<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Chandler Carruth [mailto:<a href="mailto:chandlerc@google.com" target="_blank">chandlerc@google.com</a>]
<br>
<b>Sent:</b> Monday, April 16, 2012 6:17 PM<br>
<b>To:</b> Gurd, Preston<br>
<b>Cc:</b> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<b>Subject:</b> Re: [llvm-commits] [llvm] r154868 - in /llvm/trunk: include/llvm/Object/ELF.h lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp lib/ExecutionEngine/Runtim<u></u><u></u></span></p>

</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Tue, Apr 17, 2012 at 12:12 AM, Preston Gurd <<a href="mailto:preston.gurd@intel.com" target="_blank">preston.gurd@intel.com</a>> wrote:<u></u><u></u></p>
<p class="MsoNormal">Author: pgurd<br>
Date: Mon Apr 16 17:12:58 2012<br>
New Revision: 154868<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=154868&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=154868&view=rev</a><br>
Log:<br>
Implement GDB integration for source level debugging of code JITed using<br>
the MCJIT execution engine.<br>
<br>
The GDB JIT debugging integration support works by registering a loaded<br>
object image with a pre-defined function that GDB will monitor if GDB<br>
is attached. GDB integration support is implemented for ELF only at this<br>
time. This integration requires GDB version 7.0 or newer.<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">This broke all the CMake builds:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><a href="http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/1496/steps/build_llvm/logs/stdio" target="_blank">http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/1496/steps/build_llvm/logs/stdio</a><u></u><u></u></p>

</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
Patch by Andy Kaylor!<br>
<br>
<br>
<br>
Modified:<br>
   llvm/trunk/include/llvm/Object/ELF.h<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp<br>
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h<br>
   llvm/trunk/lib/Object/ELFObjectFile.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Object/ELF.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Object/ELF.h (original)<br>
+++ llvm/trunk/include/llvm/Object/ELF.h Mon Apr 16 17:12:58 2012<br>
@@ -33,6 +33,15 @@<br>
 namespace llvm {<br>
 namespace object {<br>
<br>
+// Subclasses of ELFObjectFile may need this for template instantiation<br>
+inline std::pair<unsigned char, unsigned char><br>
+getElfArchType(MemoryBuffer *Object) {<br>
+  if (Object->getBufferSize() < ELF::EI_NIDENT)<br>
+    return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);<br>
+  return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]<br>
+                       , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);<br>
+}<br>
+<br>
 // Templates to choose Elf_Addr and Elf_Off depending on is64Bits.<br>
 template<support::endianness target_endianness><br>
 struct ELFDataTypeTypedefHelperCommon {<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/CMakeLists.txt Mon Apr 16 17:12:58 2012<br>
@@ -1,5 +1,6 @@<br>
 add_llvm_library(LLVMRuntimeDyld<br>
+  GDBRegistrar.cpp<br>
  RuntimeDyld.cpp<br>
-  RuntimeDyldMachO.cpp<br>
  RuntimeDyldELF.cpp<br>
+  RuntimeDyldMachO.cpp<br>
  )<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=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Apr 16 17:12:58 2012<br>
@@ -59,11 +59,17 @@<br>
  llvm_unreachable("Attempting to remap address of unknown section!");<br>
 }<br>
<br>
+// Subclasses can implement this method to create specialized image instances<br>
+// The caller owns the the pointer that is returned.<br>
+ObjectImage *RuntimeDyldImpl::createObjectImage(const MemoryBuffer *InputBuffer) {<br>
+  ObjectFile *ObjFile = ObjectFile::createObjectFile(const_cast<MemoryBuffer*><br>
+                                                                 (InputBuffer));<br>
+  ObjectImage *Obj = new ObjectImage(ObjFile);<br>
+  return Obj;<br>
+}<br>
+<br>
 bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) {<br>
-  // FIXME: ObjectFile don't modify MemoryBuffer.<br>
-  //        It should use const MemoryBuffer as parameter.<br>
-  OwningPtr<ObjectFile> obj(ObjectFile::createObjectFile(<br>
-                                       const_cast<MemoryBuffer*>(InputBuffer)));<br>
+  OwningPtr<ObjectImage> obj(createObjectImage(InputBuffer));<br>
  if (!obj)<br>
    report_fatal_error("Unable to create object image from memory buffer!");<br>
<br>
@@ -110,7 +116,8 @@<br>
                                (uintptr_t)FileOffset;<br>
        uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)sData.begin());<br>
        unsigned SectionID =<br>
-          findOrEmitSection(*si,<br>
+          findOrEmitSection(*obj,<br>
+                            *si,<br>
                            SymType == object::SymbolRef::ST_Function,<br>
                            LocalSections);<br>
        bool isGlobal = flags & SymbolRef::SF_Global;<br>
@@ -128,7 +135,7 @@<br>
<br>
  // Allocate common symbols<br>
  if (CommonSize != 0)<br>
-    emitCommonSymbols(CommonSymbols, CommonSize, LocalSymbols);<br>
+    emitCommonSymbols(*obj, CommonSymbols, CommonSize, LocalSymbols);<br>
<br>
  // Parse and proccess relocations<br>
  DEBUG(dbgs() << "Parse relocations:\n");<br>
@@ -145,7 +152,7 @@<br>
<br>
      // If it's first relocation in this section, find its SectionID<br>
      if (isFirstRelocation) {<br>
-        SectionID = findOrEmitSection(*si, true, LocalSections);<br>
+        SectionID = findOrEmitSection(*obj, *si, true, LocalSections);<br>
        DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n");<br>
        isFirstRelocation = false;<br>
      }<br>
@@ -164,10 +171,14 @@<br>
      processRelocationRef(RI, *obj, LocalSections, LocalSymbols, Stubs);<br>
    }<br>
  }<br>
+<br>
+  handleObjectLoaded(obj.take());<br>
+<br>
  return false;<br>
 }<br>
<br>
-unsigned RuntimeDyldImpl::emitCommonSymbols(const CommonSymbolMap &Map,<br>
+unsigned RuntimeDyldImpl::emitCommonSymbols(ObjectImage &Obj,<br>
+                                            const CommonSymbolMap &Map,<br>
                                            uint64_t TotalSize,<br>
                                            LocalSymbolMap &LocalSymbols) {<br>
  // Allocate memory for the section<br>
@@ -191,6 +202,7 @@<br>
    uint64_t Size = it->second;<br>
    StringRef Name;<br>
    it->first.getName(Name);<br>
+    Obj.updateSymbolAddress(it->first, (uint64_t)Addr);<br>
    LocalSymbols[Name.data()] = SymbolLoc(SectionID, Offset);<br>
    Offset += Size;<br>
    Addr += Size;<br>
@@ -199,7 +211,8 @@<br>
  return SectionID;<br>
 }<br>
<br>
-unsigned RuntimeDyldImpl::emitSection(const SectionRef &Section,<br>
+unsigned RuntimeDyldImpl::emitSection(ObjectImage &Obj,<br>
+                                      const SectionRef &Section,<br>
                                      bool IsCode) {<br>
<br>
  unsigned StubBufSize = 0,<br>
@@ -257,6 +270,7 @@<br>
                 << " StubBufSize: " << StubBufSize<br>
                 << " Allocate: " << Allocate<br>
                 << "\n");<br>
+    Obj.updateSectionAddress(Section, (uint64_t)Addr);<br>
  }<br>
  else {<br>
    // Even if we didn't load the section, we need to record an entry for it<br>
@@ -277,7 +291,8 @@<br>
  return SectionID;<br>
 }<br>
<br>
-unsigned RuntimeDyldImpl::findOrEmitSection(const SectionRef &Section,<br>
+unsigned RuntimeDyldImpl::findOrEmitSection(ObjectImage &Obj,<br>
+                                            const SectionRef &Section,<br>
                                            bool IsCode,<br>
                                            ObjSectionToIDMap &LocalSections) {<br>
<br>
@@ -286,7 +301,7 @@<br>
  if (i != LocalSections.end())<br>
    SectionID = i->second;<br>
  else {<br>
-    SectionID = emitSection(Section, IsCode);<br>
+    SectionID = emitSection(Obj, Section, IsCode);<br>
    LocalSections[Section] = SectionID;<br>
  }<br>
  return SectionID;<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Mon Apr 16 17:12:58 2012<br>
@@ -20,11 +20,176 @@<br>
 #include "llvm/Object/ObjectFile.h"<br>
 #include "llvm/Support/ELF.h"<br>
 #include "llvm/ADT/Triple.h"<br>
+#include "llvm/Object/ELF.h"<br>
+#include "JITRegistrar.h"<br>
 using namespace llvm;<br>
 using namespace llvm::object;<br>
<br>
+namespace {<br>
+<br>
+template<support::endianness target_endianness, bool is64Bits><br>
+class DyldELFObject : public ELFObjectFile<target_endianness, is64Bits> {<br>
+  LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)<br>
+<br>
+  typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr;<br>
+  typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym;<br>
+  typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel;<br>
+  typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela;<br>
+<br>
+  typedef typename ELFObjectFile<target_endianness, is64Bits>::<br>
+    Elf_Ehdr Elf_Ehdr;<br>
+<br>
+  typedef typename ELFDataTypeTypedefHelper<<br>
+          target_endianness, is64Bits>::value_type addr_type;<br>
+<br>
+protected:<br>
+  // This duplicates the 'Data' member in the 'Binary' base class<br>
+  // but it is necessary to workaround a bug in gcc 4.2<br>
+  MemoryBuffer *InputData;<br>
+<br>
+public:<br>
+  DyldELFObject(MemoryBuffer *Object, error_code &ec);<br>
+<br>
+  void updateSectionAddress(const SectionRef &Sec, uint64_t Addr);<br>
+  void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr);<br>
+<br>
+  const MemoryBuffer& getBuffer() const { return *InputData; }<br>
+<br>
+  // Methods for type inquiry through isa, cast, and dyn_cast<br>
+  static inline bool classof(const Binary *v) {<br>
+    return (isa<ELFObjectFile<target_endianness, is64Bits> >(v)<br>
+            && classof(cast<ELFObjectFile<target_endianness, is64Bits> >(v)));<br>
+  }<br>
+  static inline bool classof(<br>
+      const ELFObjectFile<target_endianness, is64Bits> *v) {<br>
+    return v->isDyldType();<br>
+  }<br>
+  static inline bool classof(const DyldELFObject *v) {<br>
+    return true;<br>
+  }<br>
+};<br>
+<br>
+template<support::endianness target_endianness, bool is64Bits><br>
+class ELFObjectImage : public ObjectImage {<br>
+  protected:<br>
+    DyldELFObject<target_endianness, is64Bits> *DyldObj;<br>
+    bool Registered;<br>
+<br>
+  public:<br>
+    ELFObjectImage(DyldELFObject<target_endianness, is64Bits> *Obj)<br>
+    : ObjectImage(Obj),<br>
+      DyldObj(Obj),<br>
+      Registered(false) {}<br>
+<br>
+    virtual ~ELFObjectImage() {<br>
+      if (Registered)<br>
+        deregisterWithDebugger();<br>
+    }<br>
+<br>
+    // Subclasses can override these methods to update the image with loaded<br>
+    // addresses for sections and common symbols<br>
+    virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr)<br>
+    {<br>
+      DyldObj->updateSectionAddress(Sec, Addr);<br>
+    }<br>
+<br>
+    virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr)<br>
+    {<br>
+      DyldObj->updateSymbolAddress(Sym, Addr);<br>
+    }<br>
+<br>
+    virtual void registerWithDebugger()<br>
+    {<br>
+      JITRegistrar::getGDBRegistrar().registerObject(DyldObj->getBuffer());<br>
+      Registered = true;<br>
+    }<br>
+    virtual void deregisterWithDebugger()<br>
+    {<br>
+      JITRegistrar::getGDBRegistrar().deregisterObject(DyldObj->getBuffer());<br>
+    }<br>
+};<br>
+<br>
+template<support::endianness target_endianness, bool is64Bits><br>
+DyldELFObject<target_endianness, is64Bits>::DyldELFObject(MemoryBuffer *Object,<br>
+                                                          error_code &ec)<br>
+  : ELFObjectFile<target_endianness, is64Bits>(Object, ec),<br>
+    InputData(Object) {<br>
+  this->isDyldELFObject = true;<br>
+}<br>
+<br>
+template<support::endianness target_endianness, bool is64Bits><br>
+void DyldELFObject<target_endianness, is64Bits>::updateSectionAddress(<br>
+                                                       const SectionRef &Sec,<br>
+                                                       uint64_t Addr) {<br>
+  DataRefImpl ShdrRef = Sec.getRawDataRefImpl();<br>
+  Elf_Shdr *shdr = const_cast<Elf_Shdr*>(<br>
+                          reinterpret_cast<const Elf_Shdr *>(ShdrRef.p));<br>
+<br>
+  // This assumes the address passed in matches the target address bitness<br>
+  // The template-based type cast handles everything else.<br>
+  shdr->sh_addr = static_cast<addr_type>(Addr);<br>
+}<br>
+<br>
+template<support::endianness target_endianness, bool is64Bits><br>
+void DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress(<br>
+                                                       const SymbolRef &SymRef,<br>
+                                                       uint64_t Addr) {<br>
+<br>
+  Elf_Sym *sym = const_cast<Elf_Sym*>(<br>
+                                 ELFObjectFile<target_endianness, is64Bits>::<br>
+                                   getSymbol(SymRef.getRawDataRefImpl()));<br>
+<br>
+  // This assumes the address passed in matches the target address bitness<br>
+  // The template-based type cast handles everything else.<br>
+  sym->st_value = static_cast<addr_type>(Addr);<br>
+}<br>
+<br>
+} // namespace<br>
+<br>
+<br>
 namespace llvm {<br>
<br>
+ObjectImage *RuntimeDyldELF::createObjectImage(<br>
+                                         const MemoryBuffer *ConstInputBuffer) {<br>
+  MemoryBuffer *InputBuffer = const_cast<MemoryBuffer*>(ConstInputBuffer);<br>
+  std::pair<unsigned char, unsigned char> Ident = getElfArchType(InputBuffer);<br>
+  error_code ec;<br>
+<br>
+  if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) {<br>
+    DyldELFObject<support::little, false> *Obj =<br>
+           new DyldELFObject<support::little, false>(InputBuffer, ec);<br>
+    return new ELFObjectImage<support::little, false>(Obj);<br>
+  }<br>
+  else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) {<br>
+    DyldELFObject<support::big, false> *Obj =<br>
+           new DyldELFObject<support::big, false>(InputBuffer, ec);<br>
+    return new ELFObjectImage<support::big, false>(Obj);<br>
+  }<br>
+  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) {<br>
+    DyldELFObject<support::big, true> *Obj =<br>
+           new DyldELFObject<support::big, true>(InputBuffer, ec);<br>
+    return new ELFObjectImage<support::big, true>(Obj);<br>
+  }<br>
+  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {<br>
+    DyldELFObject<support::little, true> *Obj =<br>
+           new DyldELFObject<support::little, true>(InputBuffer, ec);<br>
+    return new ELFObjectImage<support::little, true>(Obj);<br>
+  }<br>
+  else<br>
+    llvm_unreachable("Unexpected ELF format");<br>
+}<br>
+<br>
+void RuntimeDyldELF::handleObjectLoaded(ObjectImage *Obj)<br>
+{<br>
+  Obj->registerWithDebugger();<br>
+  // Save the loaded object.  It will deregister itself when deleted<br>
+  LoadedObject = Obj;<br>
+}<br>
+<br>
+RuntimeDyldELF::~RuntimeDyldELF() {<br>
+  if (LoadedObject)<br>
+    delete LoadedObject;<br>
+}<br>
<br>
 void RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress,<br>
                                             uint64_t FinalAddress,<br>
@@ -167,7 +332,7 @@<br>
 }<br>
<br>
 void RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel,<br>
-                                          const ObjectFile &Obj,<br>
+                                          ObjectImage &Obj,<br>
                                          ObjSectionToIDMap &ObjSectionToID,<br>
                                          LocalSymbolMap &Symbols,<br>
                                          StubMap &Stubs) {<br>
@@ -206,7 +371,7 @@<br>
          if (si == Obj.end_sections())<br>
            llvm_unreachable("Symbol section not found, bad object file format!");<br>
          DEBUG(dbgs() << "\t\tThis is section symbol\n");<br>
-          Value.SectionID = findOrEmitSection((*si), true, ObjSectionToID);<br>
+          Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID);<br>
          Value.Addend = Addend;<br>
          break;<br>
        }<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h Mon Apr 16 17:12:58 2012<br>
@@ -22,6 +22,8 @@<br>
 namespace llvm {<br>
 class RuntimeDyldELF : public RuntimeDyldImpl {<br>
 protected:<br>
+  ObjectImage *LoadedObject;<br>
+<br>
  void resolveX86_64Relocation(uint8_t *LocalAddress,<br>
                               uint64_t FinalAddress,<br>
                               uint64_t Value,<br>
@@ -47,12 +49,18 @@<br>
                                 int64_t Addend);<br>
<br>
  virtual void processRelocationRef(const ObjRelocationInfo &Rel,<br>
-                                    const ObjectFile &Obj,<br>
+                                    ObjectImage &Obj,<br>
                                    ObjSectionToIDMap &ObjSectionToID,<br>
                                    LocalSymbolMap &Symbols, StubMap &Stubs);<br>
<br>
+  virtual ObjectImage *createObjectImage(const MemoryBuffer *InputBuffer);<br>
+  virtual void handleObjectLoaded(ObjectImage *Obj);<br>
+<br>
 public:<br>
-  RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}<br>
+  RuntimeDyldELF(RTDyldMemoryManager *mm)<br>
+      : RuntimeDyldImpl(mm), LoadedObject(0) {}<br>
+<br>
+  virtual ~RuntimeDyldELF();<br>
<br>
  bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const;<br>
 };<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Mon Apr 16 17:12:58 2012<br>
@@ -29,6 +29,7 @@<br>
 #include "llvm/ADT/Triple.h"<br>
 #include <map><br>
 #include "llvm/Support/Format.h"<br>
+#include "ObjectImage.h"<br>
<br>
 using namespace llvm;<br>
 using namespace llvm::object;<br>
@@ -154,7 +155,8 @@<br>
<br>
  /// \brief Emits a section containing common symbols.<br>
  /// \return SectionID.<br>
-  unsigned emitCommonSymbols(const CommonSymbolMap &Map,<br>
+  unsigned emitCommonSymbols(ObjectImage &Obj,<br>
+                             const CommonSymbolMap &Map,<br>
                             uint64_t TotalSize,<br>
                             LocalSymbolMap &Symbols);<br>
<br>
@@ -162,14 +164,18 @@<br>
  /// \param IsCode if it's true then allocateCodeSection() will be<br>
  ///        used for emmits, else allocateDataSection() will be used.<br>
  /// \return SectionID.<br>
-  unsigned emitSection(const SectionRef &Section, bool IsCode);<br>
+  unsigned emitSection(ObjectImage &Obj,<br>
+                       const SectionRef &Section,<br>
+                       bool IsCode);<br>
<br>
  /// \brief Find Section in LocalSections. If the secton is not found - emit<br>
  ///        it and store in LocalSections.<br>
  /// \param IsCode if it's true then allocateCodeSection() will be<br>
  ///        used for emmits, else allocateDataSection() will be used.<br>
  /// \return SectionID.<br>
-  unsigned findOrEmitSection(const SectionRef &Section, bool IsCode,<br>
+  unsigned findOrEmitSection(ObjectImage &Obj,<br>
+                             const SectionRef &Section,<br>
+                             bool IsCode,<br>
                             ObjSectionToIDMap &LocalSections);<br>
<br>
  /// \brief If Value.SymbolName is NULL then store relocation to the<br>
@@ -200,11 +206,18 @@<br>
  /// \brief Parses the object file relocation and store it to Relocations<br>
  ///        or SymbolRelocations. Its depend from object file type.<br>
  virtual void processRelocationRef(const ObjRelocationInfo &Rel,<br>
-                                    const ObjectFile &Obj,<br>
+                                    ObjectImage &Obj,<br>
                                    ObjSectionToIDMap &ObjSectionToID,<br>
                                    LocalSymbolMap &Symbols, StubMap &Stubs) = 0;<br>
<br>
  void resolveSymbols();<br>
+  virtual ObjectImage *createObjectImage(const MemoryBuffer *InputBuffer);<br>
+  virtual void handleObjectLoaded(ObjectImage *Obj)<br>
+  {<br>
+    // Subclasses may choose to retain this image if they have a use for it<br>
+    delete Obj;<br>
+  }<br>
+<br>
 public:<br>
  RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}<br>
<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp Mon Apr 16 17:12:58 2012<br>
@@ -205,7 +205,7 @@<br>
 }<br>
<br>
 void RuntimeDyldMachO::processRelocationRef(const ObjRelocationInfo &Rel,<br>
-                                            const ObjectFile &Obj,<br>
+                                            ObjectImage &Obj,<br>
                                            ObjSectionToIDMap &ObjSectionToID,<br>
                                            LocalSymbolMap &Symbols,<br>
                                            StubMap &Stubs) {<br>
@@ -246,7 +246,7 @@<br>
        break;<br>
    }<br>
    assert(si != se && "No section containing relocation!");<br>
-    Value.SectionID = findOrEmitSection(*si, true, ObjSectionToID);<br>
+    Value.SectionID = findOrEmitSection(Obj, *si, true, ObjSectionToID);<br>
    Value.Addend = *(const intptr_t *)Target;<br>
    if (Value.Addend) {<br>
      // The MachO addend is offset from the current section, we need set it<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h Mon Apr 16 17:12:58 2012<br>
@@ -49,7 +49,7 @@<br>
                            int64_t Addend);<br>
<br>
  virtual void processRelocationRef(const ObjRelocationInfo &Rel,<br>
-                                    const ObjectFile &Obj,<br>
+                                    ObjectImage &Obj,<br>
                                    ObjSectionToIDMap &ObjSectionToID,<br>
                                    LocalSymbolMap &Symbols, StubMap &Stubs);<br>
<br>
@@ -59,7 +59,7 @@<br>
                                 uint64_t Value,<br>
                                 uint32_t Type,<br>
                                 int64_t Addend);<br>
-<br>
+<br>
  RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}<br>
<br>
  bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const;<br>
<br>
Modified: llvm/trunk/lib/Object/ELFObjectFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFObjectFile.cpp?rev=154868&r1=154867&r2=154868&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFObjectFile.cpp?rev=154868&r1=154867&r2=154868&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Object/ELFObjectFile.cpp (original)<br>
+++ llvm/trunk/lib/Object/ELFObjectFile.cpp Mon Apr 16 17:12:58 2012<br>
@@ -17,16 +17,6 @@<br>
<br>
 using namespace object;<br>
<br>
-namespace {<br>
-  std::pair<unsigned char, unsigned char><br>
-  getElfArchType(MemoryBuffer *Object) {<br>
-    if (Object->getBufferSize() < ELF::EI_NIDENT)<br>
-      return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);<br>
-    return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]<br>
-                         , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);<br>
-  }<br>
-}<br>
-<br>
 // Creates an in-memory object-file by default: createELFObjectFile(Buffer)<br>
 ObjectFile *ObjectFile::createELFObjectFile(MemoryBuffer *Object) {<br>
  std::pair<unsigned char, unsigned char> Ident = getElfArchType(Object);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div></div></div>
</div>

</blockquote></div><br></div>