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

Denis Protivensky dprotivensky at accesssoftek.com
Wed Apr 1 23:46:36 PDT 2015


The second case reflects programmer's mistake and cannot happen because of wrong input, while the first one is possible. I'll change the first to report fatal error instead.

On 04/02/2015 12:59 AM, Rui Ueyama wrote:
On Wed, Apr 1, 2015 at 4:36 AM, Denis Protivensky <dprotivensky at accesssoftek.com<mailto:dprotivensky at accesssoftek.com>> wrote:
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");
+      }
+    }
   }

Are these statements really unreachable, assuming there's no bug in the code, or they might be reachable if we give broken object files or something to the linker? I don't know which is the case, but if the latter is the case, you may want to use llvm::report_fatal_error instead of llvm_unreachable because llvm_unreachable may be expanded to __builtin_unreachable (so it may not print out error messages).

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150401/eca5d21c/attachment.html>


More information about the llvm-commits mailing list