11
11
#include < range.hpp>
12
12
#include < segment.hpp>
13
13
#include < string>
14
- #include < struct.hpp>
15
14
16
15
#include " dwarfexport.h"
17
16
@@ -73,9 +72,9 @@ static Dwarf_P_Die add_struct_type(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
73
72
dwarfexport_log (" Member Count = " , member_count);
74
73
75
74
for (int i = 0 ; i < member_count; ++i) {
76
- udt_member_t member;
75
+ udm_t member;
77
76
member.offset = i;
78
- type.find_udt_member (&member, STRMEM_INDEX);
77
+ type.get_udm (&member, STRMEM_INDEX);
79
78
auto member_type = member.type ;
80
79
auto member_die =
81
80
dwarf_new_die (dbg, DW_TAG_member, die, NULL , NULL , NULL , &err);
@@ -98,7 +97,7 @@ static Dwarf_P_Die add_struct_type(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
98
97
// Add member location in struct
99
98
Dwarf_P_Expr loc_expr = dwarf_new_expr (dbg, &err);
100
99
if (dwarf_add_expr_gen (loc_expr, DW_OP_plus_uconst, member.offset / 8 , 0 ,
101
- &err) == DW_DLV_NOCOUNT) {
100
+ &err) == (Dwarf_Unsigned) DW_DLV_NOCOUNT) {
102
101
dwarfexport_error (" dwarf_add_expr_gen failed: " , dwarf_errmsg (err));
103
102
}
104
103
@@ -331,7 +330,7 @@ static Dwarf_P_Die add_variable(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
331
330
332
331
Dwarf_P_Expr loc_expr = dwarf_new_expr (dbg, &err);
333
332
if (dwarf_add_expr_gen (loc_expr, DW_OP_regx, reg_num, 0 , &err) ==
334
- DW_DLV_NOCOUNT) {
333
+ (Dwarf_Unsigned) DW_DLV_NOCOUNT) {
335
334
dwarfexport_error (" dwarf_add_expr_gen failed: " , dwarf_errmsg (err));
336
335
}
337
336
if (dwarf_add_AT_location_expr (dbg, die, DW_AT_location, loc_expr,
@@ -357,46 +356,45 @@ static void add_disassembler_func_info(std::shared_ptr<DwarfGenInfo> info,
357
356
auto dbg = info->dbg ;
358
357
Dwarf_Error err = 0 ;
359
358
360
- auto frame = get_frame (func);
361
- if (frame == nullptr ) {
359
+ tinfo_t frame;
360
+ if (!frame.get_func_frame (func)) {
361
+ return ;
362
+ }
363
+ udt_type_data_t frame_details;
364
+ if (!frame.get_udt_details (&frame_details)) {
362
365
return ;
363
366
}
364
367
365
- for (std::size_t i = 0 ; i < frame->memqty ; ++i) {
366
- auto name = get_member_name (frame->members [i].id );
368
+ for (std::size_t i = 0 ; i < frame_details.size (); ++i) {
369
+ udm_t *member = &frame_details[i];
370
+ qstring *name = &member->name ;
367
371
368
372
// Ignore these special 'variables'
369
- if (name == " s" || name == " r" ) {
373
+ if (* name == " s" || * name == " r" ) {
370
374
continue ;
371
375
}
372
376
373
- dwarfexport_log (" Adding local variable: " , & name[ 0 ] );
377
+ dwarfexport_log (" Adding local variable: " , name-> c_str () );
374
378
375
379
Dwarf_P_Die die;
376
380
die = dwarf_new_die (dbg, DW_TAG_variable, func_die, NULL , NULL , NULL , &err);
377
381
378
- if (dwarf_add_AT_name (die, & name[ 0 ] , &err) == NULL ) {
382
+ if (dwarf_add_AT_name (die, ( char *) name-> c_str () , &err) == NULL ) {
379
383
dwarfexport_error (" dwarf_add_AT_name failed: " , dwarf_errmsg (err));
380
384
}
381
385
382
386
auto loc_expr =
383
- disassembler_stack_lvar_location (dbg, func, &frame-> members [i] );
387
+ disassembler_stack_lvar_location (dbg, func, member );
384
388
385
389
if (loc_expr == nullptr ) {
386
390
continue ;
387
391
}
388
392
389
- auto member_struct = get_sptr (&frame->members [i]);
390
- if (member_struct) {
391
- tinfo_t type;
392
- if (guess_tinfo (&type, member_struct->id ) == GUESS_FUNC_OK) {
393
- auto var_type_die = get_or_add_type (dbg, cu, type, record);
394
- if (dwarf_add_AT_reference (dbg, die, DW_AT_type, var_type_die, &err) ==
395
- nullptr ) {
396
- dwarfexport_error (" dwarf_add_AT_reference failed: " ,
397
- dwarf_errmsg (err));
398
- }
399
- }
393
+ auto var_type_die = get_or_add_type (dbg, cu, member->type , record);
394
+ if (dwarf_add_AT_reference (dbg, die, DW_AT_type, var_type_die, &err) ==
395
+ nullptr ) {
396
+ dwarfexport_error (" dwarf_add_AT_reference failed: " ,
397
+ dwarf_errmsg (err));
400
398
}
401
399
402
400
if (dwarf_add_AT_location_expr (dbg, die, DW_AT_location, loc_expr, &err) ==
@@ -418,14 +416,12 @@ static void add_disassembler_func_info(std::shared_ptr<DwarfGenInfo> info,
418
416
* @param file An output file stream used for storing the decompiled source
419
417
* @param linecount The current number of lines in 'file'
420
418
* @param file_index The dwarf file index associated with 'cu'
421
- * @param symbol_index The symbol index associated with the function (unused)
422
419
* @param record The type record to update when adding variable types
423
420
*/
424
421
static void add_decompiler_func_info (std::shared_ptr<DwarfGenInfo> info,
425
422
Dwarf_P_Die cu, Dwarf_P_Die func_die,
426
423
func_t *func, std::ostream &file,
427
424
int &linecount, Dwarf_Unsigned file_index,
428
- Dwarf_Unsigned symbol_index,
429
425
type_record_t &record) {
430
426
auto dbg = info->dbg ;
431
427
auto err = info->err ;
@@ -562,7 +558,7 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
562
558
// TODO: what to do for non-bp based frames
563
559
Dwarf_P_Expr loc_expr = dwarf_new_expr (dbg, &err);
564
560
if (dwarf_add_expr_gen (loc_expr, DW_OP_call_frame_cfa, 0 , 0 , &err) ==
565
- DW_DLV_NOCOUNT) {
561
+ (Dwarf_Unsigned) DW_DLV_NOCOUNT) {
566
562
dwarfexport_error (" dwarf_add_expr_gen failed: " , dwarf_errmsg (err));
567
563
}
568
564
if (dwarf_add_AT_location_expr (dbg, die, DW_AT_frame_base, loc_expr, &err) ==
@@ -615,7 +611,7 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
615
611
false , &err);
616
612
617
613
add_decompiler_func_info (info, cu, die, func, file, linecount, file_index,
618
- 0 , record);
614
+ record);
619
615
} else {
620
616
add_disassembler_func_info (info, cu, die, func, record);
621
617
}
@@ -630,12 +626,10 @@ static Dwarf_P_Die add_function(std::shared_ptr<DwarfGenInfo> info,
630
626
*/
631
627
void add_structures (Dwarf_P_Debug dbg, Dwarf_P_Die cu, type_record_t &record) {
632
628
dwarfexport_log (" Adding unused types" );
633
- for (auto idx = get_first_struc_idx (); idx != BADADDR;
634
- idx = get_next_struc_idx (idx)) {
635
- auto tid = get_struc_by_idx (idx);
629
+ uint32 limit = get_ordinal_limit ();
630
+ for (uint32 i = 1 ; i < limit; ++i) {
636
631
tinfo_t type;
637
-
638
- if (guess_tinfo (&type, tid) == GUESS_FUNC_OK) {
632
+ if (type.get_numbered_type (i)) {
639
633
get_or_add_type (dbg, cu, type, record);
640
634
}
641
635
}
@@ -690,7 +684,8 @@ void add_global_variables(Dwarf_P_Debug dbg, Dwarf_P_Die cu,
690
684
691
685
// FIXME: this won't work in shared libs
692
686
Dwarf_P_Expr loc_expr = dwarf_new_expr (dbg, &err);
693
- if (dwarf_add_expr_addr_b (loc_expr, addr, 0 , &err) == DW_DLV_NOCOUNT) {
687
+ if (dwarf_add_expr_addr_b (loc_expr, addr, 0 , &err) ==
688
+ (Dwarf_Unsigned)DW_DLV_NOCOUNT) {
694
689
dwarfexport_error (" dwarf_add_expr_gen failed: " , dwarf_errmsg (err));
695
690
}
696
691
if (dwarf_add_AT_location_expr (dbg, die, DW_AT_location, loc_expr,
@@ -729,7 +724,7 @@ void add_debug_info(std::shared_ptr<DwarfGenInfo> info,
729
724
730
725
int linecount = 1 ;
731
726
type_record_t record;
732
- auto seg_qty = get_segm_qty ();
727
+ std:: size_t seg_qty = get_segm_qty ();
733
728
for (std::size_t segn = 0 ; segn < seg_qty; ++segn) {
734
729
auto seg = getnseg (segn);
735
730
if (seg == nullptr ) {
@@ -781,7 +776,7 @@ void add_debug_info(std::shared_ptr<DwarfGenInfo> info,
781
776
add_structures (dbg, cu, record);
782
777
}
783
778
784
- int idaapi init (void ) {
779
+ static plugmod_t * idaapi init (void ) {
785
780
if (init_hexrays_plugin ()) {
786
781
msg (" dwarfexport: Using decompiler\n " );
787
782
has_decompiler = true ;
@@ -847,8 +842,7 @@ bool idaapi run(size_t) {
847
842
write_dwarf_file (info, options);
848
843
}
849
844
} catch (const std::exception &e) {
850
- std::string msg = " A dwarfexport error occurred: " + std::string (e.what ());
851
- warning (msg.c_str ());
845
+ warning (" A dwarfexport error occurred: %s" , e.what ());
852
846
} catch (...) {
853
847
warning (" A dwarfexport error occurred" );
854
848
}
0 commit comments