@@ -442,28 +442,6 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
442
442
m_sets[set].registers = m_set_reg_nums[set].data ();
443
443
}
444
444
445
- // We are going to create a map between remote (eRegisterKindProcessPlugin)
446
- // and local (eRegisterKindLLDB) register numbers. This map will give us
447
- // remote register numbers in increasing order for offset calculation.
448
- std::map<uint32_t , uint32_t > remote_to_local_regnum_map;
449
- for (const auto ® : m_regs)
450
- remote_to_local_regnum_map[reg.kinds [eRegisterKindProcessPlugin]] =
451
- reg.kinds [eRegisterKindLLDB];
452
-
453
- // At this stage we manually calculate g/G packet offsets of all primary
454
- // registers, only if target XML or qRegisterInfo packet did not send
455
- // an offset explicitly.
456
- uint32_t reg_offset = 0 ;
457
- for (auto const ®num_pair : remote_to_local_regnum_map) {
458
- if (m_regs[regnum_pair.second ].byte_offset == LLDB_INVALID_INDEX32 &&
459
- m_regs[regnum_pair.second ].value_regs == nullptr ) {
460
- m_regs[regnum_pair.second ].byte_offset = reg_offset;
461
-
462
- reg_offset = m_regs[regnum_pair.second ].byte_offset +
463
- m_regs[regnum_pair.second ].byte_size ;
464
- }
465
- }
466
-
467
445
// sort and unique all value registers and make sure each is terminated with
468
446
// LLDB_INVALID_REGNUM
469
447
@@ -485,24 +463,10 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
485
463
// Now update all value_regs with each register info as needed
486
464
const size_t num_regs = m_regs.size ();
487
465
for (size_t i = 0 ; i < num_regs; ++i) {
488
- if (m_value_regs_map.find (i) != m_value_regs_map.end ()) {
466
+ if (m_value_regs_map.find (i) != m_value_regs_map.end ())
489
467
m_regs[i].value_regs = m_value_regs_map[i].data ();
490
- // Assign a valid offset to all pseudo registers if not assigned by stub.
491
- // Pseudo registers with value_regs list populated will share same offset
492
- // as that of their corresponding primary register in value_regs list.
493
- if (m_regs[i].byte_offset == LLDB_INVALID_INDEX32) {
494
- uint32_t value_regnum = m_regs[i].value_regs [0 ];
495
- if (value_regnum != LLDB_INVALID_INDEX32)
496
- m_regs[i].byte_offset =
497
- GetRegisterInfoAtIndex (remote_to_local_regnum_map[value_regnum])
498
- ->byte_offset ;
499
- }
500
- } else
468
+ else
501
469
m_regs[i].value_regs = nullptr ;
502
-
503
- reg_offset = m_regs[i].byte_offset + m_regs[i].byte_size ;
504
- if (m_reg_data_byte_size < reg_offset)
505
- m_reg_data_byte_size = reg_offset;
506
470
}
507
471
508
472
// Expand all invalidation dependencies
@@ -648,6 +612,55 @@ void DynamicRegisterInfo::Finalize(const ArchSpec &arch) {
648
612
break ;
649
613
}
650
614
}
615
+
616
+ // At this stage call ConfigureOffsets to calculate register offsets for
617
+ // targets supporting dynamic offset calculation. It also calculates
618
+ // total byte size of register data.
619
+ ConfigureOffsets ();
620
+ }
621
+
622
+ void DynamicRegisterInfo::ConfigureOffsets () {
623
+ // We are going to create a map between remote (eRegisterKindProcessPlugin)
624
+ // and local (eRegisterKindLLDB) register numbers. This map will give us
625
+ // remote register numbers in increasing order for offset calculation.
626
+ std::map<uint32_t , uint32_t > remote_to_local_regnum_map;
627
+ for (const auto ® : m_regs)
628
+ remote_to_local_regnum_map[reg.kinds [eRegisterKindProcessPlugin]] =
629
+ reg.kinds [eRegisterKindLLDB];
630
+
631
+ // At this stage we manually calculate g/G packet offsets of all primary
632
+ // registers, only if target XML or qRegisterInfo packet did not send
633
+ // an offset explicitly.
634
+ uint32_t reg_offset = 0 ;
635
+ for (auto const ®num_pair : remote_to_local_regnum_map) {
636
+ if (m_regs[regnum_pair.second ].byte_offset == LLDB_INVALID_INDEX32 &&
637
+ m_regs[regnum_pair.second ].value_regs == nullptr ) {
638
+ m_regs[regnum_pair.second ].byte_offset = reg_offset;
639
+
640
+ reg_offset = m_regs[regnum_pair.second ].byte_offset +
641
+ m_regs[regnum_pair.second ].byte_size ;
642
+ }
643
+ }
644
+
645
+ // Now update all value_regs with each register info as needed
646
+ for (auto ® : m_regs) {
647
+ if (reg.value_regs != nullptr ) {
648
+ // Assign a valid offset to all pseudo registers if not assigned by stub.
649
+ // Pseudo registers with value_regs list populated will share same offset
650
+ // as that of their corresponding primary register in value_regs list.
651
+ if (reg.byte_offset == LLDB_INVALID_INDEX32) {
652
+ uint32_t value_regnum = reg.value_regs [0 ];
653
+ if (value_regnum != LLDB_INVALID_INDEX32)
654
+ reg.byte_offset =
655
+ GetRegisterInfoAtIndex (remote_to_local_regnum_map[value_regnum])
656
+ ->byte_offset ;
657
+ }
658
+ }
659
+
660
+ reg_offset = reg.byte_offset + reg.byte_size ;
661
+ if (m_reg_data_byte_size < reg_offset)
662
+ m_reg_data_byte_size = reg_offset;
663
+ }
651
664
}
652
665
653
666
bool DynamicRegisterInfo::IsReconfigurable () { return m_is_reconfigurable; }
0 commit comments