hctim created this revision.
hctim added reviewers: pcc, ostannard.
Herald added subscribers: llvm-commits, Sanitizers, cfe-commits, kristof.beyls, 
rovka.
Herald added projects: clang, Sanitizers, LLVM.

HWASan globals instruction selection lowering hasn't been implemented in
GlobalISel or FastISel. We need to ensure that we get SelectionDAGISel
in all cases where HWASan is enabled.

GlobalISel is the default ISel for aarch64 at -O0. All others go to
SelectionDAGISel. When we disable GlobalISel, we get FastISel, so
disable that too.

Add a regression test to HWASan, and tighten up the instruction
selection test to also include both PIC and static relocation models.

We intend to add lowering for at least GlobalISel at a later date, but this
is a temporary fix.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D82249

Files:
  clang/lib/Driver/SanitizerArgs.cpp
  clang/test/Driver/fsanitize.c
  compiler-rt/test/hwasan/TestCases/exported-tagged-global.c
  llvm/test/CodeGen/AArch64/tagged-globals.ll

Index: llvm/test/CodeGen/AArch64/tagged-globals.ll
===================================================================
--- llvm/test/CodeGen/AArch64/tagged-globals.ll
+++ llvm/test/CodeGen/AArch64/tagged-globals.ll
@@ -1,31 +1,70 @@
-; RUN: llc < %s | FileCheck %s
+; RUN: llc --relocation-model=static < %s | FileCheck %s
+; RUN: llc --relocation-model=pic < %s | FileCheck %s -check-prefix=CHECK-PIC
 
 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
 target triple = "aarch64-unknown-linux-android"
 
-@global = external hidden global i32
+@global = external global i32
 declare void @func()
 
 define i32* @global_addr() #0 {
   ; CHECK: global_addr:
-  ; CHECK: adrp x0, :pg_hi21_nc:global
-  ; CHECK: movk x0, #:prel_g3:global+4294967296
-  ; CHECK: add x0, x0, :lo12:global
+  ; CHECK: adrp [[REG:x[0-9]+]], :pg_hi21_nc:global
+  ; CHECK: movk [[REG]], #:prel_g3:global+4294967296
+  ; CHECK: add x0, [[REG]], :lo12:global
+  ; CHECK: ret
+
+  ; CHECK-PIC: global_addr:
+  ; CHECK-PIC: adrp [[REG:x[0-9]+]], :got:global
+  ; CHECK-PIC: ldr x0, {{\[}}[[REG]], :got_lo12:global]
+  ; CHECK-PIC: ret
+
   ret i32* @global
 }
 
 define i32 @global_load() #0 {
   ; CHECK: global_load:
-  ; CHECK: adrp x8, :pg_hi21_nc:global
-  ; CHECK: ldr w0, [x8, :lo12:global]
+  ; CHECK: adrp [[REG:x[0-9]+]], :pg_hi21_nc:global
+  ; CHECK: ldr w0, {{\[}}[[REG]], :lo12:global{{\]}}
+  ; CHECK: ret
+
+  ; CHECK-PIC: global_load:
+  ; CHECK-PIC: adrp [[REG:x[0-9]+]], :got:global
+  ; CHECK-PIC: ldr  [[REG]], {{\[}}[[REG]], :got_lo12:global]
+  ; CHECK-PIC: ldr w0, {{\[}}[[REG]]{{\]}}
+  ; CHECK-PIC: ret
+
   %load = load i32, i32* @global
   ret i32 %load
 }
 
+define void @global_store() #0 {
+  ; CHECK: global_store:
+  ; CHECK: adrp [[REG:x[0-9]+]], :pg_hi21_nc:global
+  ; CHECK: str wzr, {{\[}}[[REG]], :lo12:global{{\]}}
+  ; CHECK: ret
+
+  ; CHECK-PIC: global_store:
+  ; CHECK-PIC: adrp [[REG:x[0-9]+]], :got:global
+  ; CHECK-PIC: ldr  [[REG]], {{\[}}[[REG]], :got_lo12:global]
+  ; CHECK-PIC: str wzr, {{\[}}[[REG]]{{\]}}
+  ; CHECK-PIC: ret
+
+  store i32 0, i32* @global
+  ret void
+}
+
 define void ()* @func_addr() #0 {
   ; CHECK: func_addr:
-  ; CHECK: adrp x0, func
-  ; CHECK: add x0, x0, :lo12:func
+  ; CHECK: adrp [[REG:x[0-9]+]], func
+  ; CHECK: add x0, [[REG]], :lo12:func
+  ; CHECK: ret
+
+  ; CHECK-PIC: func_addr:
+  ; CHECK-PIC: adrp [[REG:x[0-9]+]], :got:func
+  ; CHECK-PIC: ldr  x0, {{\[}}[[REG]], :got_lo12:func]
+  ; CHECK-PIC: ret
+
   ret void ()* @func
 }
 
Index: compiler-rt/test/hwasan/TestCases/exported-tagged-global.c
===================================================================
--- /dev/null
+++ compiler-rt/test/hwasan/TestCases/exported-tagged-global.c
@@ -0,0 +1,16 @@
+// RUN: %clang_hwasan %s -o %t
+// RUN: %run %t
+// RUN: %clang_hwasan -O1 %s -o %t
+// RUN: %run %t
+
+static int global;
+
+__attribute__((optnone)) int* address_of_global() {
+  return &global;
+}
+
+int main(int argc, char **argv) {
+  int* global_address = address_of_global();
+  *global_address = 13;
+  return 0;
+}
Index: clang/test/Driver/fsanitize.c
===================================================================
--- clang/test/Driver/fsanitize.c
+++ clang/test/Driver/fsanitize.c
@@ -869,8 +869,12 @@
 // RUN: %clang -target x86_64-linux-gnu -fsanitize=hwaddress -fsanitize-hwaddress-abi=foo %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-HWASAN-FOO-ABI
 // CHECK-HWASAN-INTERCEPTOR-ABI: "-default-function-attr" "hwasan-abi=interceptor"
 // CHECK-HWASAN-INTERCEPTOR-ABI: "-target-feature" "+tagged-globals"
+// CHECK-HWASAN-INTERCEPTOR-ABI: "-mllvm" "--aarch64-enable-global-isel-at-O=-1"
+// CHECK-HWASAN-INTERCEPTOR-ABI: "-mllvm" "-fast-isel=false"
 // CHECK-HWASAN-PLATFORM-ABI: "-default-function-attr" "hwasan-abi=platform"
 // CHECK-HWASAN-PLATFORM-ABI: "-target-feature" "+tagged-globals"
+// CHECK-HWASAN-PLATFORM-ABI: "-mllvm" "--aarch64-enable-global-isel-at-O=-1"
+// CHECK-HWASAN-PLATFORM-ABI: "-mllvm" "-fast-isel=false"
 // CHECK-HWASAN-FOO-ABI: error: invalid value 'foo' in '-fsanitize-hwaddress-abi=foo'
 
 // RUN: %clang -target x86_64-linux-gnu -fsanitize=address,pointer-compare,pointer-subtract %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-POINTER-ALL
Index: clang/lib/Driver/SanitizerArgs.cpp
===================================================================
--- clang/lib/Driver/SanitizerArgs.cpp
+++ clang/lib/Driver/SanitizerArgs.cpp
@@ -1071,6 +1071,20 @@
   if (Sanitizers.has(SanitizerKind::HWAddress)) {
     CmdArgs.push_back("-target-feature");
     CmdArgs.push_back("+tagged-globals");
+
+    // Workaround for HWASan not implementing the +tagged-globals feature
+    // properly in GlobalISel, which is enabled by default at -O0 for aarch64.
+    // Once GlobalISel is disabled, -O0 uses FastISel, so we disable that as
+    // well to ensure we get SelectionDagISel where the feature is properly
+    // implemented.
+    // TODO(hctim): Implement proper ISel lowering for taking the address of
+    // tagged globals in at *least* GlobalISel. Probably okay to ignore FastISel
+    // as it's not part of any defaults set.
+    CmdArgs.push_back("-mllvm");
+    CmdArgs.push_back("--aarch64-enable-global-isel-at-O=-1"); // No GlobalISel.
+
+    CmdArgs.push_back("-mllvm");
+    CmdArgs.push_back("-fast-isel=false");
   }
 
   // MSan: Workaround for PR16386.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to