Index: llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1871,6 +1871,14 @@ return false; } + // Do not instrument user-defined sections (with names resembling + // valid C identifiers) + if (TargetTriple.isOSBinFormatELF()) { + if (std::all_of(Section.begin(), Section.end(), + [](char c) { return llvm::isAlnum(c) || c == '_'; })) + return false; + } + // On COFF, if the section name contains '$', it is highly likely that the // user is using section sorting to create an array of globals similar to // the way initialization callbacks are registered in .init_array and Index: llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-netbsd-link_set.ll =================================================================== --- /dev/null +++ llvm/test/Instrumentation/AddressSanitizer/do-not-instrument-netbsd-link_set.ll @@ -0,0 +1,14 @@ +; This test checks that NetBSD link_set array elements remain consecutive. +; RUN: opt < %s -asan -asan-module -S | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-netbsd" + +module asm ".hidden __stop_link_set_test_set" + +@data1 = dso_local global i32 1, align 4 +@data2 = dso_local global i32 2, align 4 +@__link_set_test_set_sym_data1 = internal constant i8* bitcast (i32* @data1 to i8*), section "link_set_test_set", align 8 +@__link_set_test_set_sym_data2 = internal constant i8* bitcast (i32* @data2 to i8*), section "link_set_test_set", align 8 +; CHECK: @__link_set_test_set_sym_data1 = internal constant i8*{{.*}}, section "link_set_test_set" +; CHECK-NEXT: @__link_set_test_set_sym_data2 = internal constant i8*{{.*}}, section "link_set_test_set" Index: llvm/test/Instrumentation/AddressSanitizer/instrument-section-invalid-c-ident.ll =================================================================== --- /dev/null +++ llvm/test/Instrumentation/AddressSanitizer/instrument-section-invalid-c-ident.ll @@ -0,0 +1,17 @@ +; This test checks that sections with names not resembling valid C identifiers +; are instrumented. +; RUN: opt < %s -asan -asan-module -S | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-netbsd" + +module asm ".hidden invalid$c$name" + +@data1 = dso_local global i32 1, align 4 +@data2 = dso_local global i32 2, align 4 +@__invalid$c$name_sym_data1 = internal constant i8* bitcast (i32* @data1 to i8*), section "invalid$c$name", align 8 +@__invalid$c$name_sym_data2 = internal constant i8* bitcast (i32* @data2 to i8*), section "invalid$c$name", align 8 +; CHECK: @"__invalid$c$name_sym_data1" = internal constant{{.*}}, section "invalid$c$name", comdat +; CHECK-NEXT: @"__invalid$c$name_sym_data2" = internal constant{{.*}}, section "invalid$c$name", comdat +; CHECK: @"__asan_global___invalid$c$name_sym_data1" +; CHECK-NEXT: @"__asan_global___invalid$c$name_sym_data2"