The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
5.8, 5.6 and earlier had a good core perl compiler, but we are much better.

Our Bytecode compiler disabled for 5.6, we keep the old. The old core compiler
fails 50% but in mine is a blocker.
Bytecode is only stable for >=5.8, non-debugging, threaded.

C is stable, minor bugs left, esp. with loading dynamic modules. okay with static linkage

CC is unstable, work in progress.

C and CC: Same ok and less failures as with 5.6, 5.8 and 5.9.4.
In 5.8.8 and 5.8.9 we have much less errors in the testsuite for the
new CPAN compiler and the CORE compiler. See below.

Most B::C and B::CC bugs fixed. 5.10 + 5.12 + 5.14 compatibility added.

Open Problems for B::C:
  test 46 (easy: add aux :: GVs)
  test 50 (issue 64 - limitation: no ISA of empty packages)
  r-magic failing in 5.10

See below at the detailed 5.6, 5.8, 5.10, 5.12, 5.14 status

TEST STATUS
-----------
Tested on cygwin1.7, centos5, debian4, debian5 64bit, freebsd7, freebsd8, 
solaris10 intel sunpro, openbsd38
Not so regurarily on centos4, strawberry-5.10.1, strawberry-5.12.2, activeperl-5.10.1

List of failed tests.

CORE (old)
----

5.6.2:
t/bytecode      3,6,8..10,12,15,16,18,28,31,35,38,39
t/c             8,15,16,22,27,28,31			   | 27 worked in 5.6.2!
t/c_o1          8,15,16,22,27,28,31
t/c_o2          8,15,16,22,27,28,31
t/cc            15,18,21,25,27,28,30..32
t/cc_o1         15,18,21,25,27,28,30..32
t/cc_o2         10,15,16,18,21,25,26,27,28,30..32

5.8:  			                          	   | non-threaded
t/bytecode      27,44,33,39
t/c             11,14,15,20,23,27..29,31,101,102 	   | 5,7-12,14-20,22-23,25,27,28,30,31
t/c_o1          1,3-8,10..12,14,15,17..25,27..29,31,101,102| 7-12,14-20,22-23,25,27,28,30,31
t/c_o2          1,3-12,14,15,17..25,27..29,31,101,102      | 7-12,14-20,22-23,25,27,28,30,31
t/cc            7,11,14,15,18..21,23..25,28..32,101..103	
t/cc_o1         7,11,14,15,18..21,23..32,101..103		
t/cc_o2         7,10,11,14..16,18-21,23..32,101..103

Recipe:
  p=perl5.6.2
  t/testc.sh -q -c
  for t in $(seq -f"%02.0f" 32); do rm ccode 2>/dev/null; $p -MO=C,-occode.c ccode$t.pl 2>/dev/null && $p script/cc_harness ccode.c -o ccode >/dev/null; echo -n "$t: "; $p ccode$t.pl; echo -n " => "; ./ccode; echo; done
  p=perl5.8.9
  for t in $(seq -f"%02.0f" 35); do rm ccode 2>/dev/null; $p -MO=C,-occode.c ccode$t.pl 2>/dev/null && $p script/cc_harness -Bstatic ccode.c -o ccode >/dev/null; echo -n "$t: "; $p ccode$t.pl; echo -n " => "; ./ccode; echo; done
  p=perl5.8.9d-nt
  for t in $(seq -f"%02.0f" 35); do rm ccode 2>/dev/null; $p -MO=C,-occode.c ccode$t.pl 2>/dev/null && $p script/cc_harness -Bdynamic ccode.c -o ccode >/dev/null; echo -n "$t: "; $p ccode$t.pl; echo -n " => "; ./ccode; echo; done


B::C (new)
----
t/testc.sh -q -c; t/testcc.sh -q -c or make test TEST_VERBOSE=1

5.6.2:
t/bytecode      broken/not used
t/c             15,41-43,46,50
t/c_o1,2       +44,45
t/cc            15,21,30,35,41-46,50,103-105

5.8.0
redhat perl http://www.nntp.perl.org/group/perl.cpan.testers/2009/12/msg6576363.html:
byterun.c:678: duplicate case value
byterun.c:669: previously used here

5.8.3 + 5.8.5 threaded 1.09
cpantesters http://www.nntp.perl.org/group/perl.cpan.testers/2009/12/msg6576377.html
http://www.nntp.perl.org/group/perl.cpan.testers/2009/12/msg6576274.html
c 	 	7
c_o1-2:  	7,11
cc: 	 	3,7,29
cc_o1-2: 	3,7 

freebsd 5.10.1  c+cc fails on 28 generally, cc passed 12 
freebsd 5.8.9:  c_o1-2: 11 (fixed with 1.09?)

AP 5.8 MSVC6:
t/cc*   12 (similar to 5.10 nt?) (skipped)
t/o     5,9 (skipped)

5.8.9: (5.8.8, 5.8.9 + 5.8.8-nt)
t/bytecode      -
t/c             28,41-43,46,50
t/c_o1         +15,44,45,48
t/cc            15,21,30,35,41-46,48,50,103,105

5.10.1:
t/bytecode 	-
t/c 		41-43,46,50
t/c_o1         +15,44
t/cc 		21,30,35,41-46,50,103,105

5.12.3:
t/bytecode 	21,32
t/c 		21,41-43,46,50
t/c_o1         +44 
t/cc 		3,4,15,21,30,35,41-46,50,103,105

5.14.0:
t/bytecode 	-
t/c 		15,16,29,41-46,49,50
t/c_o1          -"-
t/cc 		3,4,15,21,29,30,35,41-46,50,103,105


CPAN Modules
------------
See t/modules.t:is_todo() We only try to compile use module, not the testsuite.
We only try B::C so far.
The full module testsuite is run with t/testm.sh -t [OPTS] Module

From top100:
generally: fail 0%
5.6:       fail 5%   ExtUtils::Install Module::Build DateTime Devel::GlobalDestruction
                     DateTime::Locale
5.8.9:     fail 3%   Test::Tester Moose MooseX::Types
5.10.1     fail 15%  Test::Harness ExtUtils::Install Module::Build Storable Test::Tester
                     Devel::GlobalDestruction Class::MOP Moose Carp::Clan Module::Pluggable
                     DBI FCGI Encode MooseX::Types Template::Stash
5.12:      fail 4%   ExtUtils::Install Module::Build LWP Storable
5.14       fail 1%   Test::Tester

5.10, 5.12, 5.14 status
-----------------------
TODO for B::C
  better method_name package detection
  tests 15,21,41-43: B destruction,46,50
  restricted hashes in 5.10.0
  r magic
  check t/testcore and testm.sh -t
  see google issues

Fix CC 
  several other issues detected (and mostly fixed) by Heinz Knutzen

DONE
----
fixed with 1.32:
  improved scanner, try_isa, mark_package force, ...
  do not gp_free shared GPs 
  Internals::V
  dl_init of cached deleted packages

fixed with 1.30:
  cc_queue sort 18 ccpp
  dl_init regression
  xs_init (soname by context)
  5.14 support
  package_pv detection for method_named
  AUTOLOAD goto xsub and SelfLoader esp. on 5.8 (27). 
    use AutoLoader works okay. (test 27, 31)
  >5.11.3 test 32 catch evaltry die
  fixed test 29 >5.10 DEBUGGING for -O0 (use IO)

fixed xpvio off-by-one error for 5.10 (test 29)

mark a package which is autoloaded from XS

fixed forbidden REGEXP IVX/NVX access since 5.12

fixed evaltry (test 12), NVX was shared with 2 xpad_cop_seq ints
  which accidently just worked before 1.17, but not after using the %g 
  representation changed with 1.16. Also fixed in Bytecode, fixing tests 9,10,12.

fixed several minor bugs only in modules, no short testcases yet. See Changes

fixed PP_ENTEREVAL (CC test 12) for 5.10 with 1.14.
  Nullify ending retop for the string to CALLRUNOPS.

fixed __DATA__ IO (test 15) on 5.10 and 5.11 with 1.12. 
  On 5.6 it is hard to fix (re-implement PerlIO::scalar).

fixed RV => IV on blead (test 16 tiearray magic obj HVref) with 1.11

fixed GV -> BM magic (index) without needing fbm_compile with 1.09. Just 5.8.9 not.

fixed non-xsub AUTOLOAD (31) with 1.08

ccode17_o1 namepad[1] to PL_sv_undef 

GVCV for 5.11 (27)

runtime require $scalar (28)

RVs for 5.11 (29)

index (fbm_compile) for GVs fixed with 1.04_31

test 14+23 destruction of GvPVX of the empty main:: stash fixed by adding a dummy.

cccode19 sort failure via custom sortcv fixed with B::CC 1.02_03. endless loop

autoload subs from main::, from packages it works ok (test 8)
	fixed with 1.04_25

panic: illegal pad in pad_new: 0x18c4368[0x18cf6e8] with DEBUGGING only
        CvPADLIST: curpad<=>comppad
        fixed with 1.04_22

pvx: seems to be fixed now in bc, and c
  With the move of the pvx field from xpv to the sv, we have to solve 
  that differently for the Bytecode and C backend.
  Bytecode can simply mimic the old XPV behaviour of a 3 field struct 
  (pvx, cur, len) to simplify pv handling.

hv: crash at invalid entry in hv_store in B::HV::save fixed

hek: new implementation, needs static optimization via heksect

regexp: match works, split still broken

bc 10: padv+sassign => Modification of a read-only value attempted at 
bytecode10.pl line 1. Only on cygwin, not on linux!
The bytecode is exactly the same, it must be pp_entersub() with &$cv()
Is FAKE flag of the padsv is missing or should we check for readonly pads?
  g  <1> entersub[t4] vKS/TARG,1
  => Perl_sv_force_normal_flags()
	if (SvREADONLY(sv) && (!SvFAKE(sv)) && (IN_PERL_RUNTIME)) => die
	SV = NULL(0x0) at 0x12207c0
	  REFCNT = 2147483129
	  FLAGS = (READONLY)
-Dt crash fixed by core patch pl-dump-const.patch

cop_io status?
  http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2006-05/msg00770.html

5.8 status
----------
I've restored full 5.8 backwards compatibility, mainly for test comparison.
But since the new B::C compiler is better than the CORE compiler, it is installed.

Details
--------
Test::Harness:
t/testm.sh -D- Test::Harness; gdb ./test_harness
  enter nextstate pushmark const(PV("ok"\0)) print leave
cxstack is corrupt at leave

5.8.9d-nt test 27 AUTOLOAD:
gdb --args ccode27
  start
  b Perl_gv_autoload4
  => The Fcntl stash misses AUTOLOAD

-fcog: (13) unshare_hek tricky assertion fails
        he: "Find the shared he which is just before us in memory"
        ./ccode13_o1 Assertion he->shared_he_he.hent_hek == hek failed: file "hv.c", line 2327.
        Maybe call our own destruct handler on >=510, which resets all such pv's to NULL beforehand.

cccode12_o2: 5.10.1d-nt
        Program received signal SIGSEGV, Segmentation fault.
        0x521ab445 in Perl_pop_scope () at scope.c:103
        103         const I32 oldsave = PL_scopestack[--PL_scopestack_ix];
        (gdb) p PL_scopestack_ix
        $1 = -272716323
        (gdb) bt
        #0  0x521ab445 in Perl_pop_scope () at scope.c:103
        #1  0x52121784 in Perl_pp_leave () at pp_hot.c:1904
        #2  0x00401ca5 in _fu23__PL_ppaddr () at cccode12_o2.c:246
        #3  0x520d95d1 in Perl_runops_debug () at dump.c:1968

bytecode11 - 5.11d
assertion "isGV_with_GP(shplep)" failed: file "B.c", line 4961
#0  XS_B__GV_GP (my_perl=0x14222d0, cv=0x152a750) at B.c:15887
#1  0x521ca568 in Perl_pp_entersub () from /usr/local/bin/cygperl5_11d.dll
#2  0x52165d4c in Perl_runops_debug () from /usr/local/bin/cygperl5_11d.dll
#3  0x521a9730 in Perl_call_sv () from /usr/local/bin/cygperl5_11d.dll
#4  0x521b1640 in Perl_call_list () from /usr/local/bin/cygperl5_11d.dll
#5  0x521a596f in perl_parse () from /usr/local/bin/cygperl5_11d.dll
#6  0x00401136 in main (argc=4, argv=0x14221a0, env=0x1420090)
(gdb) p *gv
$2 = {sv_any = 0x14d1d48, sv_refcnt = 3, sv_flags = 32777 (0x8009), sv_u = {
    svu_iv = -5931823458977729848, svu_uv = 12514920614731821768,
    svu_rv = 0x14db2c8, svu_pv = 0x14db2c8 "ðúE\001", svu_array = 0x14db2c8,
    svu_hash = 0x14db2c8, svu_gp = 0x14db2c8}}

cccode3.c - 5.11 dstr assert
	XPUSHs(GvSV(PL_curpad[1])); /* oops, this GV is empty */
	/* stack =  */
	/* BINOP (0x15ec140) sassign [OPf_STACKED] */
	dst = POPs; src = TOPs; /* empty var dst at stack ! */
	MAYBE_TAINT_SASSIGN_SRC(src);
	SvSetSV(dst, src);

ccode3 - 5.10 (fixed via workaround, dynamic init)
-------------
SEGV     $_ = "xyxyx"; %j=(1,2); s/x/$j{print("z")}/g; print $_ 
empty data. cause: no pv flag and refcnt in the sv
#0  0x004a38c3 in Perl_fbm_instr (my_perl=0x18926d0, big=0x18d4bc8 "xyxyx",
    bigend=0x18d4bcd "", littlestr=0x0, flags=0) at util.c:577
#1  0x006481d4 in Perl_re_intuit_start (my_perl=0x18926d0, prog=0x18d2088,
    sv=0x18d3fb8, strpos=0x18d4bc8 "xyxyx", strend=0x18d4bcd "", flags=0,
    data=0x0) at regexec.c:561
#2  0x005a13f3 in Perl_pp_subst (my_perl=0x18926d0) at pp_hot.c:2105
(gdb) p *rx
$7 = {engine = 0x6a06a0, mother_re = 0x0, extflags = 1126170624, minlen = 0,
  minlenret = 0, gofs = 0, substrs = 0x18c0908, nparens = 0, intflags = 0,
  pprivate = 0x18d1588, lastparen = 0, lastcloseparen = 0, swap = 0x0,
  offs = 0x18cf748, subbeg = 0x0, sublen = 0, prelen = 0,
  precomp = 0x18ab870 ")", wrapped = 0x18ab868 "(?-xism:)", wraplen = 9,
  seen_evals = 0, paren_names = 0x0, refcnt = 1}

ccode2 - 5.11 (fixed via workaround, dynamic init)
-------------
match with /\d/
(gdb) p *pm
$1 = {op_next = 0x66513c, op_sibling = 0x665198, op_ppaddr = 0x59a6e9 <Perl_pp_match>, op_targ = 0, op_type = 31,
  op_opt = 0, op_latefree = 1, op_latefreed = 0, op_attached = 0, op_spare = 0, op_flags = 2 '\002',
  op_private = 64 '@', op_first = 0x0, op_last = 0x0, op_pmoffset = 46, op_pmflags = 0, op_pmreplrootu = {
    op_pmreplroot = 0x0, op_pmtargetoff = 0}, op_pmstashstartu = {op_pmreplstart = 0x0, op_pmstashpv = 0x0}}
(gdb) n
1216        register REGEXP *rx = PM_GETRE(pm);
(gdb) p *rx
$2 = {engine = 0x69f690, mother_re = 0x0, extflags = 52428800, minlen = 1, minlenret = 1, gofs = 0,
  substrs = 0x1920188, nparens = 0, intflags = 0, pprivate = 0x1915448, lastparen = 0, lastcloseparen = 0,
  swap = 0x0, offs = 0x191f6c8, subbeg = 0x0, sublen = 0, prelen = 1, precomp = 0x18fb870 "0)",
  wrapped = 0x18fb868 "(?-xism:0)", wraplen = 10, seen_evals = 0, paren_names = 0x0, refcnt = 1}

TEST COVERAGE
-------------
Bytecode:
coverage for ret(0) ldsv(1) ldop(2) stsv(3) stop(4) stpv(5) ldspecsv(6) 
ldspecsvx(7) newsv(8) newsvx(9) nop(10) newop(11) newopx(12) newopn(13) 
newpv(14) pv_cur(15) pv_free(16) sv_upgrade(17) sv_refcnt(18) sv_refcnt_add(19) 
sv_flags(20) xrv(21) xpv(22) xpv_cur(23) xpv_len(24) xiv(25) xnv(26) 
xlv_targoff(27) xlv_targlen(28) xlv_targ(29) xlv_type(30) xbm_useful(31) 
xbm_previous(32) xbm_rare(33) xfm_lines(34) comment(35) xio_lines(36) xio_page(37) 
xio_page_len(38) xio_lines_left(39) xio_top_name(40) xio_top_gv(41) xio_fmt_name(42) 
xio_fmt_gv(43) xio_bottom_name(44) xio_bottom_gv(45) xio_type(46) xio_flags(47) 
xcv_xsubany(48) xcv_stash(49) xcv_start(50) xcv_root(51) xcv_gv(52) xcv_file(53) 
xcv_depth(54) xcv_padlist(55) xcv_outside(56) xcv_outside_seq(57) xcv_flags(58) 
av_extend(59) av_pushx(60) av_push(61) xav_fill(62) xav_max(63) xav_flags(64) 
xhv_name(65) hv_store(66) sv_magic(67) mg_obj(68) mg_private(69) mg_flags(70) 
mg_name(71) mg_namex(72) xmg_stash(73) gv_fetchpv(74) gv_fetchpvx(75) gv_stashpv(76) 
gv_stashpvx(77) gp_sv(78) gp_refcnt(79) gp_refcnt_add(80) gp_av(81) gp_hv(82) 
gp_cv(83) gp_file(84) gp_io(85) gp_form(86) gp_cvgen(87) gp_line(88) gp_share(89) 
xgv_flags(90) op_next(91) op_sibling(92) op_ppaddr(93) op_targ(94) op_type(95) 
op_opt(96) op_latefree(97) op_latefreed(98) op_attached(99) op_first(102) op_last(103) 
op_pmreplroot(105) op_pmreplstart(106) op_pmreplrootpo(108) op_pmstash(109) 
op_pmreplrootgv(110) pregcomp(111) op_pmflags(112) unused(113) op_reflags(114) 
op_sv(115) op_pv(117) op_pv_tr(118) op_redoop(119) op_nextop(120) op_lastop(121) 
cop_label(122) cop_stash(125) cop_filegv(126) push_begin(134) push_init(135) 
push_end(136) curstash(137) defstash(138) data(139) incav(140) load_glob(141) 
regex_padav(142) comppad_name(144) xgv_stash(145) signal(146) formfeed(147)

JIT PLANS
---------
Jit came alive March 2010 on github and now CPAN.

B-C-1.04_10:
Playing with the idea to target against parrot pir instead of lightning
and use the parrot jit, with pbc_to_exe or exec_save.
Then we need no jit support in the ByteLoader and get rid of all the Jit 
stuff for now. 
=> B::PIR, Doing mentoring for Google Soc 2008

B-C-1.04_03:
added Jit and Asm layout, with the idea of using either 
lightning as jit backend (Jit), or creating our own assembler (Asm) 
to be able to use a high-level language.

Abbrevations
------------
bc 	B::ByteCode 
c  	B::C
cc 	B::CC
-D 	-DDEBUGGING perl, also used as d version suffix, eg 5.8.8d
-nt 	not threaded perl

2010-01-27 rurban