@@ -45,6 +45,26 @@ static void insertCallAtAllFunctionExitPoints(Function &Fn,
4545 insertCallBeforeInstruction (Fn, I, InsertFnName);
4646}
4747
48+ static PreservedAnalyses rtsanPreservedAnalyses () {
49+ PreservedAnalyses PA;
50+ PA.preserveSet <CFGAnalyses>();
51+ return PA;
52+ }
53+
54+ static void transformRealtimeUnsafeFunction (Function &F) {
55+ IRBuilder<> Builder (&F.front ().front ());
56+ Value *NameArg = Builder.CreateGlobalString (F.getName ());
57+
58+ FunctionType *FuncType =
59+ FunctionType::get (Type::getVoidTy (F.getContext ()),
60+ {PointerType::getUnqual (F.getContext ())}, false );
61+
62+ FunctionCallee Func = F.getParent ()->getOrInsertFunction (
63+ " __rtsan_expect_not_realtime" , FuncType);
64+
65+ Builder.CreateCall (Func, {NameArg});
66+ }
67+
4868RealtimeSanitizerPass::RealtimeSanitizerPass (
4969 const RealtimeSanitizerOptions &Options) {}
5070
@@ -53,10 +73,12 @@ PreservedAnalyses RealtimeSanitizerPass::run(Function &F,
5373 if (F.hasFnAttribute (Attribute::SanitizeRealtime)) {
5474 insertCallAtFunctionEntryPoint (F, " __rtsan_realtime_enter" );
5575 insertCallAtAllFunctionExitPoints (F, " __rtsan_realtime_exit" );
76+ return rtsanPreservedAnalyses ();
77+ }
5678
57- PreservedAnalyses PA;
58- PA. preserveSet <CFGAnalyses>( );
59- return PA ;
79+ if (F. hasFnAttribute (Attribute::SanitizeRealtimeUnsafe)) {
80+ transformRealtimeUnsafeFunction (F );
81+ return rtsanPreservedAnalyses () ;
6082 }
6183
6284 return PreservedAnalyses::all ();
0 commit comments