<div dir="ltr">I want to keep the number of functions in ErrorHandler as small as possible for the sake of simplicity. As you added a new function, now we have to think which we should use when we write code, check or checkLazy.<div><br></div><div>Have you considered making every call of `check` lazy? I'm OK with using C macro if not too complicated.</div><div><br></div><div>Also, lazy is a overloaded word in lld, so it is better to avoid that word if it's not related to the lazy symbol.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 6, 2017 at 10:52 AM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Wed Dec  6 10:52:13 2017<br>
New Revision: 319922<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=319922&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=319922&view=rev</a><br>
Log:<br>
Add a checkLazy error checking variant.<br>
<br>
This avoids allocating the error message when there is no error that<br>
check requires.<br>
<br>
It avoids the code duplication of inlining check.<br>
<br>
Modified:<br>
    lld/trunk/ELF/InputFiles.cpp<br>
    lld/trunk/include/lld/Common/<wbr>ErrorHandler.h<br>
<br>
Modified: lld/trunk/ELF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=319922&r1=319921&r2=319922&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/ELF/<wbr>InputFiles.cpp?rev=319922&r1=<wbr>319921&r2=319922&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/ELF/InputFiles.cpp (original)<br>
+++ lld/trunk/ELF/InputFiles.cpp Wed Dec  6 10:52:13 2017<br>
@@ -209,10 +209,8 @@ typename ELFT::SymRange ELFFileBase<ELFT<br>
<br>
 template <class ELFT><br>
 uint32_t ELFFileBase<ELFT>::<wbr>getSectionIndex(const Elf_Sym &Sym) const {<br>
-  auto RetOrErr = getObj().getSectionIndex(&Sym, ELFSyms, SymtabSHNDX);<br>
-  if (RetOrErr)<br>
-    return *RetOrErr;<br>
-  fatal(toString(this) + ": " + toString(RetOrErr.takeError())<wbr>);<br>
+  return checkLazy(getObj().<wbr>getSectionIndex(&Sym, ELFSyms, SymtabSHNDX),<br>
+                   [=]() { return toString(this); });<br>
 }<br>
<br>
 template <class ELFT><br>
@@ -642,10 +640,8 @@ template <class ELFT> Symbol *ObjFile<EL<br>
     return make<Defined>(this, Name, Binding, StOther, Type, Value, Size, Sec);<br>
   }<br>
<br>
-  auto NameOrErr = Sym->getName(this-><wbr>StringTable);<br>
-  if (!NameOrErr)<br>
-    fatal(toString(this) + ": " + toString(NameOrErr.takeError()<wbr>));<br>
-  StringRef Name = *NameOrErr;<br>
+  StringRef Name = checkLazy(Sym->getName(this-><wbr>StringTable),<br>
+                             [=]() { return toString(this); });<br>
<br>
   switch (Sym->st_shndx) {<br>
   case SHN_UNDEF:<br>
<br>
Modified: lld/trunk/include/lld/Common/<wbr>ErrorHandler.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Common/ErrorHandler.h?rev=319922&r1=319921&r2=319922&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/include/lld/<wbr>Common/ErrorHandler.h?rev=<wbr>319922&r1=319921&r2=319922&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/include/lld/Common/<wbr>ErrorHandler.h (original)<br>
+++ lld/trunk/include/lld/Common/<wbr>ErrorHandler.h Wed Dec  6 10:52:13 2017<br>
@@ -30,6 +30,7 @@<br>
<br>
 #include "lld/Common/LLVM.h"<br>
<br>
+#include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/Support/Error.h"<br>
 #include "llvm/Support/<wbr>FileOutputBuffer.h"<br>
<br>
@@ -99,6 +100,13 @@ template <class T> T check(Expected<T> E<br>
   return std::move(*E);<br>
 }<br>
<br>
+// A lazy variant that only allocates error messages when there is an error.<br>
+template <class T><br>
+T checkLazy(Expected<T> E, llvm::function_ref<std::<wbr>string()> getPrefix) {<br>
+  if (!E)<br>
+    fatal(getPrefix() + ": " + toString(E.takeError()));<br>
+  return std::move(*E);<br>
+}<br>
 } // namespace lld<br>
<br>
 #endif<br>
<br>
<br>
______________________________<wbr>_________________<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/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>