Wed Nov 24 00:22:00 2021 UTC ()
Teach the LLVM-derived unwinder about the DWARF pseudo-registers defined
by GCC for SuperH for GBR, MACH, MACL, and SR.


(thorpej)
diff -r1.36 -r1.37 src/sys/lib/libunwind/Registers.hpp

cvs diff -r1.36 -r1.37 src/sys/lib/libunwind/Registers.hpp (expand / switch to unified diff)

--- src/sys/lib/libunwind/Registers.hpp 2021/11/22 16:41:00 1.36
+++ src/sys/lib/libunwind/Registers.hpp 2021/11/24 00:21:59 1.37
@@ -645,56 +645,76 @@ public: @@ -645,56 +645,76 @@ public:
645private: 645private:
646 typedef uint32_t fpreg_t[3]; 646 typedef uint32_t fpreg_t[3];
647 647
648 uint32_t reg[REGNO_M68K_PC + 1]; 648 uint32_t reg[REGNO_M68K_PC + 1];
649 uint32_t dummy; 649 uint32_t dummy;
650 fpreg_t fpreg[8]; 650 fpreg_t fpreg[8];
651}; 651};
652 652
653enum { 653enum {
654 DWARF_SH3_R0 = 0, 654 DWARF_SH3_R0 = 0,
655 DWARF_SH3_R15 = 15, 655 DWARF_SH3_R15 = 15,
656 DWARF_SH3_PC = 16, 656 DWARF_SH3_PC = 16,
657 DWARF_SH3_PR = 17, 657 DWARF_SH3_PR = 17,
 658 DWARF_SH3_GBR = 18,
 659 DWARF_SH3_MACH = 20,
 660 DWARF_SH3_MACL = 21,
 661 DWARF_SH3_SR = 22,
658 662
659 REGNO_SH3_R0 = 0, 663 REGNO_SH3_R0 = 0,
660 REGNO_SH3_R15 = 15, 664 REGNO_SH3_R15 = 15,
661 REGNO_SH3_PC = 16, 665 REGNO_SH3_PC = 16,
662 REGNO_SH3_PR = 17, 666 REGNO_SH3_PR = 17,
 667 REGNO_SH3_GBR = 18,
 668 REGNO_SH3_MACH = 20,
 669 REGNO_SH3_MACL = 21,
 670 REGNO_SH3_SR = 22,
663}; 671};
664 672
665class Registers_SH3 { 673class Registers_SH3 {
666public: 674public:
667 enum { 675 enum {
668 LAST_REGISTER = REGNO_SH3_PR, 676 LAST_REGISTER = REGNO_SH3_SR,
669 LAST_RESTORE_REG = REGNO_SH3_PR, 677 LAST_RESTORE_REG = REGNO_SH3_SR,
670 RETURN_OFFSET = 0, 678 RETURN_OFFSET = 0,
671 RETURN_MASK = 0, 679 RETURN_MASK = 0,
672 }; 680 };
673 681
674 __dso_hidden Registers_SH3(); 682 __dso_hidden Registers_SH3();
675 683
676 static int dwarf2regno(int num) { 684 static int dwarf2regno(int num) {
677 if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15) 685 if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
678 return REGNO_SH3_R0 + (num - DWARF_SH3_R0); 686 return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
679 if (num == DWARF_SH3_PC) 687 switch (num) {
 688 case DWARF_SH3_PC:
680 return REGNO_SH3_PC; 689 return REGNO_SH3_PC;
681 if (num == DWARF_SH3_PR) 690 case DWARF_SH3_PR:
682 return REGNO_SH3_PR; 691 return REGNO_SH3_PR;
683 return LAST_REGISTER + 1; 692 case DWARF_SH3_GBR:
 693 return REGNO_SH3_GBR;
 694 case DWARF_SH3_MACH:
 695 return REGNO_SH3_MACH;
 696 case DWARF_SH3_MACL:
 697 return REGNO_SH3_MACL;
 698 case DWARF_SH3_SR:
 699 return REGNO_SH3_SR;
 700 default:
 701 return LAST_REGISTER + 1;
 702 }
684 } 703 }
685 704
686 bool validRegister(int num) const { 705 bool validRegister(int num) const {
687 return num >= 0 && num <= REGNO_SH3_PR; 706 return (num >= 0 && num <= REGNO_SH3_GBR) ||
 707 (num >= REGNO_SH3_MACH && num <= REGNO_SH3_SR);
688 } 708 }
689 709
690 uint64_t getRegister(int num) const { 710 uint64_t getRegister(int num) const {
691 assert(validRegister(num)); 711 assert(validRegister(num));
692 return reg[num]; 712 return reg[num];
693 } 713 }
694 714
695 void setRegister(int num, uint64_t value) { 715 void setRegister(int num, uint64_t value) {
696 assert(validRegister(num)); 716 assert(validRegister(num));
697 reg[num] = value; 717 reg[num] = value;
698 } 718 }
699 719
700 uint64_t getIP() const { return reg[REGNO_SH3_PC]; } 720 uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
@@ -702,27 +722,27 @@ public: @@ -702,27 +722,27 @@ public:
702 void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; } 722 void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
703 723
704 uint64_t getSP() const { return reg[REGNO_SH3_R15]; } 724 uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
705 725
706 void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; } 726 void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
707 727
708 bool validFloatVectorRegister(int num) const { return false; } 728 bool validFloatVectorRegister(int num) const { return false; }
709 729
710 void copyFloatVectorRegister(int num, uint64_t addr_) {} 730 void copyFloatVectorRegister(int num, uint64_t addr_) {}
711 731
712 __dso_hidden void jumpto() const __dead; 732 __dso_hidden void jumpto() const __dead;
713 733
714private: 734private:
715 uint32_t reg[REGNO_SH3_PR + 1]; 735 uint32_t reg[REGNO_SH3_SR + 1];
716}; 736};
717 737
718enum { 738enum {
719 DWARF_SPARC64_R0 = 0, 739 DWARF_SPARC64_R0 = 0,
720 DWARF_SPARC64_R31 = 31, 740 DWARF_SPARC64_R31 = 31,
721 DWARF_SPARC64_PC = 32, 741 DWARF_SPARC64_PC = 32,
722 742
723 REGNO_SPARC64_R0 = 0, 743 REGNO_SPARC64_R0 = 0,
724 REGNO_SPARC64_R14 = 14, 744 REGNO_SPARC64_R14 = 14,
725 REGNO_SPARC64_R15 = 15, 745 REGNO_SPARC64_R15 = 15,
726 REGNO_SPARC64_R31 = 31, 746 REGNO_SPARC64_R31 = 31,
727 REGNO_SPARC64_PC = 32, 747 REGNO_SPARC64_PC = 32,
728}; 748};