Skip to content

Commit c1b9ea8

Browse files
authored
Merge pull request #54 from androm3da/rustc/9.0-2019-12-19
[libunwind] add hexagon support
2 parents e7aa4d5 + 536f8f0 commit c1b9ea8

9 files changed

+331
-1
lines changed

libunwind/include/__libunwind_config.h

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_OR1K 32
2424
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_MIPS 65
2525
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_SPARC 31
26+
#define _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON 34
2627

2728
#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
2829
# if defined(__i386__)
@@ -81,6 +82,12 @@
8182
# define _LIBUNWIND_CONTEXT_SIZE 16
8283
# define _LIBUNWIND_CURSOR_SIZE 24
8384
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_OR1K
85+
# elif defined(__hexagon__)
86+
# define _LIBUNWIND_TARGET_HEXAGON 1
87+
// Values here change when : Registers.hpp - hexagon_thread_state_t change
88+
# define _LIBUNWIND_CONTEXT_SIZE 18
89+
# define _LIBUNWIND_CURSOR_SIZE 24
90+
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON
8491
# elif defined(__mips__)
8592
# if defined(_ABIO32) && _MIPS_SIM == _ABIO32
8693
# define _LIBUNWIND_TARGET_MIPS_O32 1
@@ -132,6 +139,7 @@
132139
# define _LIBUNWIND_TARGET_MIPS_O32 1
133140
# define _LIBUNWIND_TARGET_MIPS_NEWABI 1
134141
# define _LIBUNWIND_TARGET_SPARC 1
142+
# define _LIBUNWIND_TARGET_HEXAGON 1
135143
# define _LIBUNWIND_CONTEXT_SIZE 167
136144
# define _LIBUNWIND_CURSOR_SIZE 179
137145
# define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287

libunwind/include/libunwind.h

+37
Original file line numberDiff line numberDiff line change
@@ -832,4 +832,41 @@ enum {
832832
UNW_SPARC_I7 = 31,
833833
};
834834

835+
// Hexagon register numbers
836+
enum {
837+
UNW_HEXAGON_R0,
838+
UNW_HEXAGON_R1,
839+
UNW_HEXAGON_R2,
840+
UNW_HEXAGON_R3,
841+
UNW_HEXAGON_R4,
842+
UNW_HEXAGON_R5,
843+
UNW_HEXAGON_R6,
844+
UNW_HEXAGON_R7,
845+
UNW_HEXAGON_R8,
846+
UNW_HEXAGON_R9,
847+
UNW_HEXAGON_R10,
848+
UNW_HEXAGON_R11,
849+
UNW_HEXAGON_R12,
850+
UNW_HEXAGON_R13,
851+
UNW_HEXAGON_R14,
852+
UNW_HEXAGON_R15,
853+
UNW_HEXAGON_R16,
854+
UNW_HEXAGON_R17,
855+
UNW_HEXAGON_R18,
856+
UNW_HEXAGON_R19,
857+
UNW_HEXAGON_R20,
858+
UNW_HEXAGON_R21,
859+
UNW_HEXAGON_R22,
860+
UNW_HEXAGON_R23,
861+
UNW_HEXAGON_R24,
862+
UNW_HEXAGON_R25,
863+
UNW_HEXAGON_R26,
864+
UNW_HEXAGON_R27,
865+
UNW_HEXAGON_R28,
866+
UNW_HEXAGON_R29,
867+
UNW_HEXAGON_R30,
868+
UNW_HEXAGON_R31,
869+
UNW_HEXAGON_P3_0,
870+
UNW_HEXAGON_PC,
871+
};
835872
#endif

libunwind/src/Registers.hpp

+181
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ enum {
3434
REGISTERS_MIPS_O32,
3535
REGISTERS_MIPS_NEWABI,
3636
REGISTERS_SPARC,
37+
REGISTERS_HEXAGON,
3738
};
3839

3940
#if defined(_LIBUNWIND_TARGET_I386)
@@ -3517,6 +3518,186 @@ inline const char *Registers_sparc::getRegisterName(int regNum) {
35173518
}
35183519
#endif // _LIBUNWIND_TARGET_SPARC
35193520

3521+
#if defined(_LIBUNWIND_TARGET_HEXAGON)
3522+
/// Registers_hexagon holds the register state of a thread in a Hexagon QDSP6
3523+
/// process.
3524+
class _LIBUNWIND_HIDDEN Registers_hexagon {
3525+
public:
3526+
Registers_hexagon();
3527+
Registers_hexagon(const void *registers);
3528+
3529+
bool validRegister(int num) const;
3530+
uint32_t getRegister(int num) const;
3531+
void setRegister(int num, uint32_t value);
3532+
bool validFloatRegister(int num) const;
3533+
double getFloatRegister(int num) const;
3534+
void setFloatRegister(int num, double value);
3535+
bool validVectorRegister(int num) const;
3536+
v128 getVectorRegister(int num) const;
3537+
void setVectorRegister(int num, v128 value);
3538+
const char *getRegisterName(int num);
3539+
void jumpto();
3540+
static int lastDwarfRegNum() { return _LIBUNWIND_HIGHEST_DWARF_REGISTER_HEXAGON; }
3541+
static int getArch() { return REGISTERS_HEXAGON; }
3542+
3543+
uint32_t getSP() const { return _registers.__r[UNW_HEXAGON_R29]; }
3544+
void setSP(uint32_t value) { _registers.__r[UNW_HEXAGON_R29] = value; }
3545+
uint32_t getIP() const { return _registers.__r[UNW_HEXAGON_PC]; }
3546+
void setIP(uint32_t value) { _registers.__r[UNW_HEXAGON_PC] = value; }
3547+
3548+
private:
3549+
struct hexagon_thread_state_t {
3550+
unsigned int __r[35];
3551+
};
3552+
3553+
hexagon_thread_state_t _registers;
3554+
};
3555+
3556+
inline Registers_hexagon::Registers_hexagon(const void *registers) {
3557+
static_assert((check_fit<Registers_hexagon, unw_context_t>::does_fit),
3558+
"hexagon registers do not fit into unw_context_t");
3559+
memcpy(&_registers, static_cast<const uint8_t *>(registers),
3560+
sizeof(_registers));
3561+
}
3562+
3563+
inline Registers_hexagon::Registers_hexagon() {
3564+
memset(&_registers, 0, sizeof(_registers));
3565+
}
3566+
3567+
inline bool Registers_hexagon::validRegister(int regNum) const {
3568+
if (regNum <= UNW_HEXAGON_R31)
3569+
return true;
3570+
return false;
3571+
}
3572+
3573+
inline uint32_t Registers_hexagon::getRegister(int regNum) const {
3574+
if (regNum >= UNW_HEXAGON_R0 && regNum <= UNW_HEXAGON_R31)
3575+
return _registers.__r[regNum - UNW_HEXAGON_R0];
3576+
3577+
switch (regNum) {
3578+
case UNW_REG_IP:
3579+
return _registers.__r[UNW_HEXAGON_PC];
3580+
case UNW_REG_SP:
3581+
return _registers.__r[UNW_HEXAGON_R29];
3582+
}
3583+
_LIBUNWIND_ABORT("unsupported hexagon register");
3584+
}
3585+
3586+
inline void Registers_hexagon::setRegister(int regNum, uint32_t value) {
3587+
if (regNum >= UNW_HEXAGON_R0 && regNum <= UNW_HEXAGON_R31) {
3588+
_registers.__r[regNum - UNW_HEXAGON_R0] = value;
3589+
return;
3590+
}
3591+
3592+
switch (regNum) {
3593+
case UNW_REG_IP:
3594+
_registers.__r[UNW_HEXAGON_PC] = value;
3595+
return;
3596+
case UNW_REG_SP:
3597+
_registers.__r[UNW_HEXAGON_R29] = value;
3598+
return;
3599+
}
3600+
_LIBUNWIND_ABORT("unsupported hexagon register");
3601+
}
3602+
3603+
inline bool Registers_hexagon::validFloatRegister(int /* regNum */) const {
3604+
return false;
3605+
}
3606+
3607+
inline double Registers_hexagon::getFloatRegister(int /* regNum */) const {
3608+
_LIBUNWIND_ABORT("hexagon float support not implemented");
3609+
}
3610+
3611+
inline void Registers_hexagon::setFloatRegister(int /* regNum */,
3612+
double /* value */) {
3613+
_LIBUNWIND_ABORT("hexagon float support not implemented");
3614+
}
3615+
3616+
inline bool Registers_hexagon::validVectorRegister(int /* regNum */) const {
3617+
return false;
3618+
}
3619+
3620+
inline v128 Registers_hexagon::getVectorRegister(int /* regNum */) const {
3621+
_LIBUNWIND_ABORT("hexagon vector support not implemented");
3622+
}
3623+
3624+
inline void Registers_hexagon::setVectorRegister(int /* regNum */, v128 /* value */) {
3625+
_LIBUNWIND_ABORT("hexagon vector support not implemented");
3626+
}
3627+
3628+
inline const char *Registers_hexagon::getRegisterName(int regNum) {
3629+
switch (regNum) {
3630+
case UNW_HEXAGON_R0:
3631+
return "r0";
3632+
case UNW_HEXAGON_R1:
3633+
return "r1";
3634+
case UNW_HEXAGON_R2:
3635+
return "r2";
3636+
case UNW_HEXAGON_R3:
3637+
return "r3";
3638+
case UNW_HEXAGON_R4:
3639+
return "r4";
3640+
case UNW_HEXAGON_R5:
3641+
return "r5";
3642+
case UNW_HEXAGON_R6:
3643+
return "r6";
3644+
case UNW_HEXAGON_R7:
3645+
return "r7";
3646+
case UNW_HEXAGON_R8:
3647+
return "r8";
3648+
case UNW_HEXAGON_R9:
3649+
return "r9";
3650+
case UNW_HEXAGON_R10:
3651+
return "r10";
3652+
case UNW_HEXAGON_R11:
3653+
return "r11";
3654+
case UNW_HEXAGON_R12:
3655+
return "r12";
3656+
case UNW_HEXAGON_R13:
3657+
return "r13";
3658+
case UNW_HEXAGON_R14:
3659+
return "r14";
3660+
case UNW_HEXAGON_R15:
3661+
return "r15";
3662+
case UNW_HEXAGON_R16:
3663+
return "r16";
3664+
case UNW_HEXAGON_R17:
3665+
return "r17";
3666+
case UNW_HEXAGON_R18:
3667+
return "r18";
3668+
case UNW_HEXAGON_R19:
3669+
return "r19";
3670+
case UNW_HEXAGON_R20:
3671+
return "r20";
3672+
case UNW_HEXAGON_R21:
3673+
return "r21";
3674+
case UNW_HEXAGON_R22:
3675+
return "r22";
3676+
case UNW_HEXAGON_R23:
3677+
return "r23";
3678+
case UNW_HEXAGON_R24:
3679+
return "r24";
3680+
case UNW_HEXAGON_R25:
3681+
return "r25";
3682+
case UNW_HEXAGON_R26:
3683+
return "r26";
3684+
case UNW_HEXAGON_R27:
3685+
return "r27";
3686+
case UNW_HEXAGON_R28:
3687+
return "r28";
3688+
case UNW_HEXAGON_R29:
3689+
return "r29";
3690+
case UNW_HEXAGON_R30:
3691+
return "r30";
3692+
case UNW_HEXAGON_R31:
3693+
return "r31";
3694+
default:
3695+
return "unknown register";
3696+
}
3697+
3698+
}
3699+
#endif // _LIBUNWIND_TARGET_HEXAGON
3700+
35203701
} // namespace libunwind
35213702

35223703
#endif // __REGISTERS_HPP__

libunwind/src/UnwindCursor.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,12 @@ class UnwindCursor : public AbstractUnwindCursor{
11111111
}
11121112
#endif
11131113

1114+
#if defined (_LIBUNWIND_TARGET_HEXAGON)
1115+
compact_unwind_encoding_t dwarfEncoding(Registers_hexagon &) const {
1116+
return 0;
1117+
}
1118+
#endif
1119+
11141120
#if defined (_LIBUNWIND_TARGET_MIPS_O32)
11151121
compact_unwind_encoding_t dwarfEncoding(Registers_mips_o32 &) const {
11161122
return 0;

libunwind/src/UnwindRegistersRestore.S

+42
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,48 @@ DEFINE_LIBUNWIND_FUNCTION(_ZN9libunwind14Registers_or1k6jumptoEv)
808808
l.jr r9
809809
l.nop
810810

811+
#elif defined(__hexagon__)
812+
# On entry:
813+
# thread_state pointer is in r2
814+
DEFINE_LIBUNWIND_FUNCTION(_ZN9libunwind17Registers_hexagon6jumptoEv)
815+
#
816+
# void libunwind::Registers_hexagon::jumpto()
817+
#
818+
r8 = memw(r0+#32)
819+
r9 = memw(r0+#36)
820+
r10 = memw(r0+#40)
821+
r11 = memw(r0+#44)
822+
823+
r12 = memw(r0+#48)
824+
r13 = memw(r0+#52)
825+
r14 = memw(r0+#56)
826+
r15 = memw(r0+#60)
827+
828+
r16 = memw(r0+#64)
829+
r17 = memw(r0+#68)
830+
r18 = memw(r0+#72)
831+
r19 = memw(r0+#76)
832+
833+
r20 = memw(r0+#80)
834+
r21 = memw(r0+#84)
835+
r22 = memw(r0+#88)
836+
r23 = memw(r0+#92)
837+
838+
r24 = memw(r0+#96)
839+
r25 = memw(r0+#100)
840+
r26 = memw(r0+#104)
841+
r27 = memw(r0+#108)
842+
843+
r28 = memw(r0+#112)
844+
r29 = memw(r0+#116)
845+
r30 = memw(r0+#120)
846+
r31 = memw(r0+#132)
847+
848+
r1 = memw(r0+#128)
849+
c4 = r1 // Predicate register
850+
r1 = memw(r0+#4)
851+
r0 = memw(r0)
852+
jumpr r31
811853
#elif defined(__mips__) && defined(_ABIO32) && _MIPS_SIM == _ABIO32
812854

813855
//

libunwind/src/UnwindRegistersSave.S

+46
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,52 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
945945
# zero epcr
946946
l.sw 132(r3), r0
947947

948+
#elif defined(__hexagon__)
949+
#
950+
# extern int unw_getcontext(unw_context_t* thread_state)
951+
#
952+
# On entry:
953+
# thread_state pointer is in r0
954+
#
955+
#define OFFSET(offset) (offset/4)
956+
DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
957+
memw(r0+#32) = r8
958+
memw(r0+#36) = r9
959+
memw(r0+#40) = r10
960+
memw(r0+#44) = r11
961+
962+
memw(r0+#48) = r12
963+
memw(r0+#52) = r13
964+
memw(r0+#56) = r14
965+
memw(r0+#60) = r15
966+
967+
memw(r0+#64) = r16
968+
memw(r0+#68) = r17
969+
memw(r0+#72) = r18
970+
memw(r0+#76) = r19
971+
972+
memw(r0+#80) = r20
973+
memw(r0+#84) = r21
974+
memw(r0+#88) = r22
975+
memw(r0+#92) = r23
976+
977+
memw(r0+#96) = r24
978+
memw(r0+#100) = r25
979+
memw(r0+#104) = r26
980+
memw(r0+#108) = r27
981+
982+
memw(r0+#112) = r28
983+
memw(r0+#116) = r29
984+
memw(r0+#120) = r30
985+
memw(r0+#124) = r31
986+
r1 = c4 // Predicate register
987+
memw(r0+#128) = r1
988+
r1 = memw(r30) // *FP == Saved FP
989+
r1 = r31
990+
memw(r0+#132) = r1
991+
992+
jumpr r31
993+
948994
#elif defined(__sparc__)
949995

950996
#

libunwind/src/assembly.h

+7
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,16 @@
7575
#define EXPORT_SYMBOL(name)
7676
#define HIDDEN_SYMBOL(name) .hidden name
7777
#define WEAK_SYMBOL(name) .weak name
78+
79+
#if defined(__hexagon__)
80+
#define WEAK_ALIAS(name, aliasname) \
81+
WEAK_SYMBOL(aliasname) SEPARATOR \
82+
.equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)
83+
#else
7884
#define WEAK_ALIAS(name, aliasname) \
7985
WEAK_SYMBOL(aliasname) SEPARATOR \
8086
SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
87+
#endif
8188

8289
#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
8390
defined(__linux__)

0 commit comments

Comments
 (0)