From 9e1ccec8d5296fe786308f791e49dbb9640f5090 Mon Sep 17 00:00:00 2001 From: Anton Bikineev Date: Sat, 4 Apr 2020 21:55:10 +0200 Subject: [PATCH] tsan: don't instrument __attribute__((naked)) functions Naked functions are required to not have compiler generated prologues/epilogues, hence no instrumentation is needed for them. Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=45400 Differential Revision: https://reviews.llvm.org/D77477 --- llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp | 5 +++++ llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll | 13 +++++++++++++ 2 files changed, 18 insertions(+) diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index 9b7edad..e8882e4 100644 --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -441,6 +441,11 @@ bool ThreadSanitizer::sanitizeFunction(Function &F, // the module constructor. if (F.getName() == kTsanModuleCtorName) return false; + // Naked functions can not have prologue/epilogue + // (__tsan_func_entry/__tsan_func_exit) generated, so don't instrument them at + // all. + if (F.hasFnAttribute(Attribute::Naked)) + return false; initialize(*F.getParent()); SmallVector AllLoadsAndStores; SmallVector LocalLoadsAndStores; diff --git a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll index 953ab8e..100717a 100644 --- a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll +++ b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll @@ -78,5 +78,18 @@ define void @SwiftErrorCall(i8** swifterror) sanitize_thread { call void @SwiftError(i8** %0) ret void } + +; CHECK-LABEL: @NakedTest(i32* %a) +; CHECK-NEXT: call void @foo() +; CHECK-NEXT: %tmp1 = load i32, i32* %a, align 4 +; CHECK-NEXT: ret i32 %tmp1 +define i32 @NakedTest(i32* %a) naked sanitize_thread { + call void @foo() + %tmp1 = load i32, i32* %a, align 4 + ret i32 %tmp1 +} + +declare void @foo() nounwind + ; CHECK: define internal void @tsan.module_ctor() ; CHECK: call void @__tsan_init() -- 2.7.4