summaryrefslogtreecommitdiff
path: root/proto.h
diff options
context:
space:
mode:
authorDaniel Dragan <bulk88@hotmail.com>2012-12-16 17:26:49 -0500
committerFather Chrysostomos <sprout@cpan.org>2012-12-23 16:36:38 -0800
commit3d04513d447d337fe15b345b1c6a4cf19dfbe89c (patch)
tree4da3c8384d56bcc9871893fc8ead2fa6104d3983 /proto.h
parent5b48d9bbd702cd2c0a0863c898b3d4b120daf256 (diff)
downloadperl-3d04513d447d337fe15b345b1c6a4cf19dfbe89c.tar.gz
uninline panic branch from POPSTACK
This commit saves machine instructions by preventing inlining, and keeps the error handling code for an extremely rare panic out of hot code. This should make the interp smaller and faster. Perl_error_log is a macro that has a very large expansion on threaded perls, 4 branches and possibly a call to Perl_PerlIO_stderr. POPSTACK 18 times, by asm, on my non DEBUGGING threaded Win32 32 bit Perl 5.17 -O1 compiled with VC 2003. POPSTACK is also used in some core XS modules, for example List::Util and PerlIO::encoding. The .text section of perl517.dll dropped from 0xc05ff bytes of x86 instructions to 0xc00ff after applying this for me. Perl_croak_popstack was made contextless to save a push/move instruction at each caller (less instructions in the instruction cache) and for more opportunity for the compiler to optimize. Since Perl_croak_popstack is a noreturn, some compilers may optimize it to just a conditional jump instruction. VC 2003 32 bit did this inside perl517.dll and from XS modules using POPSTACK. Perl_croak_popstack measures at 0x48 bytes of instructions under -O1 for me, so previously, those 0x48 minus the dTHX overhead would have been sitting in the caller because of macro expansion.
Diffstat (limited to 'proto.h')
-rw-r--r--proto.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/proto.h b/proto.h
index e8af3c8548..ee2b14ef7e 100644
--- a/proto.h
+++ b/proto.h
@@ -676,6 +676,9 @@ PERL_CALLCONV_NO_RET void Perl_croak_no_mem(void)
PERL_CALLCONV_NO_RET void Perl_croak_no_modify(void)
__attribute__noreturn__;
+PERL_CALLCONV_NO_RET void Perl_croak_popstack(void)
+ __attribute__noreturn__;
+
PERL_CALLCONV_NO_RET void Perl_croak_sv(pTHX_ SV *baseex)
__attribute__noreturn__
__attribute__nonnull__(pTHX_1);