rurban / perl-compiler

B::C - Moved over from googlecode
https://code.google.com/p/perl-compiler/
Other
63 stars 23 forks source link

CC: Warning: unresolved $section symbol s\\xxx #112

Closed rurban closed 9 years ago

rurban commented 9 years ago

Original issue 110 created by rurban on 2012-10-15T15:59:53.000Z:

pb -MO=CC,-v,-obinarytrees.perl.c ../shootout/bench/binarytrees/binarytrees.perl

vs

pb -MO=C,-v,-obinarytrees.perl.c ../shootout/bench/binarytrees/binarytrees.perl

Some ENTERSUB op fields are empty because those symbols were never visited, such as op->next and op->first.

{ 0, 0, /*OP_ENTERSUB*/NULL, 9, 173, 0, 1, 0, 0, 0, 0x46, 0x21, 0 }, /* unop_list[2] */

vs. { &op_list[8], &op_list[8], /_OPENTERSUB/NULL, 9, 173, 0, 1, 0, 0, 0, 0x46, 0x21, (OP_)&unoplist[4] }, / unop_list[3] */

rurban commented 9 years ago

Comment #1 originally posted by rurban on 2012-10-15T20:42:37.000Z:

Fixed with 91b6646

Save ENTERSUB next and first fields first is not not needed as its generally NULL, but next is needed to end the ENTERSUB loop (here unop_list[2])

DOOP(PL_ppaddr[OP_ENTERSUB]);
while (PL_op != ((OP*)&unop_list[2])->op_next &&  PL_op != (OP*)0 ){
    PL_op = (*PL_op->op_ppaddr)(aTHX);
    SPAGAIN;}

I keep the unresolved $section symbol s\xxx warning with verbose but added a better description.

This is most likely a critical internal compiler bug, esp. if in With B::C this is most likely a critical internal compiler bug, esp. if in an op section. With B::CC it can be caused by valid optimizations, e.g. when op->next pointers were inlined or inlined GV or CONST ops were optimized away.