[PATCH] D137013: [LoongArch][ASAN] Instrumentation pass now uses proper shadow offset

Youling Tang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 29 01:54:14 PDT 2022


tangyouling created this revision.
tangyouling added reviewers: SixWeining, xen0n, xry111, MaskRay, XiaodongLoong.
Herald added subscribers: Enna1, StephenFan, s.egerton, simoncook, hiraditya.
Herald added a project: All.
tangyouling requested review of this revision.
Herald added subscribers: llvm-commits, pcwang-thead.
Herald added a project: LLVM.

Instrumentation passes now use the proper shadow offset, there will be many
failures in testing ASAN when not having this patch.

The following error message will appear:

  $ ./lib/asan/tests/LOONGARCH64LinuxConfig/Asan-loongarch64-calls-Test
  AddressSanitizer:DEADLYSIGNAL
  =================================================================
  ==651209==ERROR: AddressSanitizer: SEGV on unknown address 0x1ffffe2dfa9b (pc 0x5555585e151c bp 0x7ffffb9ec070 sp 0x7ffffb9ebfd0 T0)
  ==651209==The signal is caused by a UNKNOWN memory access.

Before the patch:

  $ make check-asan
  Testing Time: 36.13s
    Unsupported      : 205
    Passed           :  83
    Expectedly Failed:   1
    Failed           : 239

After the patch:

  $ make check-asan
  Testing Time: 58.98s
    Unsupported      : 205
    Passed           : 421
    Expectedly Failed:   1
    Failed           :  89

I will continue to fix failed test cases in the future.

Depends on D137012 <https://reviews.llvm.org/D137012>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D137013

Files:
  llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp


Index: llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -106,6 +106,7 @@
 static const uint64_t kMIPS32_ShadowOffset32 = 0x0aaa0000;
 static const uint64_t kMIPS64_ShadowOffset64 = 1ULL << 37;
 static const uint64_t kAArch64_ShadowOffset64 = 1ULL << 36;
+static const uint64_t kLoongArch64_ShadowOffset64 = 1ULL << 46;
 static const uint64_t kRISCV64_ShadowOffset64 = 0xd55550000;
 static const uint64_t kFreeBSD_ShadowOffset32 = 1ULL << 30;
 static const uint64_t kFreeBSD_ShadowOffset64 = 1ULL << 46;
@@ -484,6 +485,7 @@
   bool IsMIPS64 = TargetTriple.isMIPS64();
   bool IsArmOrThumb = TargetTriple.isARM() || TargetTriple.isThumb();
   bool IsAArch64 = TargetTriple.getArch() == Triple::aarch64;
+  bool IsLoongArch64 = TargetTriple.getArch() == Triple::loongarch64;
   bool IsRISCV64 = TargetTriple.getArch() == Triple::riscv64;
   bool IsWindows = TargetTriple.isOSWindows();
   bool IsFuchsia = TargetTriple.isOSFuchsia();
@@ -555,6 +557,8 @@
       Mapping.Offset = kDynamicShadowSentinel;
     else if (IsAArch64)
       Mapping.Offset = kAArch64_ShadowOffset64;
+    else if (IsLoongArch64)
+      Mapping.Offset = kLoongArch64_ShadowOffset64;
     else if (IsRISCV64)
       Mapping.Offset = kRISCV64_ShadowOffset64;
     else if (IsAMDGPU)
@@ -578,7 +582,7 @@
   // we could OR the constant in a single instruction, but it's more
   // efficient to load it once and use indexed addressing.
   Mapping.OrShadowOffset = !IsAArch64 && !IsPPC64 && !IsSystemZ && !IsPS &&
-                           !IsRISCV64 &&
+                           !IsRISCV64 && !IsLoongArch64 &&
                            !(Mapping.Offset & (Mapping.Offset - 1)) &&
                            Mapping.Offset != kDynamicShadowSentinel;
   bool IsAndroidWithIfuncSupport =


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137013.471728.patch
Type: text/x-patch
Size: 1961 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221029/e998d72b/attachment.bin>


More information about the llvm-commits mailing list