Compare commits

...

2 commits

Author SHA1 Message Date
Théophile Bastian b87020a5cd Ignore .dwarf_line entries of span 0
Some entries in .dwarf_line might span 0 instructions, because a
following entry refers to exactly the same address. An enhancement might
be to make all these addresses equivalent in the matcher.
2019-11-20 15:21:17 +01:00
Théophile Bastian 24a68dbba2 Show equivalence classes in html output 2019-11-20 15:20:53 +01:00
3 changed files with 62 additions and 18 deletions

View file

@ -49,19 +49,23 @@ let add_line_boxes render_data matcher_data dwarf_lines =
fold_ahead (fun (cur_render_data, cur_matcher_data) cur_reg reg_ahead -> fold_ahead (fun (cur_render_data, cur_matcher_data) cur_reg reg_ahead ->
let box_start = Z.to_int @@ cur_reg.Dwarf.lnr_address in let box_start = Z.to_int @@ cur_reg.Dwarf.lnr_address in
let box_end = Z.to_int @@ reg_ahead.Dwarf.lnr_address in let box_end = Z.to_int @@ reg_ahead.Dwarf.lnr_address in
Format.eprintf "Add box %x -- %x@." box_start box_end ; (match box_start = box_end with
let n_matcher_data, block_class_id = | true -> cur_render_data, cur_matcher_data
Asm_matcher.add_block cur_matcher_data cur_reg in | false ->
let n_render_data, _ = Renderer.add_box_excl Format.eprintf "Add box %x -- %x@." box_start box_end ;
cur_render_data (box_start, box_end) let n_matcher_data, block_class_id =
Renderer.(Some { Asm_matcher.add_block cur_matcher_data cur_reg in
box_file = Z.to_int cur_reg.lnr_file; let n_render_data, _ = Renderer.add_box_excl
box_line = Z.to_int cur_reg.lnr_line; cur_render_data (box_start, box_end)
box_col = Z.to_int cur_reg.lnr_column; Renderer.(Some {
box_class_id = block_class_id; box_file = Z.to_int cur_reg.lnr_file;
}) box_line = Z.to_int cur_reg.lnr_line;
in box_col = Z.to_int cur_reg.lnr_column;
(n_render_data, n_matcher_data)) box_class_id = block_class_id;
})
in
(n_render_data, n_matcher_data))
)
(cur_render_data, cur_matcher_data) reg_list) (cur_render_data, cur_matcher_data) reg_list)
(render_data, matcher_data) (render_data, matcher_data)
dwarf_lines dwarf_lines
@ -81,7 +85,6 @@ let _ =
!elf_files !elf_files
in in
(*
List.iter (fun (ElfHandle(path, _, static_info, _)) -> List.iter (fun (ElfHandle(path, _, static_info, _)) ->
let line_info = static_info.ds_evaluated_line_info in let line_info = static_info.ds_evaluated_line_info in
Format.eprintf "Line infos <%s>:@. %a@." Format.eprintf "Line infos <%s>:@. %a@."
@ -89,7 +92,6 @@ let _ =
(make_pp Dwarf.pp_evaluated_line_info) (make_pp Dwarf.pp_evaluated_line_info)
line_info ; line_info ;
) elf_handles ; ) elf_handles ;
*)
let map_with_state mapper initial_state lst = let map_with_state mapper initial_state lst =
List.fold_right (fun elt (cur_state, accu) -> List.fold_right (fun elt (cur_state, accu) ->

View file

@ -28,6 +28,7 @@ let render_prog_box annotated_prog = Jingoo.Jg_types.(Renderer.AnnotAsm.(
("bound", box_string @@ render_addr bound); ("bound", box_string @@ render_addr bound);
("data", box_string @@ Format.sprintf "[%d] File %d, %d:%d" ("data", box_string @@ Format.sprintf "[%d] File %d, %d:%d"
data.box_class_id data.box_file data.box_line data.box_col); data.box_class_id data.box_file data.box_line data.box_col);
("box_eq", box_int data.box_class_id);
] |> box_obj) ] |> box_obj)
row.instr_annot.Renderer.events) row.instr_annot.Renderer.events)
@ -49,6 +50,19 @@ let render_progs_box annotated_progs = Jingoo.Jg_types.(
|> box_list |> box_list
) )
module IntSet = Set.Make(struct type t = int let compare = compare end)
let prog_box_classes render_data = Jingoo.Jg_types.(
List.fold_left (fun accu prog ->
List.fold_left (fun accu (Renderer.TaggedRange(_, _, box)) ->
IntSet.add box.box_class_id accu)
accu prog.Renderer.render_boxes)
IntSet.empty render_data
|> IntSet.elements
|> List.map box_int
|> box_list
)
(** [render multi_render_data] renders the given [render_data] to a string. *) (** [render multi_render_data] renders the given [render_data] to a string. *)
let render multi_render_data = Jingoo.( let render multi_render_data = Jingoo.(
let annotated_progs = List.map (fun render_data -> let annotated_progs = List.map (fun render_data ->
@ -56,6 +70,7 @@ let render multi_render_data = Jingoo.(
Renderer.render_data_to_annotated_asm render_data) multi_render_data in Renderer.render_data_to_annotated_asm render_data) multi_render_data in
let models = [ let models = [
("progs", render_progs_box annotated_progs); ("progs", render_progs_box annotated_progs);
("box_classes", prog_box_classes multi_render_data);
] in ] in
Jg_template.from_file "src/render_html.jingoo" ~models:models Jg_template.from_file "src/render_html.jingoo" ~models:models
) )

View file

@ -50,6 +50,26 @@
background-color: #ffffb4; background-color: #ffffb4;
} }
</style> </style>
<script>
function hoverByClass(classname){
var colorover = "orange";
var colorout = "#ffffb4";
var elms=document.getElementsByClassName(classname);
for(var i=0;i<elms.length;i++){
elms[i].onmouseover = function(){
for(var k=0;k<elms.length;k++){
elms[k].style.backgroundColor=colorover;
}
};
elms[i].onmouseout = function(){
for(var k=0;k<elms.length;k++){
elms[k].style.backgroundColor=colorout;
}
};
}
}
</script>
</head> </head>
<body> <body>
<div class="prog_container"> <div class="prog_container">
@ -67,9 +87,10 @@
{% for row in subroutine.sub_asm %} {% for row in subroutine.sub_asm %}
{% for event in row.instr_events %} {% for event in row.instr_events %}
{% if event.typ == "start" %} {% if event.typ == "start" %}
<div class="instr_box" id="instr_box_{{ event.id }}" <div class="instr_box box_eq_{{ event.box_eq }}"
title="{{ event.data }}" id="instr_box_{{ event.id }}"
> title="{{ event.data }}"
>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<div class="sub_instr"> <div class="sub_instr">
@ -89,5 +110,11 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<script>
{% for class in box_classes %}
hoverByClass("box_eq_{{ class }}");
{% endfor %}
</script>
</body> </body>
</html> </html>