Skip to content

Commit 12b0257

Browse files
authored
Reapply "[HWASan] remove incorrectly inferred attributes" (#106622) (#106624)
This reverts commit 66927fb. Fixed clang tests
1 parent e29c5f3 commit 12b0257

File tree

10 files changed

+451
-421
lines changed

10 files changed

+451
-421
lines changed

clang/test/CodeGen/address-safety-attr-flavors.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,57 +28,57 @@ int HasSanitizeAddress() { return 1; }
2828
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
2929
// CHECK-ASAN: Function Attrs: mustprogress noinline nounwind sanitize_address
3030
// CHECK-KASAN: Function Attrs: mustprogress noinline nounwind sanitize_address
31-
// CHECK-HWASAN: Function Attrs: mustprogress noinline nounwind sanitize_hwaddress
32-
// CHECK-KHWASAN: Function Attrs: mustprogress noinline nounwind sanitize_hwaddress
31+
// CHECK-HWASAN: Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress
32+
// CHECK-KHWASAN: Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress
3333

3434
__attribute__((no_sanitize("address"))) int NoSanitizeQuoteAddress() {
3535
return 0;
3636
}
3737
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
3838
// CHECK-ASAN: {{Function Attrs: mustprogress noinline nounwind$}}
3939
// CHECK-KASAN: {{Function Attrs: mustprogress noinline nounwind$}}
40-
// CHECK-HWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
41-
// CHECK-KHWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
40+
// CHECK-HWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
41+
// CHECK-KHWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
4242

4343
__attribute__((no_sanitize_address)) int NoSanitizeAddress() { return 0; }
4444
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
4545
// CHECK-ASAN: {{Function Attrs: mustprogress noinline nounwind$}}
4646
// CHECK-KASAN: {{Function Attrs: mustprogress noinline nounwind$}}
47-
// CHECK-HWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
48-
// CHECK-KHWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
47+
// CHECK-HWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
48+
// CHECK-KHWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
4949

5050
__attribute__((no_sanitize("kernel-address"))) int NoSanitizeKernelAddress() {
5151
return 0;
5252
}
5353
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
5454
// CHECK-ASAN: {{Function Attrs: mustprogress noinline nounwind$}}
5555
// CHECK-KASAN: {{Function Attrs: mustprogress noinline nounwind$}}
56-
// CHECK-HWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
57-
// CHECK-KHWASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_hwaddress$}}
56+
// CHECK-HWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
57+
// CHECK-KHWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind sanitize_hwaddress$}}
5858

5959
__attribute__((no_sanitize("hwaddress"))) int NoSanitizeHWAddress() {
6060
return 0;
6161
}
6262
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
6363
// CHECK-ASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_address$}}
6464
// CHECK-KASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_address$}}
65-
// CHECK-HWASAN: {{Function Attrs: mustprogress noinline nounwind$}}
66-
// CHECK-KHWASAN: {{Function Attrs: mustprogress noinline nounwind$}}
65+
// CHECK-HWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind$}}
66+
// CHECK-KHWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind$}}
6767

6868
__attribute__((no_sanitize("kernel-hwaddress"))) int NoSanitizeKernelHWAddress() {
6969
return 0;
7070
}
7171
// CHECK-NOASAN: {{Function Attrs: mustprogress noinline nounwind$}}
7272
// CHECK-ASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_address$}}
7373
// CHECK-KASAN: {{Function Attrs: mustprogress noinline nounwind sanitize_address$}}
74-
// CHECK-HWASAN: {{Function Attrs: mustprogress noinline nounwind$}}
75-
// CHECK-KHWASAN: {{Function Attrs: mustprogress noinline nounwind$}}
74+
// CHECK-HWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind$}}
75+
// CHECK-KHWASAN: {{Function Attrs: mustprogress nobuiltin noinline nounwind$}}
7676

7777
__attribute__((disable_sanitizer_instrumentation)) int DisableSanitizerInstrumentation() {
7878
return 0;
7979
}
8080
// CHECK-NOASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress noinline nounwind$}}
8181
// CHECK-ASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress noinline nounwind$}}
8282
// CHECK-KASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress noinline nounwind$}}
83-
// CHECK-HWASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress noinline nounwind$}}
84-
// CHECK-KHWASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress noinline nounwind$}}
83+
// CHECK-HWASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress nobuiltin noinline nounwind$}}
84+
// CHECK-KHWASAN: {{Function Attrs: disable_sanitizer_instrumentation mustprogress nobuiltin noinline nounwind$}}

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,24 @@ void HWAddressSanitizer::initializeModule() {
598598
LLVM_DEBUG(dbgs() << "Init " << M.getName() << "\n");
599599
TargetTriple = Triple(M.getTargetTriple());
600600

601+
for (auto &F : M.functions()) {
602+
// Remove memory attributes that are invalid with HWASan.
603+
// HWASan checks read from shadow, which invalidates memory(argmem: *)
604+
// Short granule checks on function arguments read from the argument memory
605+
// (last byte of the granule), which invalidates writeonly.
606+
//
607+
// This is not only true for sanitized functions, because AttrInfer can
608+
// infer those attributes on libc functions, which is not true if those
609+
// are instrumented (Android) or intercepted.
610+
611+
// nobuiltin makes sure later passes don't restore assumptions about
612+
// the function.
613+
F.addFnAttr(llvm::Attribute::NoBuiltin);
614+
F.removeFnAttr(llvm::Attribute::Memory);
615+
for (auto &A : F.args())
616+
A.removeAttr(llvm::Attribute::WriteOnly);
617+
}
618+
601619
// x86_64 currently has two modes:
602620
// - Intel LAM (default)
603621
// - pointer aliasing (heap only)
@@ -1622,14 +1640,6 @@ void HWAddressSanitizer::sanitizeFunction(Function &F,
16221640

16231641
assert(!ShadowBase);
16241642

1625-
// Remove memory attributes that are about to become invalid.
1626-
// HWASan checks read from shadow, which invalidates memory(argmem: *)
1627-
// Short granule checks on function arguments read from the argument memory
1628-
// (last byte of the granule), which invalidates writeonly.
1629-
F.removeFnAttr(llvm::Attribute::Memory);
1630-
for (auto &A : F.args())
1631-
A.removeAttr(llvm::Attribute::WriteOnly);
1632-
16331643
BasicBlock::iterator InsertPt = F.getEntryBlock().begin();
16341644
IRBuilder<> EntryIRB(&F.getEntryBlock(), InsertPt);
16351645
emitPrologue(EntryIRB,

0 commit comments

Comments
 (0)