<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>