Index: src/DwarfInstructions.hpp =================================================================== --- src/DwarfInstructions.hpp +++ src/DwarfInstructions.hpp @@ -213,7 +213,10 @@ // This is the autia1716 instruction. The hint instruction is used here // as gcc does not assemble autia1716 for pre armv8.3a targets. - asm("hint 0xc": "+r"(x17): "r"(x16)); + if (cieInfo.addressesSignedWithBKey) + asm("hint 0xe": "+r"(x17): "r"(x16)); + else + asm("hint 0xc": "+r"(x17): "r"(x16)); returnAddress = x17; #endif } Index: src/DwarfParser.hpp =================================================================== --- src/DwarfParser.hpp +++ src/DwarfParser.hpp @@ -49,6 +49,9 @@ bool isSignalFrame; bool fdesHaveAugmentationData; uint8_t returnAddressRegister; +#if defined(_LIBUNWIND_TARGET_AARCH64) + bool addressesSignedWithBKey; +#endif }; /// Information about an FDE (Frame Description Entry) @@ -263,6 +266,9 @@ cieInfo->dataAlignFactor = 0; cieInfo->isSignalFrame = false; cieInfo->fdesHaveAugmentationData = false; +#if defined(_LIBUNWIND_TARGET_AARCH64) + cieInfo->addressesSignedWithBKey = false; +#endif cieInfo->cieStart = cie; pint_t p = cie; pint_t cieLength = (pint_t)addressSpace.get32(p); @@ -326,6 +332,11 @@ case 'S': cieInfo->isSignalFrame = true; break; +#if defined(_LIBUNWIND_TARGET_AARCH64) + case 'B': + cieInfo->addressesSignedWithBKey = true; + break; +#endif default: // ignore unknown letters break;