<div dir="ltr">Hi Seiya,<br><br>To test with valgrind, you will need to add --vg to the lit test command.<br><br>llvm-lit --vg llvm-project/llvm/test/tools/llvm-objcopy/ELF/basic-keep.test<br><br>Thanks,<br>Rumeet</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 28, 2019 at 11:40 AM Jordan Rupprecht <<a href="mailto:rupprecht@google.com">rupprecht@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Seiya, were you able to reproduce the issue locally to recommit the patch?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 25, 2019 at 7:40 PM Rumeet Dhindsa via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">With this patch, some of llvm-objcopy tests are failing with valgrind.<br><br>Following is the output for basic-keep.test<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0);min-height:15px"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space"> </span></span></p>





<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">Command Output (stderr):</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">--</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406== Conditional jump or move depends on uninitialised value(s)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>at 0x1A30DD: executeObjcopy(llvm::objcopy::CopyConfig const&) (llvm-objcopy.cpp:235)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3935: main (llvm-objcopy.cpp:294)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space"> </span></span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406== Conditional jump or move depends on uninitialised value(s)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>at 0x1A30E2: executeObjcopy(llvm::objcopy::CopyConfig const&) (llvm-objcopy.cpp:235)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3935: main (llvm-objcopy.cpp:294)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space"> </span></span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406== Conditional jump or move depends on uninitialised value(s)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>at 0x1C1518: llvm::objcopy::elf::createWriter(llvm::objcopy::CopyConfig const&, llvm::objcopy::elf::Object&, llvm::objcopy::Buffer&, llvm::objcopy::elf::ElfType) (ELFObjcopy.cpp:157)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1C50DE: llvm::objcopy::elf::writeOutput(llvm::objcopy::CopyConfig const&, llvm::objcopy::elf::Object&, llvm::objcopy::Buffer&, llvm::objcopy::elf::ElfType) (ELFObjcopy.cpp:740)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1C587F: llvm::objcopy::elf::executeObjcopyOnBinary(llvm::objcopy::CopyConfig const&, llvm::object::ELFObjectFileBase&, llvm::objcopy::Buffer&) (ELFObjcopy.cpp:803)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A25F2: executeObjcopyOnBinary(llvm::objcopy::CopyConfig const&, llvm::object::Binary&, llvm::objcopy::Buffer&) (llvm-objcopy.cpp:162)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3445: executeObjcopy(llvm::objcopy::CopyConfig const&) (llvm-objcopy.cpp:265)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3935: main (llvm-objcopy.cpp:294)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space"> </span></span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406== Conditional jump or move depends on uninitialised value(s)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>at 0x1C151D: llvm::objcopy::elf::createWriter(llvm::objcopy::CopyConfig const&, llvm::objcopy::elf::Object&, llvm::objcopy::Buffer&, llvm::objcopy::elf::ElfType) (ELFObjcopy.cpp:157)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1C50DE: llvm::objcopy::elf::writeOutput(llvm::objcopy::CopyConfig const&, llvm::objcopy::elf::Object&, llvm::objcopy::Buffer&, llvm::objcopy::elf::ElfType) (ELFObjcopy.cpp:740)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1C587F: llvm::objcopy::elf::executeObjcopyOnBinary(llvm::objcopy::CopyConfig const&, llvm::object::ELFObjectFileBase&, llvm::objcopy::Buffer&) (ELFObjcopy.cpp:803)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A25F2: executeObjcopyOnBinary(llvm::objcopy::CopyConfig const&, llvm::object::Binary&, llvm::objcopy::Buffer&) (llvm-objcopy.cpp:162)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3445: executeObjcopy(llvm::objcopy::CopyConfig const&) (llvm-objcopy.cpp:265)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space">    </span>by 0x1A3935: main (llvm-objcopy.cpp:294)</span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">==107406==<span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-Apple-converted-space"> </span></span></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p2" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0);min-height:15px"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures"></span><br></p>
<p class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:Menlo;color:rgb(0,0,0)"><span class="gmail-m_6186739330972226233gmail-m_-2445158570424236079gmail-s1" style="font-variant-ligatures:no-common-ligatures">--</span></p>Failing Tests:<br>llvm-objcopy/ELF/basic-keep.test<br>llvm-objcopy/ELF/basic-only-keep-debug.test<br>llvm-objcopy/ELF/discard-all-debug.test<br>llvm-objcopy/ELF/discard-all.test<br>llvm-objcopy/ELF/discard-locals.test<br>llvm-objcopy/ELF/discard-mix-local-and-all.test<br>llvm-objcopy/ELF/dynsym-error-remove-strtab.test<br>llvm-objcopy/ELF/keep-file-symbols.test<br>llvm-objcopy/ELF/no-strip-all.test<br>llvm-objcopy/ELF/reloc-error-remove-symtab.test<br>llvm-objcopy/ELF/reloc-no-symtab.test<br>llvm-objcopy/ELF/remove-linked-section.test<br>llvm-objcopy/ELF/same-file-strip.test<br>llvm-objcopy/ELF/strip-all-and-keep-symbol.test<br>llvm-objcopy/ELF/strip-all-and-remove.test<br>llvm-objcopy/ELF/strip-all-gnu.test<br>llvm-objcopy/ELF/strip-all.test<br>llvm-objcopy/ELF/strip-debug-and-remove.test<br>llvm-objcopy/ELF/strip-debug.test<br>llvm-objcopy/ELF/strip-multiple-files.test<br>llvm-objcopy/ELF/strip-preserve-atime.test<br>llvm-objcopy/ELF/strip-preserve-mtime.test<br>llvm-objcopy/ELF/strip-symbol.test<br>llvm-objcopy/ELF/strip-unneeded.test<br>llvm-objcopy/ELF/symtab-error-on-remove-strtab.test<br>llvm-objcopy/ELF/symtab-link.test<br><br>I verified locally that by reverting this change, the tests are passing. </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 24, 2019 at 5:02 PM Seiya Nuta via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: seiya<br>
Date: Mon Jun 24 17:02:04 2019<br>
New Revision: 364254<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=364254&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=364254&view=rev</a><br>
Log:<br>
[llvm-objcopy][NFC] Refactor output target parsing<br>
<br>
Summary:<br>
Use an enum instead of string to hold the output file format in Config.InputFormat and Config.OutputFormat. It's essential to support other output file formats other than ELF.<br>
<br>
Reviewers: espindola, alexshap, rupprecht, jhenderson<br>
<br>
Reviewed By: rupprecht, jhenderson<br>
<br>
Subscribers: jyknight, compnerd, emaste, arichardson, fedor.sergeev, jakehehrlich, MaskRay, llvm-commits<br>
<br>
Tags: #llvm<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D63239" rel="noreferrer" target="_blank">https://reviews.llvm.org/D63239</a><br>
<br>
Modified:<br>
    llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp<br>
    llvm/trunk/tools/llvm-objcopy/CopyConfig.h<br>
    llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp<br>
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp<br>
<br>
Modified: llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp?rev=364254&r1=364253&r2=364254&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp?rev=364254&r1=364253&r2=364254&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp (original)<br>
+++ llvm/trunk/tools/llvm-objcopy/CopyConfig.cpp Mon Jun 24 17:02:04 2019<br>
@@ -277,8 +277,13 @@ static Expected<const MachineInfo &> get<br>
   return Iter->getValue();<br>
 }<br>
<br>
+struct TargetInfo {<br>
+  FileFormat Format;<br>
+  MachineInfo Machine;<br>
+};<br>
+<br>
 // FIXME: consolidate with the bfd parsing used by lld.<br>
-static const StringMap<MachineInfo> OutputFormatMap{<br>
+static const StringMap<MachineInfo> TargetMap{<br>
     // Name, {EMachine, 64bit, LittleEndian}<br>
     // x86<br>
     {"elf32-i386", {ELF::EM_386, false, true}},<br>
@@ -312,18 +317,28 @@ static const StringMap<MachineInfo> Outp<br>
     {"elf32-sparcel", {ELF::EM_SPARC, false, true}},<br>
 };<br>
<br>
-static Expected<MachineInfo> getOutputFormatMachineInfo(StringRef Format) {<br>
-  StringRef OriginalFormat = Format;<br>
-  bool IsFreeBSD = Format.consume_back("-freebsd");<br>
-  auto Iter = OutputFormatMap.find(Format);<br>
-  if (Iter == std::end(OutputFormatMap))<br>
+static Expected<TargetInfo><br>
+getOutputTargetInfoByTargetName(StringRef TargetName) {<br>
+  StringRef OriginalTargetName = TargetName;<br>
+  bool IsFreeBSD = TargetName.consume_back("-freebsd");<br>
+  auto Iter = TargetMap.find(TargetName);<br>
+  if (Iter == std::end(TargetMap))<br>
     return createStringError(errc::invalid_argument,<br>
                              "invalid output format: '%s'",<br>
-                             OriginalFormat.str().c_str());<br>
+                             OriginalTargetName.str().c_str());<br>
   MachineInfo MI = Iter->getValue();<br>
   if (IsFreeBSD)<br>
     MI.OSABI = ELF::ELFOSABI_FREEBSD;<br>
-  return {MI};<br>
+<br>
+  FileFormat Format;<br>
+  if (TargetName.startswith("elf"))<br>
+    Format = FileFormat::ELF;<br>
+  else<br>
+    // This should never happen because `TargetName` is valid (it certainly<br>
+    // exists in the TargetMap).<br>
+    llvm_unreachable("unknown target prefix");<br>
+<br>
+  return {TargetInfo{Format, MI}};<br>
 }<br>
<br>
 static Error addSymbolsFromFile(std::vector<NameOrRegex> &Symbols,<br>
@@ -445,14 +460,23 @@ Expected<DriverConfig> parseObjcopyOptio<br>
         "--target cannot be used with --input-target or --output-target");<br>
<br>
   bool UseRegex = InputArgs.hasArg(OBJCOPY_regex);<br>
+  StringRef InputFormat, OutputFormat;<br>
   if (InputArgs.hasArg(OBJCOPY_target)) {<br>
-    Config.InputFormat = InputArgs.getLastArgValue(OBJCOPY_target);<br>
-    Config.OutputFormat = InputArgs.getLastArgValue(OBJCOPY_target);<br>
+    InputFormat = InputArgs.getLastArgValue(OBJCOPY_target);<br>
+    OutputFormat = InputArgs.getLastArgValue(OBJCOPY_target);<br>
   } else {<br>
-    Config.InputFormat = InputArgs.getLastArgValue(OBJCOPY_input_target);<br>
-    Config.OutputFormat = InputArgs.getLastArgValue(OBJCOPY_output_target);<br>
+    InputFormat = InputArgs.getLastArgValue(OBJCOPY_input_target);<br>
+    OutputFormat = InputArgs.getLastArgValue(OBJCOPY_output_target);<br>
   }<br>
-  if (Config.InputFormat == "binary") {<br>
+<br>
+  // FIXME:  Currently, we ignore the target for non-binary/ihex formats<br>
+  // explicitly specified by -I option (e.g. -Ielf32-x86-64) and guess the<br>
+  // format by llvm::object::createBinary regardless of the option value.<br>
+  Config.InputFormat = StringSwitch<FileFormat>(InputFormat)<br>
+                           .Case("binary", FileFormat::Binary)<br>
+                           .Case("ihex", FileFormat::IHex)<br>
+                           .Default(FileFormat::Unspecified);<br>
+  if (Config.InputFormat == FileFormat::Binary) {<br>
     auto BinaryArch = InputArgs.getLastArgValue(OBJCOPY_binary_architecture);<br>
     if (BinaryArch.empty())<br>
       return createStringError(<br>
@@ -463,12 +487,17 @@ Expected<DriverConfig> parseObjcopyOptio<br>
       return MI.takeError();<br>
     Config.BinaryArch = *MI;<br>
   }<br>
-  if (!Config.OutputFormat.empty() && Config.OutputFormat != "binary" &&<br>
-      Config.OutputFormat != "ihex") {<br>
-    Expected<MachineInfo> MI = getOutputFormatMachineInfo(Config.OutputFormat);<br>
-    if (!MI)<br>
-      return MI.takeError();<br>
-    Config.OutputArch = *MI;<br>
+<br>
+  Config.OutputFormat = StringSwitch<FileFormat>(OutputFormat)<br>
+                            .Case("binary", FileFormat::Binary)<br>
+                            .Case("ihex", FileFormat::IHex)<br>
+                            .Default(FileFormat::Unspecified);<br>
+  if (Config.OutputFormat == FileFormat::Unspecified && !OutputFormat.empty()) {<br>
+    Expected<TargetInfo> Target = getOutputTargetInfoByTargetName(OutputFormat);<br>
+    if (!Target)<br>
+      return Target.takeError();<br>
+    Config.OutputFormat = Target->Format;<br>
+    Config.OutputArch = Target->Machine;<br>
   }<br>
<br>
   if (auto Arg = InputArgs.getLastArg(OBJCOPY_compress_debug_sections,<br>
<br>
Modified: llvm/trunk/tools/llvm-objcopy/CopyConfig.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CopyConfig.h?rev=364254&r1=364253&r2=364254&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/CopyConfig.h?rev=364254&r1=364253&r2=364254&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-objcopy/CopyConfig.h (original)<br>
+++ llvm/trunk/tools/llvm-objcopy/CopyConfig.h Mon Jun 24 17:02:04 2019<br>
@@ -26,6 +26,13 @@<br>
 namespace llvm {<br>
 namespace objcopy {<br>
<br>
+enum class FileFormat {<br>
+  Unspecified,<br>
+  ELF,<br>
+  Binary,<br>
+  IHex,<br>
+};<br>
+<br>
 // This type keeps track of the machine info for various architectures. This<br>
 // lets us map architecture names to ELF types and the e_machine value of the<br>
 // ELF file.<br>
@@ -104,9 +111,9 @@ struct NewSymbolInfo {<br>
 struct CopyConfig {<br>
   // Main input/output options<br>
   StringRef InputFilename;<br>
-  StringRef InputFormat;<br>
+  FileFormat InputFormat;<br>
   StringRef OutputFilename;<br>
-  StringRef OutputFormat;<br>
+  FileFormat OutputFormat;<br>
<br>
   // Only applicable for --input-format=binary<br>
   MachineInfo BinaryArch;<br>
<br>
Modified: llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp?rev=364254&r1=364253&r2=364254&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp?rev=364254&r1=364253&r2=364254&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp (original)<br>
+++ llvm/trunk/tools/llvm-objcopy/ELF/ELFObjcopy.cpp Mon Jun 24 17:02:04 2019<br>
@@ -154,12 +154,14 @@ static std::unique_ptr<Writer> createELF<br>
 static std::unique_ptr<Writer> createWriter(const CopyConfig &Config,<br>
                                             Object &Obj, Buffer &Buf,<br>
                                             ElfType OutputElfType) {<br>
-  using Functor = std::function<std::unique_ptr<Writer>()>;<br>
-  return StringSwitch<Functor>(Config.OutputFormat)<br>
-      .Case("binary", [&] { return llvm::make_unique<BinaryWriter>(Obj, Buf); })<br>
-      .Case("ihex", [&] { return llvm::make_unique<IHexWriter>(Obj, Buf); })<br>
-      .Default(<br>
-          [&] { return createELFWriter(Config, Obj, Buf, OutputElfType); })();<br>
+  switch (Config.OutputFormat) {<br>
+  case FileFormat::Binary:<br>
+    return llvm::make_unique<BinaryWriter>(Obj, Buf);<br>
+  case FileFormat::IHex:<br>
+    return llvm::make_unique<IHexWriter>(Obj, Buf);<br>
+  default:<br>
+    return createELFWriter(Config, Obj, Buf, OutputElfType);<br>
+  }<br>
 }<br>
<br>
 template <class ELFT><br>
<br>
Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=364254&r1=364253&r2=364254&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=364254&r1=364253&r2=364254&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)<br>
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Mon Jun 24 17:02:04 2019<br>
@@ -140,11 +140,16 @@ static Error executeObjcopyOnIHex(const<br>
 /// of the output specified by the command line options.<br>
 static Error executeObjcopyOnRawBinary(const CopyConfig &Config,<br>
                                        MemoryBuffer &In, Buffer &Out) {<br>
-  // TODO: llvm-objcopy should parse CopyConfig.OutputFormat to recognize<br>
-  // formats other than ELF / "binary" and invoke<br>
-  // elf::executeObjcopyOnRawBinary, macho::executeObjcopyOnRawBinary or<br>
-  // coff::executeObjcopyOnRawBinary accordingly.<br>
-  return elf::executeObjcopyOnRawBinary(Config, In, Out);<br>
+  switch (Config.OutputFormat) {<br>
+  case FileFormat::ELF:<br>
+  // FIXME: Currently, we call elf::executeObjcopyOnRawBinary even if the<br>
+  // output format is binary/ihex or it's not given. This behavior differs from<br>
+  // GNU objcopy. See <a href="https://bugs.llvm.org/show_bug.cgi?id=42171" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=42171</a> for details.<br>
+  case FileFormat::Binary:<br>
+  case FileFormat::IHex:<br>
+  case FileFormat::Unspecified:<br>
+    return elf::executeObjcopyOnRawBinary(Config, In, Out);<br>
+  }<br>
 }<br>
<br>
 /// The function executeObjcopyOnBinary does the dispatch based on the format<br>
@@ -224,10 +229,17 @@ static Error executeObjcopy(const CopyCo<br>
       return createFileError(Config.InputFilename, EC);<br>
<br>
   typedef Error (*ProcessRawFn)(const CopyConfig &, MemoryBuffer &, Buffer &);<br>
-  auto ProcessRaw = StringSwitch<ProcessRawFn>(Config.InputFormat)<br>
-                        .Case("binary", executeObjcopyOnRawBinary)<br>
-                        .Case("ihex", executeObjcopyOnIHex)<br>
-                        .Default(nullptr);<br>
+  ProcessRawFn ProcessRaw;<br>
+  switch (Config.InputFormat) {<br>
+  case FileFormat::Binary:<br>
+    ProcessRaw = executeObjcopyOnRawBinary;<br>
+    break;<br>
+  case FileFormat::IHex:<br>
+    ProcessRaw = executeObjcopyOnIHex;<br>
+    break;<br>
+  default:<br>
+    ProcessRaw = nullptr;<br>
+  }<br>
<br>
   if (ProcessRaw) {<br>
     auto BufOrErr = MemoryBuffer::getFileOrSTDIN(Config.InputFilename);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</blockquote></div>