[libcxx-commits] [PATCH] D102912: [libunwind] AARCH64 use inline assembly for pointer authentication

Maksim Kita via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jun 9 07:24:14 PDT 2022


kitaisreal updated this revision to Diff 435540.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D102912/new/

https://reviews.llvm.org/D102912

Files:
  libunwind/src/DwarfInstructions.hpp


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();
@@ -259,17 +259,27 @@
 #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 (cieInfo.addressesSignedWithBKey) {
+          asm volatile("mov x17, %x0\n\t"
+                       "mov x16, %x1\n\t"
+                       "hint 0xe\n\t" // autib1716
+                       "mov %0, x17\n\t"
+                       : "+r"(returnAddress)
+                       : "r"(cfa)
+                       : "x16", "x17");
+        } else {
+          asm volatile("mov x17, %x0\n\t"
+                       "mov x16, %x1\n\t"
+                       "hint 0xc\n\t" // autia1716
+                       "mov %0, x17\n\t"
+                       : "+r"(returnAddress)
+                       : "r"(cfa)
+                       : "x16", "x17");
+        }
 #endif
       }
 #endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102912.435540.patch
Type: text/x-patch
Size: 2003 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20220609/3ca7ae70/attachment-0001.bin>


More information about the libcxx-commits mailing list