<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 26, 2015 at 2:28 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
> On 2015-May-26, at 14:01, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
><br>
><br>
> On Fri, May 22, 2015 at 6:45 PM, Duncan P. N. Exon Smith <<a href="mailto:dexonsmith@apple.com">dexonsmith@apple.com</a>> wrote:<br>
> Author: dexonsmith<br>
> Date: Fri May 22 20:45:07 2015<br>
> New Revision: 238084<br>
><br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D238084-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=wx_s-XO-78tSpbfK36Zbi8vnTsSpc4CtRnbjY1FaTgU&s=NLaU_MA2-j4e5_FkuHfVmiv_V8a87E0kPbFXn2-NZhU&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=238084&view=rev</a><br>
> Log:<br>
> AsmPrinter: Remove the vtable-entry from DIEValue<br>
><br>
> Remove all virtual functions from `DIEValue`, dropping the vtable<br>
> pointer from its layout. Instead, create "impl" functions on the<br>
> subclasses, and use the `DIEValue::Type` to implement the dynamic<br>
> dispatch.<br>
><br>
> This is necessary -- obviously not sufficient -- for passing `DIEValue`s<br>
> around by value. However, this change stands on its own: we make tons<br>
> of these. I measured a drop in memory usage from 888 MB down to 860 MB,<br>
> or around 3.2%.<br>
><br>
> (I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;<br>
> see r236629 for details.)<br>
><br>
> Modified:<br>
> llvm/trunk/include/llvm/CodeGen/DIE.h<br>
> llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br>
><br>
> Modified: llvm/trunk/include/llvm/CodeGen/DIE.h<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_CodeGen_DIE.h-3Frev-3D238084-26r1-3D238083-26r2-3D238084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=wx_s-XO-78tSpbfK36Zbi8vnTsSpc4CtRnbjY1FaTgU&s=2oq24CnjlCPox2VrkJM90CWVUaqaq8rfmQDNoHw5VGM&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DIE.h?rev=238084&r1=238083&r2=238084&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/include/llvm/CodeGen/DIE.h (original)<br>
> +++ llvm/trunk/include/llvm/CodeGen/DIE.h Fri May 22 20:45:07 2015<br>
> @@ -200,8 +200,6 @@ public:<br>
> /// to DWARF attribute classes.<br>
> ///<br>
> class DIEValue {<br>
> - virtual void anchor();<br>
> -<br>
> public:<br>
> enum Type {<br>
> isInteger,<br>
> @@ -222,7 +220,7 @@ protected:<br>
> Type Ty;<br>
><br>
> explicit DIEValue(Type T) : Ty(T) {}<br>
> - virtual ~DIEValue() {}<br>
> + ~DIEValue() {}<br>
><br>
> = default? (I suppose eventually this will go away, once there are no derived types and it's all passed around by value?)<br>
<br>
</div></div>Yup, it'll disappear.<br>
<div><div class="h5">><br>
><br>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp<br>
> URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_DIE.cpp-3Frev-3D238084-26r1-3D238083-26r2-3D238084-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=wx_s-XO-78tSpbfK36Zbi8vnTsSpc4CtRnbjY1FaTgU&s=TafMkn8JPRShQhyTDevUSFFBl7RN9Yw1OE3o1SM4ifM&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp?rev=238084&r1=238083&r2=238084&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.cpp Fri May 22 20:45:07 2015<br>
> @@ -191,9 +191,66 @@ void DIE::dump() {<br>
> }<br>
> #endif<br>
><br>
> -void DIEValue::anchor() { }<br>
> +void DIEValue::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {<br>
> + switch (Ty) {<br>
> +#define EMIT_VALUE_IMPL(Kind) \<br>
> + case is##Kind: \<br>
> + cast<DIE##Kind>(this)->EmitValueImpl(AP, Form); \<br>
> + break;<br>
> + EMIT_VALUE_IMPL(Integer)<br>
> + EMIT_VALUE_IMPL(String)<br>
> + EMIT_VALUE_IMPL(Expr)<br>
> + EMIT_VALUE_IMPL(Label)<br>
> + EMIT_VALUE_IMPL(Delta)<br>
> + EMIT_VALUE_IMPL(Entry)<br>
> + EMIT_VALUE_IMPL(TypeSignature)<br>
> + EMIT_VALUE_IMPL(Block)<br>
> + EMIT_VALUE_IMPL(Loc)<br>
> + EMIT_VALUE_IMPL(LocList)<br>
><br>
> Worth (now, or in the planned future) having a .def file for these so the list doesn't have to be repeated?<br>
<br>
</div></div>Yeah, I guess this was just laziness on my part; copy paste isn't<br>
maintainable, but it's easy :/. I'll fix that up once the other<br>
DIEValue patches go in; I hope you don't mind the delay, but<br>
those are awkward to rebase because of `DIEValue` moving in the<br>
file.<br></blockquote><div><br>Sure sure. Just getting some idea of where things are pointed. Thanks!<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
><br>
> +#undef EMIT_VALUE_IMPL<br>
> + }<br>
> +}<br>
> +<br>
> +unsigned DIEValue::SizeOf(const AsmPrinter *AP, dwarf::Form Form) const {<br>
> + switch (Ty) {<br>
> +#define SIZE_OF_IMPL(Kind) \<br>
> + case is##Kind: \<br>
> + return cast<DIE##Kind>(this)->SizeOfImpl(AP, Form);<br>
> + SIZE_OF_IMPL(Integer)<br>
> + SIZE_OF_IMPL(String)<br>
> + SIZE_OF_IMPL(Expr)<br>
> + SIZE_OF_IMPL(Label)<br>
> + SIZE_OF_IMPL(Delta)<br>
> + SIZE_OF_IMPL(Entry)<br>
> + SIZE_OF_IMPL(TypeSignature)<br>
> + SIZE_OF_IMPL(Block)<br>
> + SIZE_OF_IMPL(Loc)<br>
> + SIZE_OF_IMPL(LocList)<br>
> +#undef SIZE_OF_IMPL<br>
> + }<br>
> +}<br>
><br>
> #ifndef NDEBUG<br>
> +void DIEValue::print(raw_ostream &O) const {<br>
> + switch (Ty) {<br>
> +#define PRINT_IMPL(Kind) \<br>
> + case is##Kind: \<br>
> + cast<DIE##Kind>(this)->printImpl(O); \<br>
> + break;<br>
> + PRINT_IMPL(Integer)<br>
> + PRINT_IMPL(String)<br>
> + PRINT_IMPL(Expr)<br>
> + PRINT_IMPL(Label)<br>
> + PRINT_IMPL(Delta)<br>
> + PRINT_IMPL(Entry)<br>
> + PRINT_IMPL(TypeSignature)<br>
> + PRINT_IMPL(Block)<br>
> + PRINT_IMPL(Loc)<br>
> + PRINT_IMPL(LocList)<br>
> +#undef PRINT_IMPL<br>
> + }<br>
> +}<br>
</div></div></blockquote></div><br></div></div>