[lld] r233798 - [ARM] Enhance checks for entry point
Rui Ueyama
ruiu at google.com
Wed Apr 1 14:59:27 PDT 2015
On Wed, Apr 1, 2015 at 4:36 AM, Denis Protivensky <
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/d712a592/attachment.html>
More information about the llvm-commits
mailing list