[llvm] r213012 - [RuntimeDyld] Handle endiannes differences between the host and target while

Alp Toker alp at nuanti.com
Mon Jul 14 16:47:09 PDT 2014


On 15/07/2014 02:19, Lang Hames wrote:
> Author: lhames
> Date: Mon Jul 14 18:19:50 2014
> New Revision: 213012
>
> URL: http://llvm.org/viewvc/llvm-project?rev=213012&view=rev
> Log:
> [RuntimeDyld] Handle endiannes differences between the host and target while
> reading MachO files magic numbers in RuntimeDyld.
>
> This is required now that we're testing cross-platform JITing (via
> RuntimeDyldChecker), and should fix some issues that David Fang has seen on PPC
> builds.
>
>
> Modified:
>      llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=213012&r1=213011&r2=213012&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp Mon Jul 14 18:19:50 2014
> @@ -120,8 +120,21 @@ public:
>     }
>   };
>   
> +static uint32_t readMachOMagic(const char *InputBuffer, unsigned BufferSize) {

Could you StringRefize the parameter?

> +  if (BufferSize < 4)
> +    return 0;
> +  StringRef Magic(InputBuffer, 4);
> +  if (Magic == "\xFE\xED\xFA\xCE" || Magic == "\xCE\xFA\xED\xFE")
> +    return 0xFEEDFACE;
> +  else if (Magic == "\xFE\xED\xFA\xCF" || Magic == "\xCF\xFA\xED\xFE")
> +    return 0xFEEDFACF;

Can the content really be any one of these four strings, or would it be 
more appropriate to convert endianness before comparison?

> +  // else

Stray comment.

> +  return 0;
> +}
> +
>   ObjectImage *RuntimeDyldMachO::createObjectImage(ObjectBuffer *Buffer) {
> -  uint32_t magic = *((const uint32_t *)Buffer->getBufferStart());
> +  uint32_t magic = readMachOMagic(Buffer->getBufferStart(),
> +                                  Buffer->getBufferSize());
>     bool is64 = (magic == MachO::MH_MAGIC_64);
>     assert((magic == MachO::MH_MAGIC_64 || magic == MachO::MH_MAGIC) &&
>            "Unrecognized Macho Magic");
> @@ -136,7 +149,8 @@ ObjectImage *RuntimeDyldMachO::createObj
>     MemoryBuffer *Buffer =
>         MemoryBuffer::getMemBuffer(ObjFile->getData(), "", false);
>   
> -  uint32_t magic = *((const uint32_t *)Buffer->getBufferStart());
> +  uint32_t magic = readMachOMagic(Buffer->getBufferStart(),
> +                                  Buffer->getBufferSize());

Just pass Buffer->getBuffer() (yes, it's got a silly name).

>     bool is64 = (magic == MachO::MH_MAGIC_64);
>     assert((magic == MachO::MH_MAGIC_64 || magic == MachO::MH_MAGIC) &&
>            "Unrecognized Macho Magic");
> @@ -955,18 +969,9 @@ relocation_iterator RuntimeDyldMachO::pr
>   
>   bool
>   RuntimeDyldMachO::isCompatibleFormat(const ObjectBuffer *InputBuffer) const {
> -  if (InputBuffer->getBufferSize() < 4)
> -    return false;
> -  StringRef Magic(InputBuffer->getBufferStart(), 4);
> -  if (Magic == "\xFE\xED\xFA\xCE")
> -    return true;
> -  if (Magic == "\xCE\xFA\xED\xFE")
> -    return true;
> -  if (Magic == "\xFE\xED\xFA\xCF")
> -    return true;
> -  if (Magic == "\xCF\xFA\xED\xFE")
> -    return true;
> -  return false;
> +  uint32_t Magic = readMachOMagic(InputBuffer->getBufferStart(),
> +                                  InputBuffer->getBufferSize());

Ditto.

> +  return (Magic == 0xFEEDFACE || Magic == 0xFEEDFACF);
>   }
>   
>   bool RuntimeDyldMachO::isCompatibleFile(const object::ObjectFile *Obj) const {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-- 
http://www.nuanti.com
the browser experts




More information about the llvm-commits mailing list