<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jun 22, 2016 at 6:45 AM, 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">testcase? :-)<br></blockquote><div><br></div><div>Sorry for the delay, wanted to get the MSAN tests sorted out first (thanks for the help with that!)</div><div><br></div><div>SVN r273768.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
On 22 June 2016 at 00:03, Saleem Abdulrasool via llvm-commits<br>
<div class=""><div class="h5"><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: compnerd<br>
> Date: Tue Jun 21 23:03:28 2016<br>
> New Revision: 273373<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=273373&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=273373&view=rev</a><br>
> Log:<br>
> llvm-ar: be more clever about default format<br>
><br>
> Try to be more clever about selecting the default format. When an existing<br>
> archive is used, use the type of the archive to determine the format. When<br>
> existing members are present, use the first member's format to determine the<br>
> format to use. If we are creating an empty archive (MRI mode) or are adding<br>
> non-object members, default to the current behaviour of using the host type due<br>
> to the lack of a better alternative. This aids in cross-compilation on Darwin<br>
> to non-Darwin platforms which rely on GNU format archives.<br>
><br>
> Modified:<br>
> llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
><br>
> Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=273373&r1=273372&r2=273373&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=273373&r1=273372&r2=273373&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)<br>
> +++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Tue Jun 21 23:03:28 2016<br>
> @@ -19,6 +19,7 @@<br>
> #include "llvm/LibDriver/LibDriver.h"<br>
> #include "llvm/Object/Archive.h"<br>
> #include "llvm/Object/ArchiveWriter.h"<br>
> +#include "llvm/Object/MachO.h"<br>
> #include "llvm/Object/ObjectFile.h"<br>
> #include "llvm/Support/CommandLine.h"<br>
> #include "llvm/Support/Errc.h"<br>
> @@ -575,21 +576,86 @@ computeNewArchiveMembers(ArchiveOperatio<br>
> return Ret;<br>
> }<br>
><br>
> +static object::Archive::Kind getDefaultForHost() {<br>
> + return Triple(sys::getProcessTriple()).isOSDarwin() ? object::Archive::K_BSD<br>
> + : object::Archive::K_GNU;<br>
> +}<br>
> +<br>
> +static object::Archive::Kind<br>
> +getKindFromMember(const NewArchiveIterator &Member) {<br>
> + if (Member.isNewMember()) {<br>
> + object::Archive::Kind Kind = getDefaultForHost();<br>
> +<br>
> + sys::fs::file_status Status;<br>
> + if (auto OptionalFD = Member.getFD(Status)) {<br>
> + auto OptionalMB = MemoryBuffer::getOpenFile(*OptionalFD, Member.getName(),<br>
> + Status.getSize(), false);<br>
> + if (OptionalMB) {<br>
> + MemoryBufferRef MemoryBuffer = (*OptionalMB)->getMemBufferRef();<br>
> +<br>
> + Expected<std::unique_ptr<object::ObjectFile>> OptionalObject =<br>
> + object::ObjectFile::createObjectFile(MemoryBuffer);<br>
> +<br>
> + if (OptionalObject)<br>
> + Kind = isa<object::MachOObjectFile>(**OptionalObject)<br>
> + ? object::Archive::K_BSD<br>
> + : object::Archive::K_GNU;<br>
> +<br>
> + // squelch the error in case we had a non-object file<br>
> + consumeError(OptionalObject.takeError());<br>
> + }<br>
> +<br>
> + if (close(*OptionalFD) != 0)<br>
> + failIfError(std::error_code(errno, std::generic_category()),<br>
> + "failed to close file");<br>
> + }<br>
> +<br>
> + return Kind;<br>
> + } else {<br>
> + const object::Archive::Child &OldMember = Member.getOld();<br>
> + if (OldMember.getParent()->isThin())<br>
> + return object::Archive::Kind::K_GNU;<br>
> +<br>
> + auto OptionalMB = OldMember.getMemoryBufferRef();<br>
> + failIfError(OptionalMB.getError());<br>
> +<br>
> + Expected<std::unique_ptr<object::ObjectFile>> OptionalObject =<br>
> + object::ObjectFile::createObjectFile(*OptionalMB);<br>
> +<br>
> + if (OptionalObject)<br>
> + return isa<object::MachOObjectFile>(*OptionalObject->get())<br>
> + ? object::Archive::K_BSD<br>
> + : object::Archive::K_GNU;<br>
> +<br>
> + // squelch the error in case we had a non-object file<br>
> + consumeError(OptionalObject.takeError());<br>
> + return getDefaultForHost();<br>
> + }<br>
> +}<br>
> +<br>
> static void<br>
> performWriteOperation(ArchiveOperation Operation,<br>
> object::Archive *OldArchive,<br>
> std::unique_ptr<MemoryBuffer> OldArchiveBuf,<br>
> std::vector<NewArchiveIterator> *NewMembersP) {<br>
> + std::vector<NewArchiveIterator> NewMembers;<br>
> + if (!NewMembersP)<br>
> + NewMembers = computeNewArchiveMembers(Operation, OldArchive);<br>
> +<br>
> object::Archive::Kind Kind;<br>
> switch (FormatOpt) {<br>
> - case Default: {<br>
> - Triple T(sys::getProcessTriple());<br>
> - if (T.isOSDarwin() && !Thin)<br>
> - Kind = object::Archive::K_BSD;<br>
> - else<br>
> + case Default:<br>
> + if (Thin)<br>
> Kind = object::Archive::K_GNU;<br>
> + else if (OldArchive)<br>
> + Kind = OldArchive->kind();<br>
> + else if (NewMembersP)<br>
> + Kind = NewMembersP->size() ? getKindFromMember(NewMembersP->front())<br>
> + : getDefaultForHost();<br>
> + else<br>
> + Kind = NewMembers.size() ? getKindFromMember(NewMembers.front())<br>
> + : getDefaultForHost();<br>
> break;<br>
> - }<br>
> case GNU:<br>
> Kind = object::Archive::K_GNU;<br>
> break;<br>
> @@ -599,18 +665,10 @@ performWriteOperation(ArchiveOperation O<br>
> Kind = object::Archive::K_BSD;<br>
> break;<br>
> }<br>
> - if (NewMembersP) {<br>
> - std::pair<StringRef, std::error_code> Result = writeArchive(<br>
> - ArchiveName, *NewMembersP, Symtab, Kind, Deterministic, Thin,<br>
> - std::move(OldArchiveBuf));<br>
> - failIfError(Result.second, Result.first);<br>
> - return;<br>
> - }<br>
> - std::vector<NewArchiveIterator> NewMembers =<br>
> - computeNewArchiveMembers(Operation, OldArchive);<br>
> - auto Result =<br>
> - writeArchive(ArchiveName, NewMembers, Symtab, Kind, Deterministic, Thin,<br>
> - std::move(OldArchiveBuf));<br>
> +<br>
> + std::pair<StringRef, std::error_code> Result =<br>
> + writeArchive(ArchiveName, NewMembersP ? *NewMembersP : NewMembers, Symtab,<br>
> + Kind, Deterministic, Thin, std::move(OldArchiveBuf));<br>
> failIfError(Result.second, Result.first);<br>
> }<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div>