Browse Source

* llvm sometimes uses the AArch64 framepointer register as a regvar in the
main routine (because it can never return) -> attempt to guard against
invalid accesses in get_caller_addr

git-svn-id: trunk@44066 -
(cherry picked from commit d9f4c85d2e042f4cb41f868d51c7675923d25388)

Jonas Maebe 5 years ago
parent
commit
f858dce7fc
1 changed files with 7 additions and 0 deletions
  1. 7 0
      rtl/aarch64/aarch64.inc

+ 7 - 0
rtl/aarch64/aarch64.inc

@@ -166,7 +166,14 @@ function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;assembler; no
   asm
   asm
     cbz x0, .Lcaller_addr_invalid
     cbz x0, .Lcaller_addr_invalid
     ldur x0, [x0]
     ldur x0, [x0]
+{$ifndef cpullvm}
     cbz x0, .Lcaller_addr_invalid
     cbz x0, .Lcaller_addr_invalid
+{$else cpullvm}
+    movn w1, #0
+    cmp x0, x1
+    csel x0, xzr, x0, ls
+    b.ls .Lcaller_addr_invalid
+{$endif cpullvm}
     ldur x0, [x0, #8]
     ldur x0, [x0, #8]
    .Lcaller_addr_invalid:
    .Lcaller_addr_invalid:
   end;
   end;