@@ -355,6 +355,28 @@ struct Registers_REGDISPLAY : REGDISPLAY
355
355
void setFP (uint32_t value, uint32_t location) { pR11 = (PTR_UIntNative)location;}
356
356
};
357
357
358
+ struct ArmUnwindCursor : public libunwind ::AbstractUnwindCursor
359
+ {
360
+ Registers_REGDISPLAY *_registers;
361
+ public:
362
+ ArmUnwindCursor (Registers_REGDISPLAY *registers) : _registers(registers) {}
363
+ virtual bool validReg (int num) { return _registers->validRegister (num); }
364
+ virtual unw_word_t getReg (int num) { return _registers->getRegister (num); }
365
+ virtual void setReg (int num, unw_word_t value, unw_word_t location) { _registers->setRegister (num, value, location); }
366
+ virtual unw_word_t getRegLocation (int num) {abort ();}
367
+ virtual bool validFloatReg (int num) { return _registers->validFloatRegister (num); }
368
+ virtual unw_fpreg_t getFloatReg (int num) { return _registers->getFloatRegister (num); }
369
+ virtual void setFloatReg (int num, unw_fpreg_t value) { _registers->setFloatRegister (num, value); }
370
+ virtual int step (bool stage2 = false ) {abort ();}
371
+ virtual void getInfo (unw_proc_info_t *) {abort ();}
372
+ virtual void jumpto () {abort ();}
373
+ virtual bool isSignalFrame () { return false ; }
374
+ virtual bool getFunctionName (char *buf, size_t len, unw_word_t *off) {abort ();}
375
+ virtual void setInfoBasedOnIPRegister (bool isReturnAddress = false ) {abort ();}
376
+ virtual const char *getRegisterName (int num) {abort ();}
377
+ virtual void saveVFPAsX () {abort ();}
378
+ };
379
+
358
380
inline bool Registers_REGDISPLAY::validRegister (int num) const {
359
381
if (num == UNW_REG_SP || num == UNW_ARM_SP)
360
382
return true ;
@@ -798,7 +820,14 @@ bool UnwindHelpers::StepFrame(REGDISPLAY *regs, unw_word_t start_ip, uint32_t fo
798
820
}
799
821
800
822
#elif defined(_LIBUNWIND_ARM_EHABI)
801
- PORTABILITY_ASSERT (" StepFrame" );
823
+ size_t len = 0 ;
824
+ size_t off = 0 ;
825
+ const uint32_t *ehtp = decode_eht_entry (reinterpret_cast <const uint32_t *>(unwind_info), &off, &len);
826
+ ArmUnwindCursor unwindCursor ((Registers_REGDISPLAY*)regs);
827
+ if (_Unwind_VRS_Interpret ((_Unwind_Context *)&unwindCursor, ehtp, off, len) != _URC_CONTINUE_UNWIND)
828
+ {
829
+ return false ;
830
+ }
802
831
#else
803
832
PORTABILITY_ASSERT (" StepFrame" );
804
833
#endif
@@ -853,7 +882,10 @@ bool UnwindHelpers::GetUnwindProcInfo(PCODE pc, UnwindInfoSections &uwInfoSectio
853
882
}
854
883
855
884
#elif defined(_LIBUNWIND_ARM_EHABI)
856
- PORTABILITY_ASSERT (" GetUnwindProcInfo" );
885
+ if (uwInfoSections.arm_section == 0 || !uc.getInfoFromEHABISection (pc, uwInfoSections))
886
+ {
887
+ return false ;
888
+ }
857
889
#else
858
890
PORTABILITY_ASSERT (" GetUnwindProcInfo" );
859
891
#endif
0 commit comments