diff --git a/llvm/lib/Transforms/Instrumentation/RealtimeSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/RealtimeSanitizer.cpp index 5ef6ffb58a7c1..adb0e518c6074 100644 --- a/llvm/lib/Transforms/Instrumentation/RealtimeSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/RealtimeSanitizer.cpp @@ -61,23 +61,21 @@ static void insertCallAtAllFunctionExitPoints(Function &Fn, insertCallBeforeInstruction(Fn, I, InsertFnName, FunctionArgs); } -static PreservedAnalyses rtsanPreservedCFGAnalyses() { - PreservedAnalyses PA; - PA.preserveSet(); - return PA; -} +static void runSanitizeRealtime(Function &Fn) { + if (Fn.empty()) + return; -static PreservedAnalyses runSanitizeRealtime(Function &Fn) { insertCallAtFunctionEntryPoint(Fn, "__rtsan_realtime_enter", {}); insertCallAtAllFunctionExitPoints(Fn, "__rtsan_realtime_exit", {}); - return rtsanPreservedCFGAnalyses(); } -static PreservedAnalyses runSanitizeRealtimeBlocking(Function &Fn) { +static void runSanitizeRealtimeBlocking(Function &Fn) { + if (Fn.empty()) + return; + IRBuilder<> Builder(&Fn.front().front()); Value *Name = Builder.CreateGlobalString(demangle(Fn.getName())); insertCallAtFunctionEntryPoint(Fn, "__rtsan_notify_blocking_call", {Name}); - return rtsanPreservedCFGAnalyses(); } PreservedAnalyses RealtimeSanitizerPass::run(Module &M, diff --git a/llvm/test/Instrumentation/RealtimeSanitizer/rtsan_attrib_declare.ll b/llvm/test/Instrumentation/RealtimeSanitizer/rtsan_attrib_declare.ll new file mode 100644 index 0000000000000..a5336b9e9e491 --- /dev/null +++ b/llvm/test/Instrumentation/RealtimeSanitizer/rtsan_attrib_declare.ll @@ -0,0 +1,12 @@ +; RUN: opt < %s -passes='rtsan' -S | FileCheck %s + +declare void @declared_realtime_function() sanitize_realtime #0 + +declare void @declared_blocking_function() sanitize_realtime_blocking #0 + +; RealtimeSanitizer pass should ignore attributed functions that are just declarations +; CHECK: declared_realtime_function +; CHECK-EMPTY: +; CHECK: declared_blocking_function +; CHECK-EMPTY: +