[llvm] r213012 - [RuntimeDyld] Handle endiannes differences between the host and target while
Alp Toker
alp at nuanti.com
Mon Jul 14 23:42:36 PDT 2014
On 15/07/2014 06:51, Lang Hames wrote:
>
> + 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?
>
> It can - here we're only at the point of verifying that what we're
> looking at is MachO - we don't yet know the target, and in particular
> we don't know whether the target endianness matches the host
> endianness, so there's no way to convert it prior to comparison.
>
> - 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).
>
> On its own that wouldn't be safe: Buffer->getBuffer() would allocate a
> new MemoryBuffer,
No, getBuffer() really does return a StringRef. Like I said, the
function just happens to have a silly name.
> which would then have to be deleted. I could add a unique_ptr local for it
There's a lot of confusion around MemoryBuffer in the backend --
unique_ptr is basically inappropriate for the MemoryBuffer type so
please don't do it! :-)
> , but then it's just as unattractive as what we've got. (Side note - I
> dislike ObjectBuffer and friends in general, and intend to make some
> changes to them in the near future, hopefully to remove all references
> to MemoryBuffer).
>
> I agree that this patch isn't the prettiest, but it's all about to get
> rolled as part of the RuntimeDyldMachO cleanup work I'm doing - I
> promise it'll get better soon.
>
> Thanks for the review Alp!
>
> - Lang.
>
> On Mon, Jul 14, 2014 at 4:47 PM, Alp Toker <alp at nuanti.com
> <mailto:alp at nuanti.com>> wrote:
>
>
> 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 <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> --
> http://www.nuanti.com
> the browser experts
>
>
--
http://www.nuanti.com
the browser experts
More information about the llvm-commits
mailing list