<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 4, 2015 at 2:58 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Thu, Jun 4, 2015 at 2:37 PM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Is asan OK with this? I would assume that a union of<br>
MachO::mach_header_64 and MachO::mach_header is necessary.<br></blockquote></span></div></div></div></blockquote><div><br></div><div>Sanitizers are fine, as we don't do out-of-bounds access or uninitialized value read. Although I agree that using a union would probably be better...</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote></span><div><br>Perhaps it'd be better to just make mach_header_64 defined:<br><br>struct mach_header_64 {<br>  mach_header m;<br>  uint32_t reserved;<br>};<br></div></div></div></div></blockquote><div><br></div><div>Then we won't be able to access some mach_header_64 fields directly.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>or somesuch - then there's no weird type punning, perhaps? (though maybe still invalid if we're trying to point to a 32 bit header from a mach_header_64* ?)<br> </div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Cheers,<br>
Rafael<br>
<div><div><br>
<br>
On 4 June 2015 at 15:22, Alexey Samsonov <<a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a>> wrote:<br>
> Author: samsonov<br>
> Date: Thu Jun  4 14:22:03 2015<br>
> New Revision: 239075<br>
><br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239075-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=5FsUoXoLlqJm6bSQTR3wWTjKMp7d4qkLzkkqQaXp7Hc&s=SQR6JjbSrYrkGTvofrTRzdEu-da0SpSQItfii9jO62g&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=239075&view=rev</a><br>
> Log:<br>
> [Object, MachO] Cache parsed MachO header in MachOObjectFile. NFC.<br>
><br>
> Summary:<br>
> Avoid parsing object file each time MachOObjectFile::getHeader() is<br>
> called. Instead, cache the header in MachOObjectFile constructor, where<br>
> it's parsed anyway. In future, we must avoid constructing the object<br>
> at all if the header can't be parsed.<br>
><br>
> Test Plan: regression test suite.<br>
><br>
> Reviewers: rafael<br>
><br>
> Subscribers: llvm-commits<br>
><br>
> Modified:<br>
>     llvm/trunk/include/llvm/Object/MachO.h<br>
>     llvm/trunk/lib/Object/MachOObjectFile.cpp<br>
><br>
> Modified: llvm/trunk/include/llvm/Object/MachO.h<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_Object_MachO.h-3Frev-3D239075-26r1-3D239074-26r2-3D239075-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=5FsUoXoLlqJm6bSQTR3wWTjKMp7d4qkLzkkqQaXp7Hc&s=sqCdHebe4XoU4-7OgdJ283Q9Ftq0yHTMBmrQPg2syZI&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=239075&r1=239074&r2=239075&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Object/MachO.h (original)<br>
> +++ llvm/trunk/include/llvm/Object/MachO.h Thu Jun  4 14:22:03 2015<br>
> @@ -385,8 +385,8 @@ public:<br>
><br>
>    MachO::any_relocation_info getRelocation(DataRefImpl Rel) const;<br>
>    MachO::data_in_code_entry getDice(DataRefImpl Rel) const;<br>
> -  MachO::mach_header getHeader() const;<br>
> -  MachO::mach_header_64 getHeader64() const;<br>
> +  const MachO::mach_header &getHeader() const;<br>
> +  const MachO::mach_header_64 &getHeader64() const;<br>
>    uint32_t<br>
>    getIndirectSymbolTableEntry(const MachO::dysymtab_command &DLC,<br>
>                                unsigned Index) const;<br>
> @@ -433,6 +433,7 @@ private:<br>
>    LoadCommandInfo getFirstLoadCommandInfo() const;<br>
>    LoadCommandInfo getNextLoadCommandInfo(const LoadCommandInfo &L) const;<br>
><br>
> +  MachO::mach_header_64 Header64;<br>
>    typedef SmallVector<const char*, 1> SectionList;<br>
>    SectionList Sections;<br>
>    typedef SmallVector<const char*, 1> LibraryList;<br>
><br>
> Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Object_MachOObjectFile.cpp-3Frev-3D239075-26r1-3D239074-26r2-3D239075-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=5FsUoXoLlqJm6bSQTR3wWTjKMp7d4qkLzkkqQaXp7Hc&s=O1a1xSWv6DQaGXIW4t7cr451IlMv6bHa_tMZ_mxc_H8&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=239075&r1=239074&r2=239075&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)<br>
> +++ llvm/trunk/lib/Object/MachOObjectFile.cpp Thu Jun  4 14:22:03 2015<br>
> @@ -187,7 +187,16 @@ MachOObjectFile::MachOObjectFile(MemoryB<br>
>        DataInCodeLoadCmd(nullptr), LinkOptHintsLoadCmd(nullptr),<br>
>        DyldInfoLoadCmd(nullptr), UuidLoadCmd(nullptr),<br>
>        HasPageZeroSegment(false) {<br>
> -  uint32_t LoadCommandCount = this->getHeader().ncmds;<br>
> +  // Parse header.<br>
> +  if (is64Bit())<br>
> +    Header64 = getStruct<MachO::mach_header_64>(this, getPtr(this, 0));<br>
> +  else<br>
> +    // First fields of MachO::mach_header_64 are the same as<br>
> +    // in MachO::mach_header.<br>
> +    *reinterpret_cast<MachO::mach_header *>(&this->Header64) =<br>
> +        getStruct<MachO::mach_header>(this, getPtr(this, 0));<br>
> +<br>
> +  uint32_t LoadCommandCount = getHeader().ncmds;<br>
>    if (LoadCommandCount == 0)<br>
>      return;<br>
><br>
> @@ -1195,21 +1204,9 @@ unsigned MachOObjectFile::getArch() cons<br>
><br>
>  Triple MachOObjectFile::getArch(const char **McpuDefault,<br>
>                                  Triple *ThumbTriple) const {<br>
> -  Triple T;<br>
> -  if (is64Bit()) {<br>
> -    MachO::mach_header_64 H_64;<br>
> -    H_64 = getHeader64();<br>
> -    T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype, McpuDefault);<br>
> -    *ThumbTriple = MachOObjectFile::getThumbArch(H_64.cputype, H_64.cpusubtype,<br>
> -                                                 McpuDefault);<br>
> -  } else {<br>
> -    MachO::mach_header H;<br>
> -    H = getHeader();<br>
> -    T = MachOObjectFile::getArch(H.cputype, H.cpusubtype, McpuDefault);<br>
> -    *ThumbTriple = MachOObjectFile::getThumbArch(H.cputype, H.cpusubtype,<br>
> -                                                 McpuDefault);<br>
> -  }<br>
> -  return T;<br>
> +  const auto &Header = getHeader();<br>
> +  *ThumbTriple = getThumbArch(Header.cputype, Header.cpusubtype, McpuDefault);<br>
> +  return getArch(Header.cputype, Header.cpusubtype, McpuDefault);<br>
>  }<br>
><br>
>  relocation_iterator MachOObjectFile::section_rel_begin(unsigned Index) const {<br>
> @@ -2164,12 +2161,15 @@ MachOObjectFile::getDice(DataRefImpl Rel<br>
>    return getStruct<MachO::data_in_code_entry>(this, P);<br>
>  }<br>
><br>
> -MachO::mach_header MachOObjectFile::getHeader() const {<br>
> -  return getStruct<MachO::mach_header>(this, getPtr(this, 0));<br>
> +const MachO::mach_header &MachOObjectFile::getHeader() const {<br>
> +  // First fields of MachO::mach_header_64 are the same as<br>
> +  // in MachO::mach_header.<br>
> +  return *reinterpret_cast<const MachO::mach_header *>(&this->Header64);<br>
>  }<br>
><br>
> -MachO::mach_header_64 MachOObjectFile::getHeader64() const {<br>
> -  return getStruct<MachO::mach_header_64>(this, getPtr(this, 0));<br>
> +const MachO::mach_header_64 &MachOObjectFile::getHeader64() const {<br>
> +  assert(is64Bit());<br>
> +  return Header64;<br>
>  }<br>
><br>
>  uint32_t MachOObjectFile::getIndirectSymbolTableEntry(<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div></div>
</div></div>