<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 1, 2015 at 4:36 AM, Denis Protivensky <span dir="ltr"><<a href="mailto:dprotivensky@accesssoftek.com" target="_blank">dprotivensky@accesssoftek.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: denis-protivensky<br>
Date: Wed Apr  1 06:36:58 2015<br>
New Revision: 233798<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=233798&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=233798&view=rev</a><br>
Log:<br>
[ARM] Enhance checks for entry point<br>
<br>
Modified:<br>
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h?rev=233798&r1=233797&r2=233798&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h?rev=233798&r1=233797&r2=233798&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMExecutableWriter.h Wed Apr  1 06:36:58 2015<br>
@@ -101,12 +101,22 @@ std::error_code ARMExecutableWriter<ELFT<br>
   if (std::error_code ec = ExecutableWriter<ELFT>::setELFHeader())<br>
     return ec;<br>
<br>
-  // Fixup entry point for Thumb code.<br>
   StringRef entryName = _ctx.entrySymbolName();<br>
   if (const AtomLayout *al = _armLayout.findAtomLayoutByName(entryName)) {<br>
-    const auto *ea = dyn_cast<DefinedAtom>(al->_atom);<br>
-    if (ea && ea->codeModel() == DefinedAtom::codeARMThumb)<br>
-      this->_elfHeader->e_entry(al->_virtualAddr | 0x1);<br>
+    if (const auto *ea = dyn_cast<DefinedAtom>(al->_atom)) {<br>
+      switch (ea->codeModel()) {<br>
+      case DefinedAtom::codeNA:<br>
+        if (al->_virtualAddr & 0x3)<br>
+          llvm_unreachable("Two least bits must be zero for ARM entry point");<br>
+      break;<br>
+      case DefinedAtom::codeARMThumb:<br>
+        // Fixup entry point for Thumb code.<br>
+        this->_elfHeader->e_entry(al->_virtualAddr | 0x1);<br>
+      break;<br>
+      default:<br>
+        llvm_unreachable("Wrong code model of entry point atom");<br>
+      }<br>
+    }<br>
   }<br></blockquote><div> </div><div>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).</div></div></div></div>