[lld] r233798 - [ARM] Enhance checks for entry point

Denis Protivensky dprotivensky at accesssoftek.com
Wed Apr 1 04:36:59 PDT 2015


Author: denis-protivensky
Date: Wed Apr  1 06:36:58 2015
New Revision: 233798

URL: http://llvm.org/viewvc/llvm-project?rev=233798&view=rev
Log:
[ARM] Enhance checks for entry point

Modified:
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h?rev=233798&r1=233797&r2=233798&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h Wed Apr  1 06:36:58 2015
@@ -101,12 +101,22 @@ std::error_code ARMExecutableWriter<ELFT
   if (std::error_code ec = ExecutableWriter<ELFT>::setELFHeader())
     return ec;
 
-  // Fixup entry point for Thumb code.
   StringRef entryName = _ctx.entrySymbolName();
   if (const AtomLayout *al = _armLayout.findAtomLayoutByName(entryName)) {
-    const auto *ea = dyn_cast<DefinedAtom>(al->_atom);
-    if (ea && ea->codeModel() == DefinedAtom::codeARMThumb)
-      this->_elfHeader->e_entry(al->_virtualAddr | 0x1);
+    if (const auto *ea = dyn_cast<DefinedAtom>(al->_atom)) {
+      switch (ea->codeModel()) {
+      case DefinedAtom::codeNA:
+        if (al->_virtualAddr & 0x3)
+          llvm_unreachable("Two least bits must be zero for ARM entry point");
+      break;
+      case DefinedAtom::codeARMThumb:
+        // Fixup entry point for Thumb code.
+        this->_elfHeader->e_entry(al->_virtualAddr | 0x1);
+      break;
+      default:
+        llvm_unreachable("Wrong code model of entry point atom");
+      }
+    }
   }
 
   return std::error_code();





More information about the llvm-commits mailing list