From 1ef6deb15bbf1b40fb4d4d08007fff0768eb7b0f Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 8 Apr 2025 15:53:11 -0700 Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-beta.1 [skip ci] --- .../hwasan/TestCases/Linux/release-shadow.c | 20 +++++++++++-------- .../hwasan/TestCases/heap-buffer-overflow.c | 4 ++-- .../TestCases/tag-mismatch-border-address.c | 6 ++++-- .../secondary/compiler-rt/lib/hwasan/BUILD.gn | 18 +++++++++++++---- .../compiler-rt/test/hwasan/BUILD.gn | 2 +- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c index 705f5e6f433cc..988de511ae1af 100644 --- a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c +++ b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -17,17 +18,17 @@ const unsigned char kTag = 42; const size_t kNumShadowPages = 1024; const size_t kNumPages = 16 * kNumShadowPages; -const size_t kPageSize = 4096; -const size_t kMapSize = kNumPages * kPageSize; + +size_t page_size, map_size; void sync_rss() { - char *page = (char *)mmap(0, kPageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + char *page = (char *)mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); // Linux kernel updates RSS counters after a set number of page faults. for (int i = 0; i < 100; ++i) { page[0] = 42; - madvise(page, kPageSize, MADV_DONTNEED); + madvise(page, page_size, MADV_DONTNEED); } - munmap(page, kPageSize); + munmap(page, page_size); } size_t current_rss() { @@ -45,9 +46,9 @@ size_t current_rss() { } int test_rss_difference(void *p) { - __hwasan_tag_memory(p, kTag, kMapSize); + __hwasan_tag_memory(p, kTag, map_size); size_t rss_before = current_rss(); - __hwasan_tag_memory(p, 0, kMapSize); + __hwasan_tag_memory(p, 0, map_size); size_t rss_after = current_rss(); fprintf(stderr, "%zu -> %zu\n", rss_before, rss_after); if (rss_before <= rss_after) @@ -59,10 +60,13 @@ int test_rss_difference(void *p) { } int main() { + page_size = getauxval(AT_PAGESZ); + map_size = kNumPages * page_size; + fprintf(stderr, "starting rss %zu\n", current_rss()); fprintf(stderr, "shadow pages: %zu\n", kNumShadowPages); - void *p = mmap(0, kMapSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + void *p = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); fprintf(stderr, "p = %p\n", p); size_t total_count = 10; diff --git a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c index d390017dd7555..a4923fa4071cd 100644 --- a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c +++ b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c @@ -47,11 +47,11 @@ int main(int argc, char **argv) { // CHECKm30: Cause: heap-buffer-overflow // CHECKm30: is located 30 bytes before a 30-byte region // - // CHECKMm30: is a large allocated heap chunk; size: 1003520 offset: -30 + // CHECKMm30: is a large allocated heap chunk; size: {{[0-9]*}} offset: -30 // CHECKMm30: Cause: heap-buffer-overflow // CHECKMm30: is located 30 bytes before a 1000000-byte region // - // CHECKM: is a large allocated heap chunk; size: 1003520 offset: 1000000 + // CHECKM: is a large allocated heap chunk; size: {{[0-9]*}} offset: 1000000 // CHECKM: Cause: heap-buffer-overflow // CHECKM: is located 0 bytes after a 1000000-byte region // diff --git a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c index bffb8a0dfb042..a9fd7d66d8c10 100644 --- a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c +++ b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c @@ -7,14 +7,16 @@ #include #include #include +#include #include static volatile char sink; extern void *__hwasan_shadow_memory_dynamic_address; int main(int argc, char **argv) { - void *high_addr = (char *)__hwasan_shadow_memory_dynamic_address - 0x1000; - void *r = mmap(high_addr, 4096, PROT_READ, MAP_FIXED | MAP_ANON | MAP_PRIVATE, + size_t page_size = getauxval(AT_PAGESZ); + void *high_addr = (char *)__hwasan_shadow_memory_dynamic_address - page_size; + void *r = mmap(high_addr, page_size, PROT_READ, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (r == MAP_FAILED) { fprintf(stderr, "Failed to mmap\n"); diff --git a/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn index 0f1d3d2a50e34..15a4d8f6017c6 100644 --- a/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn +++ b/llvm/utils/gn/secondary/compiler-rt/lib/hwasan/BUILD.gn @@ -88,6 +88,13 @@ source_set("cxx_sources") { sources = [ "hwasan_new_delete.cpp" ] } +source_set("preinit_sources") { + configs -= [ "//llvm/utils/gn/build:llvm_code" ] + configs += [ "//llvm/utils/gn/build:crt_code" ] + defines = [ "HWASAN_WITH_INTERCEPTORS=1" ] + sources = [ "hwasan_preinit.cpp" ] +} + static_library("hwasan_static") { output_dir = crt_current_out_dir output_name = "clang_rt.$hwasan_name$crt_current_target_suffix" @@ -97,7 +104,10 @@ static_library("hwasan_static") { "//llvm/utils/gn/build:thin_archive", ] configs += [ "//llvm/utils/gn/build:crt_code" ] - deps = [ ":sources" ] + deps = [ + ":preinit_sources", + ":sources", + ] } static_library("hwasan_cxx") { @@ -131,22 +141,22 @@ shared_library("hwasan_shared") { static_library("hwasan_preinit") { output_dir = crt_current_out_dir - output_name = "clang_rt.${hwasan_name}-preinit$crt_current_target_suffix" + output_name = "clang_rt.hwasan-preinit$crt_current_target_suffix" complete_static_lib = true configs -= [ "//llvm/utils/gn/build:llvm_code", "//llvm/utils/gn/build:thin_archive", ] configs += [ "//llvm/utils/gn/build:crt_code" ] - sources = [ "hwasan_preinit.cpp" ] + deps = [ ":preinit_sources" ] } group("hwasan") { deps = [ + ":hwasan_cxx", ":hwasan_preinit", ":hwasan_shared", ":hwasan_static", - ":hwasan_cxx", ":version_script", ] } diff --git a/llvm/utils/gn/secondary/compiler-rt/test/hwasan/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/test/hwasan/BUILD.gn index 7bdf9c2b994c9..4bdc70db2f4ca 100644 --- a/llvm/utils/gn/secondary/compiler-rt/test/hwasan/BUILD.gn +++ b/llvm/utils/gn/secondary/compiler-rt/test/hwasan/BUILD.gn @@ -58,7 +58,7 @@ if (current_toolchain != host_toolchain) { } supported_toolchains = [] -if (host_os == "linux" && host_cpu == "x64") { +if (host_os == "linux" && (host_cpu == "arm64" || host_cpu == "x64")) { supported_toolchains += [ "//llvm/utils/gn/build/toolchain:stage2_unix" ] } if (llvm_build_AArch64 && android_ndk_path != "") { From 3457eb6c2602043c1c44252d89ce01ec8fea313a Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 8 Apr 2025 16:09:46 -0700 Subject: [PATCH 2/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20introduced=20through=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-beta.1 [skip ci] --- compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c | 6 ++++-- .../test/hwasan/TestCases/tag-mismatch-border-address.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c index 988de511ae1af..c17dc8453f82c 100644 --- a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c +++ b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c @@ -22,7 +22,8 @@ const size_t kNumPages = 16 * kNumShadowPages; size_t page_size, map_size; void sync_rss() { - char *page = (char *)mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + char *page = (char *)mmap(0, page_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); // Linux kernel updates RSS counters after a set number of page faults. for (int i = 0; i < 100; ++i) { page[0] = 42; @@ -66,7 +67,8 @@ int main() { fprintf(stderr, "starting rss %zu\n", current_rss()); fprintf(stderr, "shadow pages: %zu\n", kNumShadowPages); - void *p = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + void *p = mmap(0, map_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); fprintf(stderr, "p = %p\n", p); size_t total_count = 10; diff --git a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c index a9fd7d66d8c10..ff3e3fc85e378 100644 --- a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c +++ b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c @@ -16,8 +16,8 @@ extern void *__hwasan_shadow_memory_dynamic_address; int main(int argc, char **argv) { size_t page_size = getauxval(AT_PAGESZ); void *high_addr = (char *)__hwasan_shadow_memory_dynamic_address - page_size; - void *r = mmap(high_addr, page_size, PROT_READ, MAP_FIXED | MAP_ANON | MAP_PRIVATE, - -1, 0); + void *r = mmap(high_addr, page_size, PROT_READ, + MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0); if (r == MAP_FAILED) { fprintf(stderr, "Failed to mmap\n"); abort();