@@ -404,6 +404,7 @@ private boolean init_file_line_map() {
404404 int i =0 ;
405405 boolean first =true ;
406406 int pc_offset =0 ;
407+ List <PcFile > pcfile_list =get_pc_to_file_name_list (pc_offset );
407408 while (true ) {
408409 int line_num_add ;
409410 int byte_size ;
@@ -425,9 +426,12 @@ private boolean init_file_line_map() {
425426 line_num_add =zig_zag_decode (line_num_add );
426427 line_num +=line_num_add ;
427428 pc_offset +=byte_size *go_bin .get_quantum ();
428- String file_name =pc_to_file_name (pc_offset );
429- if (file_name ==null ) {
430- file_name ="not_found" ;
429+ String file_name ="not_found" ;
430+ for (PcFile pcfile : pcfile_list ) {
431+ if (pcfile .offset <pc_offset && pc_offset <=pcfile .offset +pcfile .size && pcfile .name !=null ) {
432+ file_name =pcfile .name ;
433+ break ;
434+ }
431435 }
432436
433437 file_line_comment_map .put (key , new FileLine (func_addr , key , pc_offset -key , file_name , line_num ));
@@ -505,7 +509,19 @@ private boolean init_frame_map() {
505509 return frame_size;
506510 }*/
507511
508- private String pc_to_file_name (int target_pc_offset ) {
512+ private class PcFile {
513+ int offset ;
514+ int size ;
515+ String name ;
516+
517+ public PcFile (int key , int size , String name ) {
518+ this .offset =key ;
519+ this .size =size ;
520+ this .name =name ;
521+ }
522+ }
523+
524+ private List <PcFile > get_pc_to_file_name_list (int target_pc_offset ) {
509525 boolean is_go116 =false ;
510526 boolean is_go118 =false ;
511527 if (go_bin .ge_go_version ("go1.16beta1" )) {
@@ -515,6 +531,7 @@ private String pc_to_file_name(int target_pc_offset) {
515531 is_go118 =true ;
516532 }
517533
534+ List <PcFile > pcfile_list =new ArrayList <>();
518535 int pointer_size =go_bin .get_pointer_size ();
519536 Address pcheader_base =go_bin .get_pcheader_base ();
520537 Address pcfile_base ;
@@ -531,7 +548,7 @@ private String pc_to_file_name(int target_pc_offset) {
531548 }
532549 } catch (BinaryAccessException e ) {
533550 Logger .append_message (String .format ("Failed to get pcfile base: info_addr=%s, message=%s" , info_addr , e .getMessage ()));
534- return null ;
551+ return pcfile_list ;
535552 }
536553
537554 long file_no =-1 ;
@@ -548,54 +565,56 @@ private String pc_to_file_name(int target_pc_offset) {
548565 i +=Integer .toBinaryString (byte_size ).length ()/8 +1 ;
549566 } catch (BinaryAccessException e ) {
550567 Logger .append_message (String .format ("Failed to get line num: info_addr=%s, message=%s" , info_addr , e .getMessage ()));
551- return null ;
568+ break ;
552569 }
553570
554571 if (file_no_add ==0 && !first ) {
555572 break ;
556573 }
557574 first =false ;
575+ int key =pc_offset ;
558576 file_no_add =zig_zag_decode (file_no_add );
559577 file_no +=file_no_add ;
560578 pc_offset +=byte_size *go_bin .get_quantum ();
561579
562- if (target_pc_offset <=pc_offset ) {
563- if (is_go116 ) {
564- Address file_name_addr ;
565- try {
566- int cu_offset =(int )go_bin .get_address_value (info_addr , (is_go118 ?4 :pointer_size )+4 *7 , 4 );
567- Address cutab_base ;
568- if (is_go118 ) {
569- cutab_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *4 , pointer_size ));
570- }else {
571- cutab_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *3 , pointer_size ));
572- }
573-
574- long file_no_offset =go_bin .get_address_value (cutab_base , (cu_offset +file_no )*4 , 4 );
575- Address file_base ;
576- if (is_go118 ) {
577- file_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *5 , pointer_size ));
578- }else {
579- file_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *4 , pointer_size ));
580- }
581- file_name_addr =go_bin .get_address (file_base , file_no_offset );
582- } catch (BinaryAccessException e ) {
583- Logger .append_message (String .format ("Failed to get file name addr: pcheader_addr=%s, pcfile_base=%s, file_no=%x, message=%s" , pcheader_base , pcfile_base , file_no , e .getMessage ()));
584- return null ;
585- }
586-
587- String file_name =go_bin .create_string_data (file_name_addr ).orElse (String .format ("not_found_%x" , file_name_addr .getOffset ()));
588- service .add_filename (file_name );
589- return file_name ;
590- }
580+ if (!is_go116 ) {
591581 if ((int )file_no -1 <0 || file_name_list .size ()<=(int )file_no -1 ) {
592582 Logger .append_message (String .format ("File name list index out of range: func_addr=%s, index=%x" , func_addr , (int )file_no -1 ));
593- return null ;
583+ pcfile_list .add (new PcFile (key , pc_offset -key , null ));
584+ continue ;
594585 }
595- return file_name_list .get ((int )file_no -1 );
586+ pcfile_list .add (new PcFile (key , pc_offset -key , file_name_list .get ((int )file_no -1 )));
587+ continue ;
596588 }
589+
590+ Address file_name_addr ;
591+ try {
592+ int cu_offset =(int )go_bin .get_address_value (info_addr , (is_go118 ?4 :pointer_size )+4 *7 , 4 );
593+ Address cutab_base ;
594+ if (is_go118 ) {
595+ cutab_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *4 , pointer_size ));
596+ }else {
597+ cutab_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *3 , pointer_size ));
598+ }
599+
600+ long file_no_offset =go_bin .get_address_value (cutab_base , (cu_offset +file_no )*4 , 4 );
601+ Address file_base ;
602+ if (is_go118 ) {
603+ file_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *5 , pointer_size ));
604+ }else {
605+ file_base =go_bin .get_address (pcheader_base , go_bin .get_address_value (pcheader_base , 8 +pointer_size *4 , pointer_size ));
606+ }
607+ file_name_addr =go_bin .get_address (file_base , file_no_offset );
608+ } catch (BinaryAccessException e ) {
609+ Logger .append_message (String .format ("Failed to get file name addr: pcheader_addr=%s, pcfile_base=%s, file_no=%x, message=%s" , pcheader_base , pcfile_base , file_no , e .getMessage ()));
610+ break ;
611+ }
612+
613+ String file_name =go_bin .create_string_data (file_name_addr ).orElse (String .format ("not_found_%x" , file_name_addr .getOffset ()));
614+ service .add_filename (file_name );
615+ pcfile_list .add (new PcFile (key , pc_offset -key , file_name ));
597616 }
598- return null ;
617+ return pcfile_list ;
599618 }
600619
601620 private int zig_zag_decode (int value ) {
0 commit comments