Skip to content

Commit 8dea68b

Browse files
Reduce pc_to_file_name time
1 parent d4b1a1e commit 8dea68b

File tree

1 file changed

+57
-38
lines changed

1 file changed

+57
-38
lines changed

src/main/java/golanganalyzerextension/function/GolangFunction.java

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)