Index: src/Unwind/AddressSpace.hpp =================================================================== --- src/Unwind/AddressSpace.hpp +++ src/Unwind/AddressSpace.hpp @@ -329,7 +329,7 @@ int length = 0; info.arm_section = (uintptr_t) dl_unwind_find_exidx( (_Unwind_Ptr) targetAddr, &length); - info.arm_section_length = length; + info.arm_section_length = (uintptr_t)length; _LIBUNWIND_TRACE_UNWINDING("findUnwindSections: section %X length %x\n", info.arm_section, info.arm_section_length); if (info.arm_section && info.arm_section_length) Index: src/Unwind/Unwind-EHABI.cpp =================================================================== --- src/Unwind/Unwind-EHABI.cpp +++ src/Unwind/Unwind-EHABI.cpp @@ -30,7 +30,7 @@ // signinficant byte. uint8_t getByte(uint32_t* data, size_t offset) { uint8_t* byteData = reinterpret_cast(data); - return byteData[(offset & ~0x03) + (3 - (offset&0x03))]; + return byteData[(offset & ~(size_t)0x03) + (3 - (offset & (size_t)0x03))]; } const char* getNextWord(const char* data, uint32_t* out) { @@ -73,7 +73,8 @@ struct _Unwind_Context* context, Descriptor::Format format, const char* descriptorStart, - int flags) { + uint32_t flags) { + // EHT is inlined in the index using compact form. No descriptors. #5 if (flags & 0x1) return _URC_CONTINUE_UNWIND; @@ -106,8 +107,8 @@ static_cast((length & 0x1) | ((offset & 0x1) << 1)); // Clear off flag from last bit. - length &= ~1; - offset &= ~1; + length &= ~(uint32_t)0x1; + offset &= ~(uint32_t)0x1; uintptr_t scopeStart = ucbp->pr_cache.fnstart + offset; uintptr_t scopeEnd = scopeStart + length; uintptr_t pc = _Unwind_GetIP(context); @@ -209,7 +210,7 @@ // Generates mask discriminator for _Unwind_VRS_Pop, e.g. for _UVRSC_VFP / // _UVRSD_DOUBLE. uint32_t RegisterRange(uint8_t start, uint8_t count_minus_one) { - return (start << 16) | (count_minus_one + 1); + return ((uint32_t)start << 16) | ((uint32_t)count_minus_one + 1); } } // end anonymous namespace @@ -227,20 +228,21 @@ uint32_t sp; _Unwind_VRS_Get(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp); if (byte & 0x40) - sp -= ((byte & 0x3f) << 2) + 4; + sp -= (((uint32_t)byte & 0x3f) << 2) + 4; else - sp += (byte << 2) + 4; + sp += ((uint32_t)byte << 2) + 4; _Unwind_VRS_Set(context, _UVRSC_CORE, UNW_ARM_SP, _UVRSD_UINT32, &sp); } else { switch (byte & 0xf0) { case 0x80: { if (offset >= len) return _URC_FAILURE; - uint16_t registers = - ((byte & 0x0f) << 12) | (getByte(data, offset++) << 4); + uint32_t registers = + (((uint32_t)byte & 0x0f) << 12) | + (((uint32_t)getByte(data, offset++)) << 4); if (!registers) return _URC_FAILURE; - if (registers & (1<<15)) + if (registers & (1 << 15)) wrotePC = true; _Unwind_VRS_Pop(context, _UVRSC_CORE, registers, _UVRSD_UINT32); break; @@ -259,7 +261,7 @@ case 0xa0: { uint32_t registers = RegisterMask(4, byte & 0x07); if (byte & 0x08) - registers |= 1<<14; + registers |= 1 << 14; _Unwind_VRS_Pop(context, _UVRSC_CORE, registers, _UVRSD_UINT32); break; } @@ -758,15 +760,15 @@ case _UVRSC_CORE: if (representation != _UVRSD_UINT32 || regno > 15) return _UVRSR_FAILED; - return unw_set_reg(cursor, UNW_ARM_R0 + regno, *(unw_word_t *)valuep) == - UNW_ESUCCESS + return unw_set_reg(cursor, (unw_regnum_t)(UNW_ARM_R0 + regno), + *(unw_word_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_WMMXC: if (representation != _UVRSD_UINT32 || regno > 3) return _UVRSR_FAILED; - return unw_set_reg(cursor, UNW_ARM_WC0 + regno, *(unw_word_t *)valuep) == - UNW_ESUCCESS + return unw_set_reg(cursor, (unw_regnum_t)(UNW_ARM_WC0 + regno), + *(unw_word_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_VFP: @@ -781,14 +783,14 @@ if (regno > 31) return _UVRSR_FAILED; } - return unw_set_fpreg(cursor, UNW_ARM_D0 + regno, + return unw_set_fpreg(cursor, (unw_regnum_t)(UNW_ARM_D0 + regno), *(unw_fpreg_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_WMMXD: if (representation != _UVRSD_DOUBLE || regno > 31) return _UVRSR_FAILED; - return unw_set_fpreg(cursor, UNW_ARM_WR0 + regno, + return unw_set_fpreg(cursor, (unw_regnum_t)(UNW_ARM_WR0 + regno), *(unw_fpreg_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; @@ -806,15 +808,15 @@ case _UVRSC_CORE: if (representation != _UVRSD_UINT32 || regno > 15) return _UVRSR_FAILED; - return unw_get_reg(cursor, UNW_ARM_R0 + regno, (unw_word_t *)valuep) == - UNW_ESUCCESS + return unw_get_reg(cursor, (unw_regnum_t)(UNW_ARM_R0 + regno), + (unw_word_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_WMMXC: if (representation != _UVRSD_UINT32 || regno > 3) return _UVRSR_FAILED; - return unw_get_reg(cursor, UNW_ARM_WC0 + regno, (unw_word_t *)valuep) == - UNW_ESUCCESS + return unw_get_reg(cursor, (unw_regnum_t)(UNW_ARM_WC0 + regno), + (unw_word_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_VFP: @@ -829,14 +831,14 @@ if (regno > 31) return _UVRSR_FAILED; } - return unw_get_fpreg(cursor, UNW_ARM_D0 + regno, (unw_fpreg_t *)valuep) == - UNW_ESUCCESS + return unw_get_fpreg(cursor, (unw_regnum_t)(UNW_ARM_D0 + regno), + (unw_fpreg_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; case _UVRSC_WMMXD: if (representation != _UVRSD_DOUBLE || regno > 31) return _UVRSR_FAILED; - return unw_get_fpreg(cursor, UNW_ARM_WR0 + regno, + return unw_get_fpreg(cursor, (unw_regnum_t)(UNW_ARM_WR0 + regno), (unw_fpreg_t *)valuep) == UNW_ESUCCESS ? _UVRSR_OK : _UVRSR_FAILED; @@ -880,8 +882,8 @@ _UVRSD_UINT32, &sp) != _UVRSR_OK) { return _UVRSR_FAILED; } - for (int i = 0; i < 16; ++i) { - if (!(discriminator & (1<