[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