[llvm-commits] [llvm] r154610 - in /llvm/trunk: include/llvm/Object/ lib/ExecutionEngine/MCJIT/ lib/ExecutionEngine/RuntimeDyld/ lib/Object/ test/ExecutionEngine/

Kaylor, Andrew andrew.kaylor at intel.com
Fri Apr 13 09:08:22 PDT 2012


Sorry about that.  It was an artifact of splitting up a group of changes into multiple commits for review purposes.  The patch I submitted for review yesterday makes use of that function outside of ELFObjectFile.  I guess I missed the fact that the header file change made it into the earlier commit.

The change you made to remove it from ELF.h is good for now.  I'll add it back in there and remove it from ELFObjectFile.cpp when the new patch is ready to be committed.

-Andy

From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Craig Topper
Sent: Thursday, April 12, 2012 10:49 PM
To: Gurd, Preston
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm-commits] [llvm] r154610 - in /llvm/trunk: include/llvm/Object/ lib/ExecutionEngine/MCJIT/ lib/ExecutionEngine/RuntimeDyld/ lib/Object/ test/ExecutionEngine/

This seems to have caused two copies of getElfArchType to appear in the tree. One in ELF.h and one in lib/Object/ELFObjectWriter.cpp. The code in that file is now finding the copy in ELF.h and leaving the copy in the anonymous namespace in ELFObjectWriter unused leading to a warning.
On Thu, Apr 12, 2012 at 1:13 PM, Preston Gurd <preston.gurd at intel.com<mailto:preston.gurd at intel.com>> wrote:
Author: pgurd
Date: Thu Apr 12 15:13:57 2012
New Revision: 154610

URL: http://llvm.org/viewvc/llvm-project?rev=154610&view=rev
Log:
This patch improves the MCJIT runtime dynamic loader by adding new handling
of zero-initialized sections, virtual sections and common symbols
and preventing the loading of sections which are not required for
execution such as debug information.

Patch by Andy Kaylor!


Modified:
   llvm/trunk/include/llvm/Object/COFF.h
   llvm/trunk/include/llvm/Object/ELF.h
   llvm/trunk/include/llvm/Object/MachO.h
   llvm/trunk/include/llvm/Object/ObjectFile.h
   llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
   llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
   llvm/trunk/lib/Object/COFFObjectFile.cpp
   llvm/trunk/lib/Object/MachOObjectFile.cpp
   llvm/trunk/test/ExecutionEngine/2002-12-16-ArgTest.ll
   llvm/trunk/test/ExecutionEngine/2003-01-04-ArgumentBug.ll
   llvm/trunk/test/ExecutionEngine/2003-01-04-LoopTest.ll
   llvm/trunk/test/ExecutionEngine/2003-05-06-LivenessClobber.ll
   llvm/trunk/test/ExecutionEngine/2003-05-07-ArgumentTest.ll
   llvm/trunk/test/ExecutionEngine/2003-08-21-EnvironmentTest.ll
   llvm/trunk/test/ExecutionEngine/2005-12-02-TailCallBug.ll
   llvm/trunk/test/ExecutionEngine/hello.ll
   llvm/trunk/test/ExecutionEngine/hello2.ll
   llvm/trunk/test/ExecutionEngine/stubs.ll
   llvm/trunk/test/ExecutionEngine/test-call-no-external-funcs.ll
   llvm/trunk/test/ExecutionEngine/test-call.ll
   llvm/trunk/test/ExecutionEngine/test-common-symbols.ll
   llvm/trunk/test/ExecutionEngine/test-fp-no-external-funcs.ll
   llvm/trunk/test/ExecutionEngine/test-fp.ll
   llvm/trunk/test/ExecutionEngine/test-global-init-nonzero.ll
   llvm/trunk/test/ExecutionEngine/test-global.ll
   llvm/trunk/test/ExecutionEngine/test-loadstore.ll

Modified: llvm/trunk/include/llvm/Object/COFF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/COFF.h (original)
+++ llvm/trunk/include/llvm/Object/COFF.h Thu Apr 12 15:13:57 2012
@@ -126,6 +126,10 @@
  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
+                                                   bool &Res) const;
  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
                                           bool &Result) const;
  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;

Modified: llvm/trunk/include/llvm/Object/ELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ELF.h?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ELF.h (original)
+++ llvm/trunk/include/llvm/Object/ELF.h Thu Apr 12 15:13:57 2012
@@ -33,6 +33,15 @@
 namespace llvm {
 namespace object {

+// Subclasses of ELFObjectFile may need this for template instantiation
+inline std::pair<unsigned char, unsigned char>
+getElfArchType(MemoryBuffer *Object) {
+  if (Object->getBufferSize() < ELF::EI_NIDENT)
+    return std::make_pair((uint8_t)ELF::ELFCLASSNONE,(uint8_t)ELF::ELFDATANONE);
+  return std::make_pair( (uint8_t)Object->getBufferStart()[ELF::EI_CLASS]
+                        , (uint8_t)Object->getBufferStart()[ELF::EI_DATA]);
+}
+
 // Templates to choose Elf_Addr and Elf_Off depending on is64Bits.
 template<support::endianness target_endianness>
 struct ELFDataTypeTypedefHelperCommon {
@@ -540,6 +549,10 @@
  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
+                                                   bool &Res) const;
+  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
                                           bool &Result) const;
  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;
@@ -1094,6 +1107,43 @@

 template<support::endianness target_endianness, bool is64Bits>
 error_code ELFObjectFile<target_endianness, is64Bits>
+                        ::isSectionRequiredForExecution(DataRefImpl Sec,
+                                                        bool &Result) const {
+  const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
+  if (sec->sh_flags & ELF::SHF_ALLOC)
+    Result = true;
+  else
+    Result = false;
+  return object_error::success;
+}
+
+template<support::endianness target_endianness, bool is64Bits>
+error_code ELFObjectFile<target_endianness, is64Bits>
+                        ::isSectionVirtual(DataRefImpl Sec,
+                                           bool &Result) const {
+  const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
+  if (sec->sh_type == ELF::SHT_NOBITS)
+    Result = true;
+  else
+    Result = false;
+  return object_error::success;
+}
+
+template<support::endianness target_endianness, bool is64Bits>
+error_code ELFObjectFile<target_endianness, is64Bits>::isSectionZeroInit(DataRefImpl Sec,
+                                            bool &Result) const {
+  const Elf_Shdr *sec = reinterpret_cast<const Elf_Shdr *>(Sec.p);
+  // For ELF, all zero-init sections are virtual (that is, they occupy no space
+  //   in the object image) and vice versa.
+  if (sec->sh_flags & ELF::SHT_NOBITS)
+    Result = true;
+  else
+    Result = false;
+  return object_error::success;
+}
+
+template<support::endianness target_endianness, bool is64Bits>
+error_code ELFObjectFile<target_endianness, is64Bits>
                          ::sectionContainsSymbol(DataRefImpl Sec,
                                                  DataRefImpl Symb,
                                                  bool &Result) const {

Modified: llvm/trunk/include/llvm/Object/MachO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/MachO.h (original)
+++ llvm/trunk/include/llvm/Object/MachO.h Thu Apr 12 15:13:57 2012
@@ -72,6 +72,10 @@
  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
+                                                   bool &Res) const;
+  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
+  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
  virtual error_code sectionContainsSymbol(DataRefImpl DRI, DataRefImpl S,
                                           bool &Result) const;
  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const;

Modified: llvm/trunk/include/llvm/Object/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/ObjectFile.h?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/ObjectFile.h (original)
+++ llvm/trunk/include/llvm/Object/ObjectFile.h Thu Apr 12 15:13:57 2012
@@ -158,11 +158,16 @@
  error_code isText(bool &Result) const;
  error_code isData(bool &Result) const;
  error_code isBSS(bool &Result) const;
+  error_code isRequiredForExecution(bool &Result) const;
+  error_code isVirtual(bool &Result) const;
+  error_code isZeroInit(bool &Result) const;

  error_code containsSymbol(SymbolRef S, bool &Result) const;

  relocation_iterator begin_relocations() const;
  relocation_iterator end_relocations() const;
+
+  DataRefImpl getRawDataRefImpl() const;
 };
 typedef content_iterator<SectionRef> section_iterator;

@@ -217,6 +222,9 @@
  /// Get symbol flags (bitwise OR of SymbolRef::Flags)
  error_code getFlags(uint32_t &Result) const;

+  /// @brief Return true for common symbols such as uninitialized globals
+  error_code isCommon(bool &Result) const;
+
  /// @brief Get section this symbol is defined in reference to. Result is
  /// end_sections() if it is undefined or is an absolute symbol.
  error_code getSection(section_iterator &Result) const;
@@ -299,6 +307,11 @@
  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const = 0;
  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const = 0;
  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const = 0;
+  virtual error_code isSectionRequiredForExecution(DataRefImpl Sec,
+                                                   bool &Res) const = 0;
+  // A section is 'virtual' if its contents aren't present in the object image.
+  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const = 0;
+  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const = 0;
  virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb,
                                           bool &Result) const = 0;
  virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const = 0;
@@ -481,6 +494,18 @@
  return OwningObject->isSectionBSS(SectionPimpl, Result);
 }

+inline error_code SectionRef::isRequiredForExecution(bool &Result) const {
+  return OwningObject->isSectionRequiredForExecution(SectionPimpl, Result);
+}
+
+inline error_code SectionRef::isVirtual(bool &Result) const {
+  return OwningObject->isSectionVirtual(SectionPimpl, Result);
+}
+
+inline error_code SectionRef::isZeroInit(bool &Result) const {
+  return OwningObject->isSectionZeroInit(SectionPimpl, Result);
+}
+
 inline error_code SectionRef::containsSymbol(SymbolRef S, bool &Result) const {
  return OwningObject->sectionContainsSymbol(SectionPimpl, S.SymbolPimpl,
                                             Result);
@@ -494,6 +519,9 @@
  return OwningObject->getSectionRelEnd(SectionPimpl);
 }

+inline DataRefImpl SectionRef::getRawDataRefImpl() const {
+  return SectionPimpl;
+}

 /// RelocationRef
 inline RelocationRef::RelocationRef(DataRefImpl RelocationP,

Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Thu Apr 12 15:13:57 2012
@@ -74,9 +74,9 @@
  OS.flush();

  // Load the object into the dynamic linker.
-  // FIXME: It would be nice to avoid making yet another copy.
-  MemoryBuffer *MB = MemoryBuffer::getMemBufferCopy(StringRef(Buffer.data(),
-                                                              Buffer.size()));
+  MemoryBuffer *MB = MemoryBuffer::getMemBuffer(StringRef(Buffer.data(),
+                                                          Buffer.size()),
+                                                "", false);
  if (Dyld.loadObject(MB))
    report_fatal_error(Dyld.getErrorString());
  // Resolve any relocations.

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Thu Apr 12 15:13:57 2012
@@ -36,10 +36,9 @@
  }
 } // end anonymous namespace

-
 // Resolve the relocations for all symbols we currently know about.
 void RuntimeDyldImpl::resolveRelocations() {
-  // First, resolve relocations assotiated with external symbols.
+  // First, resolve relocations associated with external symbols.
  resolveSymbols();

  // Just iterate over the sections we have and resolve all the relocations
@@ -63,14 +62,18 @@
 bool RuntimeDyldImpl::loadObject(const MemoryBuffer *InputBuffer) {
  // FIXME: ObjectFile don't modify MemoryBuffer.
  //        It should use const MemoryBuffer as parameter.
-  ObjectFile *obj
-    = ObjectFile::createObjectFile(const_cast<MemoryBuffer*>(InputBuffer));
+  OwningPtr<ObjectFile> obj(ObjectFile::createObjectFile(
+                                       const_cast<MemoryBuffer*>(InputBuffer)));
+  if (!obj)
+    report_fatal_error("Unable to create object image from memory buffer!");

  Arch = (Triple::ArchType)obj->getArch();

  LocalSymbolMap LocalSymbols;     // Functions and data symbols from the
                                   // object file.
  ObjSectionToIDMap LocalSections; // Used sections from the object file
+  CommonSymbolMap   CommonSymbols; // Common symbols requiring allocation
+  uint64_t          CommonSize = 0;

  error_code err;
  // Parse symbols
@@ -83,36 +86,50 @@
    Check(i->getType(SymType));
    Check(i->getName(Name));

-    if (SymType == object::SymbolRef::ST_Function ||
-        SymType == object::SymbolRef::ST_Data) {
-      uint64_t FileOffset;
-      uint32_t flags;
-      StringRef sData;
-      section_iterator si = obj->end_sections();
-      Check(i->getFileOffset(FileOffset));
-      Check(i->getFlags(flags));
-      Check(i->getSection(si));
-      if (si == obj->end_sections()) continue;
-      Check(si->getContents(sData));
-      const uint8_t* SymPtr = (const uint8_t*)InputBuffer->getBufferStart() +
-                              (uintptr_t)FileOffset;
-      uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)sData.begin());
-      unsigned SectionID
-        = findOrEmitSection(*si,
-                          SymType == object::SymbolRef::ST_Function,
-                          LocalSections);
-      bool isGlobal = flags & SymbolRef::SF_Global;
-      LocalSymbols[Name.data()] = SymbolLoc(SectionID, SectOffset);
-      DEBUG(dbgs() << "\tFileOffset: " << format("%p", (uintptr_t)FileOffset)
-                   << " flags: " << flags
-                   << " SID: " << SectionID
-                   << " Offset: " << format("%p", SectOffset));
-      if (isGlobal)
-        SymbolTable[Name] = SymbolLoc(SectionID, SectOffset);
+    uint32_t flags;
+    Check(i->getFlags(flags));
+
+    bool isCommon = flags & SymbolRef::SF_Common;
+    if (isCommon) {
+      // Add the common symbols to a list.  We'll allocate them all below.
+      uint64_t Size = 0;
+      Check(i->getSize(Size));
+      CommonSize += Size;
+      CommonSymbols[*i] = Size;
+    } else {
+      if (SymType == object::SymbolRef::ST_Function ||
+          SymType == object::SymbolRef::ST_Data) {
+        uint64_t FileOffset;
+        StringRef sData;
+        section_iterator si = obj->end_sections();
+        Check(i->getFileOffset(FileOffset));
+        Check(i->getSection(si));
+        if (si == obj->end_sections()) continue;
+        Check(si->getContents(sData));
+        const uint8_t* SymPtr = (const uint8_t*)InputBuffer->getBufferStart() +
+                                (uintptr_t)FileOffset;
+        uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)sData.begin());
+        unsigned SectionID =
+          findOrEmitSection(*si,
+                            SymType == object::SymbolRef::ST_Function,
+                            LocalSections);
+        bool isGlobal = flags & SymbolRef::SF_Global;
+        LocalSymbols[Name.data()] = SymbolLoc(SectionID, SectOffset);
+        DEBUG(dbgs() << "\tFileOffset: " << format("%p", (uintptr_t)FileOffset)
+                     << " flags: " << flags
+                     << " SID: " << SectionID
+                     << " Offset: " << format("%p", SectOffset));
+        if (isGlobal)
+          SymbolTable[Name] = SymbolLoc(SectionID, SectOffset);
+      }
    }
    DEBUG(dbgs() << "\tType: " << SymType << " Name: " << Name << "\n");
  }

+  // Allocate common symbols
+  if (CommonSize != 0)
+    emitCommonSymbols(CommonSymbols, CommonSize, LocalSymbols);
+
  // Parse and proccess relocations
  DEBUG(dbgs() << "Parse relocations:\n");
  for (section_iterator si = obj->begin_sections(),
@@ -150,6 +167,38 @@
  return false;
 }

+unsigned RuntimeDyldImpl::emitCommonSymbols(const CommonSymbolMap &Map,
+                                            uint64_t TotalSize,
+                                            LocalSymbolMap &LocalSymbols) {
+  // Allocate memory for the section
+  unsigned SectionID = Sections.size();
+  uint8_t *Addr = MemMgr->allocateDataSection(TotalSize, sizeof(void*),
+                                              SectionID);
+  if (!Addr)
+    report_fatal_error("Unable to allocate memory for common symbols!");
+  uint64_t Offset = 0;
+  Sections.push_back(SectionEntry(Addr, TotalSize, TotalSize, 0));
+  memset(Addr, 0, TotalSize);
+
+  DEBUG(dbgs() << "emitCommonSection SectionID: " << SectionID
+               << " new addr: " << format("%p", Addr)
+               << " DataSize: " << TotalSize
+               << "\n");
+
+  // Assign the address of each symbol
+  for (CommonSymbolMap::const_iterator it = Map.begin(), itEnd = Map.end();
+       it != itEnd; it++) {
+    uint64_t Size = it->second;
+    StringRef Name;
+    it->first.getName(Name);
+    LocalSymbols[Name.data()] = SymbolLoc(SectionID, Offset);
+    Offset += Size;
+    Addr += Size;
+  }
+
+  return SectionID;
+}
+
 unsigned RuntimeDyldImpl::emitSection(const SectionRef &Section,
                                      bool IsCode) {

@@ -158,7 +207,7 @@
  error_code err;
  if (StubSize > 0) {
    for (relocation_iterator i = Section.begin_relocations(),
-         e = Section.end_relocations(); i != e; i.increment(err))
+         e = Section.end_relocations(); i != e; i.increment(err), Check(err))
      StubBufSize += StubSize;
  }
  StringRef data;
@@ -167,22 +216,63 @@
  Check(Section.getAlignment(Alignment64));

  unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL;
-  unsigned DataSize = data.size();
-  unsigned Allocate = DataSize + StubBufSize;
+  bool IsRequired;
+  bool IsVirtual;
+  bool IsZeroInit;
+  uint64_t DataSize;
+  Check(Section.isRequiredForExecution(IsRequired));
+  Check(Section.isVirtual(IsVirtual));
+  Check(Section.isZeroInit(IsZeroInit));
+  Check(Section.getSize(DataSize));
+
+  unsigned Allocate;
  unsigned SectionID = Sections.size();
-  const char *pData = data.data();
-  uint8_t *Addr = IsCode
-    ? MemMgr->allocateCodeSection(Allocate, Alignment, SectionID)
-    : MemMgr->allocateDataSection(Allocate, Alignment, SectionID);
-
-  memcpy(Addr, pData, DataSize);
-  DEBUG(dbgs() << "emitSection SectionID: " << SectionID
-               << " obj addr: " << format("%p", pData)
-               << " new addr: " << format("%p", Addr)
-               << " DataSize: " << DataSize
-               << " StubBufSize: " << StubBufSize
-               << " Allocate: " << Allocate
-               << "\n");
+  uint8_t *Addr;
+  const char *pData = 0;
+
+  // Some sections, such as debug info, don't need to be loaded for execution.
+  // Leave those where they are.
+  if (IsRequired) {
+    Allocate = DataSize + StubBufSize;
+    Addr = IsCode
+      ? MemMgr->allocateCodeSection(Allocate, Alignment, SectionID)
+      : MemMgr->allocateDataSection(Allocate, Alignment, SectionID);
+    if (!Addr)
+      report_fatal_error("Unable to allocate section memory!");
+
+    // Virtual sections have no data in the object image, so leave pData = 0
+    if (!IsVirtual)
+      pData = data.data();
+
+    // Zero-initialize or copy the data from the image
+    if (IsZeroInit || IsVirtual)
+      memset(Addr, 0, DataSize);
+    else
+      memcpy(Addr, pData, DataSize);
+
+    DEBUG(dbgs() << "emitSection SectionID: " << SectionID
+                 << " obj addr: " << format("%p", pData)
+                 << " new addr: " << format("%p", Addr)
+                 << " DataSize: " << DataSize
+                 << " StubBufSize: " << StubBufSize
+                 << " Allocate: " << Allocate
+                 << "\n");
+  }
+  else {
+    // Even if we didn't load the section, we need to record an entry for it
+    //   to handle later processing (and by 'handle' I mean don't do anything
+    //   with these sections).
+    Allocate = 0;
+    Addr = 0;
+    DEBUG(dbgs() << "emitSection SectionID: " << SectionID
+                 << " obj addr: " << format("%p", data.data())
+                 << " new addr: 0"
+                 << " DataSize: " << DataSize
+                 << " StubBufSize: " << StubBufSize
+                 << " Allocate: " << Allocate
+                 << "\n");
+  }
+
  Sections.push_back(SectionEntry(Addr, Allocate, DataSize,(uintptr_t)pData));
  return SectionID;
 }
@@ -259,15 +349,18 @@

 void RuntimeDyldImpl::resolveRelocationEntry(const RelocationEntry &RE,
                                             uint64_t Value) {
-    uint8_t *Target = Sections[RE.SectionID].Address + RE.Offset;
-    DEBUG(dbgs() << "\tSectionID: " << RE.SectionID
-          << " + " << RE.Offset << " (" << format("%p", Target) << ")"
-          << " Data: " << RE.Data
-          << " Addend: " << RE.Addend
-          << "\n");
+    // Ignore relocations for sections that were not loaded
+    if (Sections[RE.SectionID].Address != 0) {
+      uint8_t *Target = Sections[RE.SectionID].Address + RE.Offset;
+      DEBUG(dbgs() << "\tSectionID: " << RE.SectionID
+            << " + " << RE.Offset << " (" << format("%p", Target) << ")"
+            << " Data: " << RE.Data
+            << " Addend: " << RE.Addend
+            << "\n");

-    resolveRelocation(Target, Sections[RE.SectionID].LoadAddress + RE.Offset,
-                      Value, RE.Data, RE.Addend);
+      resolveRelocation(Target, Sections[RE.SectionID].LoadAddress + RE.Offset,
+                        Value, RE.Data, RE.Addend);
+  }
 }

 void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs,

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Thu Apr 12 15:13:57 2012
@@ -71,7 +71,8 @@
  switch (Type) {
  case ELF::R_386_32: {
    uint32_t *Target = (uint32_t*)(LocalAddress);
-    *Target = Value + Addend;
+    uint32_t Placeholder = *Target;
+    *Target = Placeholder + Value + Addend;
    break;
  }
  case ELF::R_386_PC32: {

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Thu Apr 12 15:13:57 2012
@@ -110,6 +110,9 @@
  StringMap<SymbolLoc> SymbolTable;
  typedef DenseMap<const char*, SymbolLoc> LocalSymbolMap;

+  // Keep a map of common symbols to their sizes
+  typedef std::map<SymbolRef, unsigned> CommonSymbolMap;
+
  // For each symbol, keep a list of relocations based on it. Anytime
  // its address is reassigned (the JIT re-compiled the function, e.g.),
  // the relocations get re-resolved.
@@ -149,6 +152,12 @@
    return (uint8_t*)Sections[SectionID].Address;
  }

+  /// \brief Emits a section containing common symbols.
+  /// \return SectionID.
+  unsigned emitCommonSymbols(const CommonSymbolMap &Map,
+                             uint64_t TotalSize,
+                             LocalSymbolMap &Symbols);
+
  /// \brief Emits section data from the object file to the MemoryManager.
  /// \param IsCode if it's true then allocateCodeSection() will be
  ///        used for emmits, else allocateDataSection() will be used.

Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/COFFObjectFile.cpp Thu Apr 12 15:13:57 2012
@@ -356,6 +356,27 @@
  return object_error::success;
 }

+error_code COFFObjectFile::isSectionRequiredForExecution(DataRefImpl Sec,
+                                                         bool &Result) const {
+  // FIXME: Unimplemented
+  Result = true;
+  return object_error::success;
+}
+
+error_code COFFObjectFile::isSectionVirtual(DataRefImpl Sec,
+                                           bool &Result) const {
+  const coff_section *sec = toSec(Sec);
+  Result = sec->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
+  return object_error::success;
+}
+
+error_code COFFObjectFile::isSectionZeroInit(DataRefImpl Sec,
+                                             bool &Result) const {
+  // FIXME: Unimplemented
+  Result = false;
+  return object_error::success;
+}
+
 error_code COFFObjectFile::sectionContainsSymbol(DataRefImpl Sec,
                                                 DataRefImpl Symb,
                                                 bool &Result) const {

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Thu Apr 12 15:13:57 2012
@@ -175,7 +175,12 @@
    BeginOffset = Entry->Value;
    SectionIndex = Entry->SectionIndex;
    if (!SectionIndex) {
-      Result = UnknownAddressOrSize;
+      uint32_t flags = SymbolRef::SF_None;
+      getSymbolFlags(DRI, flags);
+      if (flags & SymbolRef::SF_Common)
+        Result = Entry->Value;
+      else
+        Result = UnknownAddressOrSize;
      return object_error::success;
    }
    // Unfortunately symbols are unsorted so we need to touch all
@@ -198,7 +203,12 @@
    BeginOffset = Entry->Value;
    SectionIndex = Entry->SectionIndex;
    if (!SectionIndex) {
-      Result = UnknownAddressOrSize;
+      uint32_t flags = SymbolRef::SF_None;
+      getSymbolFlags(DRI, flags);
+      if (flags & SymbolRef::SF_Common)
+        Result = Entry->Value;
+      else
+        Result = UnknownAddressOrSize;
      return object_error::success;
    }
    // Unfortunately symbols are unsorted so we need to touch all
@@ -265,19 +275,22 @@
                                           uint32_t &Result) const {
  uint16_t MachOFlags;
  uint8_t MachOType;
+  uint8_t MachOSectionIndex;
  if (MachOObj->is64Bit()) {
    InMemoryStruct<macho::Symbol64TableEntry> Entry;
    getSymbol64TableEntry(DRI, Entry);
    MachOFlags = Entry->Flags;
    MachOType = Entry->Type;
+    MachOSectionIndex = Entry->SectionIndex;
  } else {
    InMemoryStruct<macho::SymbolTableEntry> Entry;
    getSymbolTableEntry(DRI, Entry);
    MachOFlags = Entry->Flags;
    MachOType = Entry->Type;
+    MachOSectionIndex = Entry->SectionIndex;
  }

-  // TODO: Correctly set SF_ThreadLocal and SF_Common.
+  // TODO: Correctly set SF_ThreadLocal
  Result = SymbolRef::SF_None;

  if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeUndefined)
@@ -286,8 +299,11 @@
  if (MachOFlags & macho::STF_StabsEntryMask)
    Result |= SymbolRef::SF_FormatSpecific;

-  if (MachOType & MachO::NlistMaskExternal)
+  if (MachOType & MachO::NlistMaskExternal) {
    Result |= SymbolRef::SF_Global;
+    if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeUndefined)
+      Result |= SymbolRef::SF_Common;
+  }

  if (MachOFlags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef))
    Result |= SymbolRef::SF_Weak;
@@ -566,6 +582,37 @@
  return object_error::success;
 }

+error_code MachOObjectFile::isSectionRequiredForExecution(DataRefImpl Sec,
+                                                          bool &Result) const {
+  // FIXME: Unimplemented
+  Result = true;
+  return object_error::success;
+}
+
+error_code MachOObjectFile::isSectionVirtual(DataRefImpl Sec,
+                                            bool &Result) const {
+  // FIXME: Unimplemented
+  Result = false;
+  return object_error::success;
+}
+
+error_code MachOObjectFile::isSectionZeroInit(DataRefImpl DRI,
+                                              bool &Result) const {
+  if (MachOObj->is64Bit()) {
+    InMemoryStruct<macho::Section64> Sect;
+    getSection64(DRI, Sect);
+    Result = (Sect->Flags & MachO::SectionTypeZeroFill ||
+              Sect->Flags & MachO::SectionTypeZeroFillLarge);
+  } else {
+    InMemoryStruct<macho::Section> Sect;
+    getSection(DRI, Sect);
+    Result = (Sect->Flags & MachO::SectionTypeZeroFill ||
+              Sect->Flags & MachO::SectionTypeZeroFillLarge);
+  }
+
+  return object_error::success;
+}
+
 error_code MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec,
                                                  DataRefImpl Symb,
                                                  bool &Result) const {

Modified: llvm/trunk/test/ExecutionEngine/2002-12-16-ArgTest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2002-12-16-ArgTest.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2002-12-16-ArgTest.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2002-12-16-ArgTest.ll Thu Apr 12 15:13:57 2012
@@ -1,5 +1,4 @@
 ; RUN: %lli %s > /dev/null
-; XFAIL: mcjit

 @.LC0 = internal global [10 x i8] c"argc: %d\0A\00"            ; <[10 x i8]*> [#uses=1]


Modified: llvm/trunk/test/ExecutionEngine/2003-01-04-ArgumentBug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2003-01-04-ArgumentBug.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2003-01-04-ArgumentBug.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2003-01-04-ArgumentBug.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 define i32 @foo(i32 %X, i32 %Y, double %A) {
       %cond212 = fcmp une double %A, 1.000000e+00             ; <i1> [#uses=1]

Modified: llvm/trunk/test/ExecutionEngine/2003-01-04-LoopTest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2003-01-04-LoopTest.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2003-01-04-LoopTest.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2003-01-04-LoopTest.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 define i32 @main() {
       call i32 @mylog( i32 4 )                ; <i32>:1 [#uses=0]

Modified: llvm/trunk/test/ExecutionEngine/2003-05-06-LivenessClobber.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2003-05-06-LivenessClobber.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2003-05-06-LivenessClobber.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2003-05-06-LivenessClobber.ll Thu Apr 12 15:13:57 2012
@@ -2,7 +2,6 @@
 ;
 ; RUN: not %lli %s
 ; XFAIL: arm
-; XFAIL: mcjit

 @test = global i64 0           ; <i64*> [#uses=1]


Modified: llvm/trunk/test/ExecutionEngine/2003-05-07-ArgumentTest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2003-05-07-ArgumentTest.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2003-05-07-ArgumentTest.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2003-05-07-ArgumentTest.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s test
 ; XFAIL: arm
-; XFAIL: mcjit

 declare i32 @puts(i8*)


Modified: llvm/trunk/test/ExecutionEngine/2003-08-21-EnvironmentTest.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2003-08-21-EnvironmentTest.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2003-08-21-EnvironmentTest.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2003-08-21-EnvironmentTest.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 ;
 ; Regression Test: EnvironmentTest.ll

Modified: llvm/trunk/test/ExecutionEngine/2005-12-02-TailCallBug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/2005-12-02-TailCallBug.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/2005-12-02-TailCallBug.ll (original)
+++ llvm/trunk/test/ExecutionEngine/2005-12-02-TailCallBug.ll Thu Apr 12 15:13:57 2012
@@ -1,7 +1,6 @@
 ; PR672
 ; RUN: %lli %s
 ; XFAIL: arm
-; XFAIL: mcjit-ia32

 define i32 @main() {
       %f = bitcast i32 (i32, i32*, i32)* @check_tail to i32*          ; <i32*> [#uses=1]

Modified: llvm/trunk/test/ExecutionEngine/hello.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/hello.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/hello.ll (original)
+++ llvm/trunk/test/ExecutionEngine/hello.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 @.LC0 = internal global [12 x i8] c"Hello World\00"            ; <[12 x i8]*> [#uses=1]


Modified: llvm/trunk/test/ExecutionEngine/hello2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/hello2.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/hello2.ll (original)
+++ llvm/trunk/test/ExecutionEngine/hello2.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 @X = global i32 7              ; <i32*> [#uses=0]
 @msg = internal global [13 x i8] c"Hello World\0A\00"          ; <[13 x i8]*> [#uses=1]

Modified: llvm/trunk/test/ExecutionEngine/stubs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/stubs.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/stubs.ll (original)
+++ llvm/trunk/test/ExecutionEngine/stubs.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli -disable-lazy-compilation=false %s
 ; XFAIL: arm
-; XFAIL: mcjit

 define i32 @main() nounwind {
 entry:

Modified: llvm/trunk/test/ExecutionEngine/test-call-no-external-funcs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-call-no-external-funcs.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-call-no-external-funcs.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-call-no-external-funcs.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 define i32 @_Z14func_exit_codev() nounwind uwtable {
 entry:

Modified: llvm/trunk/test/ExecutionEngine/test-call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-call.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-call.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-call.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 declare void @exit(i32)


Modified: llvm/trunk/test/ExecutionEngine/test-common-symbols.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-common-symbols.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-common-symbols.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-common-symbols.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli -O0 -disable-lazy-compilation=false %s
 ; XFAIL: arm
-; XFAIL: mcjit

 ; The intention of this test is to verify that symbols mapped to COMMON in ELF
 ; work as expected.

Modified: llvm/trunk/test/ExecutionEngine/test-fp-no-external-funcs.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-fp-no-external-funcs.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-fp-no-external-funcs.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-fp-no-external-funcs.ll Thu Apr 12 15:13:57 2012
@@ -1,5 +1,4 @@
 ; RUN: %lli  %s > /dev/null
-; XFAIL: mcjit

 define double @test(double* %DP, double %Arg) {
       %D = load double* %DP           ; <double> [#uses=1]

Modified: llvm/trunk/test/ExecutionEngine/test-fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-fp.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-fp.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-fp.ll Thu Apr 12 15:13:57 2012
@@ -1,5 +1,4 @@
 ; RUN: %lli %s > /dev/null
-; XFAIL: mcjit

 define double @test(double* %DP, double %Arg) {
       %D = load double* %DP           ; <double> [#uses=1]

Modified: llvm/trunk/test/ExecutionEngine/test-global-init-nonzero.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-global-init-nonzero.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-global-init-nonzero.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-global-init-nonzero.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli  %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 @count = global i32 1, align 4


Modified: llvm/trunk/test/ExecutionEngine/test-global.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-global.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-global.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-global.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit

 @count = global i32 0, align 4


Modified: llvm/trunk/test/ExecutionEngine/test-loadstore.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/test-loadstore.ll?rev=154610&r1=154609&r2=154610&view=diff
==============================================================================
--- llvm/trunk/test/ExecutionEngine/test-loadstore.ll (original)
+++ llvm/trunk/test/ExecutionEngine/test-loadstore.ll Thu Apr 12 15:13:57 2012
@@ -1,6 +1,5 @@
 ; RUN: %lli %s > /dev/null
 ; XFAIL: arm
-; XFAIL: mcjit-ia32

 define void @test(i8* %P, i16* %P.upgrd.1, i32* %P.upgrd.2, i64* %P.upgrd.3) {
       %V = load i8* %P                ; <i8> [#uses=1]


_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu<mailto:llvm-commits at cs.uiuc.edu>
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120413/94aaed42/attachment.html>


More information about the llvm-commits mailing list