1111
1212#include " Plugins/Process/Utility/RegisterContextDarwin_arm.h"
1313#include " Plugins/Process/Utility/RegisterContextDarwin_arm64.h"
14- #include " Plugins/Process/Utility/RegisterContextDarwin_i386.h"
1514#include " Plugins/Process/Utility/RegisterContextDarwin_riscv32.h"
1615#include " Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
1716#include " lldb/Core/Debugger.h"
8180#ifdef CPU_TYPE_ARM64_32
8281#undef CPU_TYPE_ARM64_32
8382#endif
84- #ifdef CPU_TYPE_I386
85- #undef CPU_TYPE_I386
86- #endif
8783#ifdef CPU_TYPE_X86_64
8884#undef CPU_TYPE_X86_64
8985#endif
@@ -358,122 +354,6 @@ class RegisterContextDarwin_x86_64_Mach : public RegisterContextDarwin_x86_64 {
358354 }
359355};
360356
361- class RegisterContextDarwin_i386_Mach : public RegisterContextDarwin_i386 {
362- public:
363- RegisterContextDarwin_i386_Mach (lldb_private::Thread &thread,
364- const DataExtractor &data)
365- : RegisterContextDarwin_i386(thread, 0 ) {
366- SetRegisterDataFrom_LC_THREAD (data);
367- }
368-
369- void InvalidateAllRegisters () override {
370- // Do nothing... registers are always valid...
371- }
372-
373- void SetRegisterDataFrom_LC_THREAD (const DataExtractor &data) {
374- lldb::offset_t offset = 0 ;
375- SetError (GPRRegSet, Read, -1 );
376- SetError (FPURegSet, Read, -1 );
377- SetError (EXCRegSet, Read, -1 );
378- bool done = false ;
379-
380- while (!done) {
381- int flavor = data.GetU32 (&offset);
382- if (flavor == 0 )
383- done = true ;
384- else {
385- uint32_t i;
386- uint32_t count = data.GetU32 (&offset);
387- switch (flavor) {
388- case GPRRegSet:
389- for (i = 0 ; i < count; ++i)
390- (&gpr.eax )[i] = data.GetU32 (&offset);
391- SetError (GPRRegSet, Read, 0 );
392- done = true ;
393-
394- break ;
395- case FPURegSet:
396- // TODO: fill in FPU regs....
397- // SetError (FPURegSet, Read, -1);
398- done = true ;
399-
400- break ;
401- case EXCRegSet:
402- exc.trapno = data.GetU32 (&offset);
403- exc.err = data.GetU32 (&offset);
404- exc.faultvaddr = data.GetU32 (&offset);
405- SetError (EXCRegSet, Read, 0 );
406- done = true ;
407- break ;
408- case 7 :
409- case 8 :
410- case 9 :
411- // fancy flavors that encapsulate of the above flavors...
412- break ;
413-
414- default :
415- done = true ;
416- break ;
417- }
418- }
419- }
420- }
421-
422- static bool Create_LC_THREAD (Thread *thread, Stream &data) {
423- RegisterContextSP reg_ctx_sp (thread->GetRegisterContext ());
424- if (reg_ctx_sp) {
425- RegisterContext *reg_ctx = reg_ctx_sp.get ();
426-
427- data.PutHex32 (GPRRegSet); // Flavor
428- data.PutHex32 (GPRWordCount);
429- PrintRegisterValue (reg_ctx, " eax" , nullptr , 4 , data);
430- PrintRegisterValue (reg_ctx, " ebx" , nullptr , 4 , data);
431- PrintRegisterValue (reg_ctx, " ecx" , nullptr , 4 , data);
432- PrintRegisterValue (reg_ctx, " edx" , nullptr , 4 , data);
433- PrintRegisterValue (reg_ctx, " edi" , nullptr , 4 , data);
434- PrintRegisterValue (reg_ctx, " esi" , nullptr , 4 , data);
435- PrintRegisterValue (reg_ctx, " ebp" , nullptr , 4 , data);
436- PrintRegisterValue (reg_ctx, " esp" , nullptr , 4 , data);
437- PrintRegisterValue (reg_ctx, " ss" , nullptr , 4 , data);
438- PrintRegisterValue (reg_ctx, " eflags" , nullptr , 4 , data);
439- PrintRegisterValue (reg_ctx, " eip" , nullptr , 4 , data);
440- PrintRegisterValue (reg_ctx, " cs" , nullptr , 4 , data);
441- PrintRegisterValue (reg_ctx, " ds" , nullptr , 4 , data);
442- PrintRegisterValue (reg_ctx, " es" , nullptr , 4 , data);
443- PrintRegisterValue (reg_ctx, " fs" , nullptr , 4 , data);
444- PrintRegisterValue (reg_ctx, " gs" , nullptr , 4 , data);
445-
446- // Write out the EXC registers
447- data.PutHex32 (EXCRegSet);
448- data.PutHex32 (EXCWordCount);
449- PrintRegisterValue (reg_ctx, " trapno" , nullptr , 4 , data);
450- PrintRegisterValue (reg_ctx, " err" , nullptr , 4 , data);
451- PrintRegisterValue (reg_ctx, " faultvaddr" , nullptr , 4 , data);
452- return true ;
453- }
454- return false ;
455- }
456-
457- protected:
458- int DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr) override { return 0 ; }
459-
460- int DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu) override { return 0 ; }
461-
462- int DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc) override { return 0 ; }
463-
464- int DoWriteGPR (lldb::tid_t tid, int flavor, const GPR &gpr) override {
465- return 0 ;
466- }
467-
468- int DoWriteFPU (lldb::tid_t tid, int flavor, const FPU &fpu) override {
469- return 0 ;
470- }
471-
472- int DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc) override {
473- return 0 ;
474- }
475- };
476-
477357class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
478358public:
479359 RegisterContextDarwin_arm_Mach (lldb_private::Thread &thread,
@@ -491,12 +371,11 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
491371 SetError (GPRRegSet, Read, -1 );
492372 SetError (FPURegSet, Read, -1 );
493373 SetError (EXCRegSet, Read, -1 );
494- bool done = false ;
495374
496- while (!done ) {
375+ while (offset < data. GetByteSize () ) {
497376 int flavor = data.GetU32 (&offset);
498377 uint32_t count = data.GetU32 (&offset);
499- lldb:: offset_t next_thread_state = offset + (count * 4 );
378+ offset_t next_thread_state = offset + (count * 4 );
500379 switch (flavor) {
501380 case GPRAltRegSet:
502381 case GPRRegSet: {
@@ -510,9 +389,7 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
510389
511390 SetError (GPRRegSet, Read, 0 );
512391 }
513- }
514- offset = next_thread_state;
515- break ;
392+ } break ;
516393
517394 case FPURegSet: {
518395 uint8_t *fpu_reg_buf = (uint8_t *)&fpu.floats ;
@@ -522,12 +399,8 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
522399 offset += fpu_reg_buf_size;
523400 fpu.fpscr = data.GetU32 (&offset);
524401 SetError (FPURegSet, Read, 0 );
525- } else {
526- done = true ;
527402 }
528- }
529- offset = next_thread_state;
530- break ;
403+ } break ;
531404
532405 case EXCRegSet:
533406 if (count == 3 ) {
@@ -536,14 +409,11 @@ class RegisterContextDarwin_arm_Mach : public RegisterContextDarwin_arm {
536409 exc.far = data.GetU32 (&offset);
537410 SetError (EXCRegSet, Read, 0 );
538411 }
539- done = true ;
540- offset = next_thread_state;
541412 break ;
542413
543- // Unknown register set flavor, stop trying to parse.
544414 default :
545- done = true ;
546415 }
416+ offset = next_thread_state;
547417 }
548418 }
549419
@@ -626,11 +496,10 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
626496 SetError (GPRRegSet, Read, -1 );
627497 SetError (FPURegSet, Read, -1 );
628498 SetError (EXCRegSet, Read, -1 );
629- bool done = false ;
630- while (!done) {
499+ while (offset < data.GetByteSize ()) {
631500 int flavor = data.GetU32 (&offset);
632501 uint32_t count = data.GetU32 (&offset);
633- lldb:: offset_t next_thread_state = offset + (count * 4 );
502+ offset_t next_thread_state = offset + (count * 4 );
634503 switch (flavor) {
635504 case GPRRegSet:
636505 // x0-x29 + fp + lr + sp + pc (== 33 64-bit registers) plus cpsr (1
@@ -645,7 +514,6 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
645514 gpr.cpsr = data.GetU32 (&offset);
646515 SetError (GPRRegSet, Read, 0 );
647516 }
648- offset = next_thread_state;
649517 break ;
650518 case FPURegSet: {
651519 uint8_t *fpu_reg_buf = (uint8_t *)&fpu.v [0 ];
@@ -654,25 +522,19 @@ class RegisterContextDarwin_arm64_Mach : public RegisterContextDarwin_arm64 {
654522 data.ExtractBytes (offset, fpu_reg_buf_size, eByteOrderLittle,
655523 fpu_reg_buf) == fpu_reg_buf_size) {
656524 SetError (FPURegSet, Read, 0 );
657- } else {
658- done = true ;
659525 }
660- }
661- offset = next_thread_state;
662- break ;
526+ } break ;
663527 case EXCRegSet:
664528 if (count == 4 ) {
665529 exc.far = data.GetU64 (&offset);
666530 exc.esr = data.GetU32 (&offset);
667531 exc.exception = data.GetU32 (&offset);
668532 SetError (EXCRegSet, Read, 0 );
669533 }
670- offset = next_thread_state;
671534 break ;
672535 default :
673- done = true ;
674- break ;
675536 }
537+ offset = next_thread_state;
676538 }
677539 }
678540
@@ -775,11 +637,10 @@ class RegisterContextDarwin_riscv32_Mach
775637 SetError (FPURegSet, Read, -1 );
776638 SetError (EXCRegSet, Read, -1 );
777639 SetError (CSRRegSet, Read, -1 );
778- bool done = false ;
779- while (!done) {
640+ while (offset < data.GetByteSize ()) {
780641 int flavor = data.GetU32 (&offset);
781642 uint32_t count = data.GetU32 (&offset);
782- lldb:: offset_t next_thread_state = offset + (count * 4 );
643+ offset_t next_thread_state = offset + (count * 4 );
783644 switch (flavor) {
784645 case GPRRegSet:
785646 // x0-x31 + pc
@@ -789,7 +650,6 @@ class RegisterContextDarwin_riscv32_Mach
789650 gpr.pc = data.GetU32 (&offset);
790651 SetError (GPRRegSet, Read, 0 );
791652 }
792- offset = next_thread_state;
793653 break ;
794654 case FPURegSet: {
795655 // f0-f31 + fcsr
@@ -799,22 +659,18 @@ class RegisterContextDarwin_riscv32_Mach
799659 fpr.fcsr = data.GetU32 (&offset);
800660 SetError (FPURegSet, Read, 0 );
801661 }
802- }
803- offset = next_thread_state;
804- break ;
662+ } break ;
805663 case EXCRegSet:
806664 if (count == 3 ) {
807665 exc.exception = data.GetU32 (&offset);
808666 exc.fsr = data.GetU32 (&offset);
809667 exc.far = data.GetU32 (&offset);
810668 SetError (EXCRegSet, Read, 0 );
811669 }
812- offset = next_thread_state;
813670 break ;
814671 default :
815- done = true ;
816- break ;
817672 }
673+ offset = next_thread_state;
818674 }
819675 }
820676
@@ -5408,16 +5264,6 @@ lldb_private::Address ObjectFileMachO::GetEntryPointAddress() {
54085264 done = true ;
54095265 }
54105266 break ;
5411- case llvm::MachO::CPU_TYPE_I386:
5412- if (flavor ==
5413- 1 ) // x86_THREAD_STATE32 from mach/i386/thread_status.h
5414- {
5415- offset += 40 ; // This is the offset of eip in the GPR thread state
5416- // data structure.
5417- start_address = m_data.GetU32 (&offset);
5418- done = true ;
5419- }
5420- break ;
54215267 case llvm::MachO::CPU_TYPE_X86_64:
54225268 if (flavor ==
54235269 4 ) // x86_THREAD_STATE64 from mach/i386/thread_status.h
@@ -5897,11 +5743,6 @@ ObjectFileMachO::GetThreadContextAtIndex(uint32_t idx,
58975743 std::make_shared<RegisterContextDarwin_arm_Mach>(thread, data);
58985744 break ;
58995745
5900- case llvm::MachO::CPU_TYPE_I386:
5901- reg_ctx_sp =
5902- std::make_shared<RegisterContextDarwin_i386_Mach>(thread, data);
5903- break ;
5904-
59055746 case llvm::MachO::CPU_TYPE_X86_64:
59065747 reg_ctx_sp =
59075748 std::make_shared<RegisterContextDarwin_x86_64_Mach>(thread, data);
@@ -6769,11 +6610,6 @@ bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
67696610 thread_sp.get (), LC_THREAD_datas[thread_idx]);
67706611 break ;
67716612
6772- case llvm::MachO::CPU_TYPE_I386:
6773- RegisterContextDarwin_i386_Mach::Create_LC_THREAD (
6774- thread_sp.get (), LC_THREAD_datas[thread_idx]);
6775- break ;
6776-
67776613 case llvm::MachO::CPU_TYPE_X86_64:
67786614 RegisterContextDarwin_x86_64_Mach::Create_LC_THREAD (
67796615 thread_sp.get (), LC_THREAD_datas[thread_idx]);
0 commit comments