Index: libunwind/src/DwarfInstructions.hpp =================================================================== --- libunwind/src/DwarfInstructions.hpp +++ libunwind/src/DwarfInstructions.hpp @@ -67,7 +67,7 @@ return (pint_t)((sint_t)registers.getRegister((int)prolog.cfaRegister) + prolog.cfaRegisterOffset); if (prolog.cfaExpression != 0) - return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace, + return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace, registers, 0); assert(0 && "getCFA(): unknown location"); __builtin_unreachable(); @@ -218,17 +218,29 @@ #if !defined(_LIBUNWIND_IS_NATIVE_ONLY) return UNW_ECROSSRASIGNING; #else - register unsigned long long x17 __asm("x17") = returnAddress; - register unsigned long long x16 __asm("x16") = cfa; - // These are the autia1716/autib1716 instructions. The hint instructions // are used here as gcc does not assemble autia1716/autib1716 for pre // armv8.3a targets. - if (cieInfo.addressesSignedWithBKey) - asm("hint 0xe" : "+r"(x17) : "r"(x16)); // autib1716 - else - asm("hint 0xc" : "+r"(x17) : "r"(x16)); // autia1716 - returnAddress = x17; + + if (use_key_b) { + static const uint16_t autib1716 = 0xe; + asm volatile("mov x17, %x0;\n\t" + "mov x16, %x1;\n\t" + "hint %[key];\n\t" + "mov %0, x17\n\t" + : "+r"(pointer) + : "r"(modifier), [key] "i"(autib1716) + : "x16", "x17"); + } else { + static const uint16_t autia1716 = 0xc; + asm volatile("mov x17, %x0;\n\t" + "mov x16, %x1;\n\t" + "hint %[key];\n\t" + "mov %0, x17\n\t" + : "+r"(pointer) + : "r"(modifier), [key] "i"(autia1716) + : "x16", "x17"); + } #endif } #endif