[compiler-rt] r178159 - tsan: print matched suppressions if print_suppressions=1 flag is provided
Alexander Potapenko
glider at google.com
Wed Mar 27 11:10:36 PDT 2013
Test por favor.
On Wed, Mar 27, 2013 at 9:59 PM, Dmitry Vyukov <dvyukov at google.com> wrote:
> Author: dvyukov
> Date: Wed Mar 27 12:59:57 2013
> New Revision: 178159
>
> URL: http://llvm.org/viewvc/llvm-project?rev=178159&view=rev
> Log:
> tsan: print matched suppressions if print_suppressions=1 flag is provided
>
>
> Modified:
> compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h
> compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
> compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
> compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc
> compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h Wed Mar 27 12:59:57 2013
> @@ -162,6 +162,7 @@ class ReportDesc;
> class RegionAlloc;
> class StackTrace;
> struct MBlock;
> +struct Suppression;
>
> } // namespace __tsan
>
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.cc Wed Mar 27 12:59:57 2013
> @@ -49,6 +49,7 @@ void InitializeFlags(Flags *f, const cha
> f->force_seq_cst_atomics = false;
> f->strip_path_prefix = "";
> f->suppressions = "";
> + f->print_suppressions = false;
> f->exitcode = 66;
> f->log_path = "stderr";
> f->atexit_sleep_ms = 1000;
> @@ -78,6 +79,7 @@ void InitializeFlags(Flags *f, const cha
> ParseFlag(env, &f->force_seq_cst_atomics, "force_seq_cst_atomics");
> ParseFlag(env, &f->strip_path_prefix, "strip_path_prefix");
> ParseFlag(env, &f->suppressions, "suppressions");
> + ParseFlag(env, &f->print_suppressions, "print_suppressions");
> ParseFlag(env, &f->exitcode, "exitcode");
> ParseFlag(env, &f->log_path, "log_path");
> ParseFlag(env, &f->atexit_sleep_ms, "atexit_sleep_ms");
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_flags.h Wed Mar 27 12:59:57 2013
> @@ -52,6 +52,8 @@ struct Flags {
> const char *strip_path_prefix;
> // Suppressions filename.
> const char *suppressions;
> + // Print matched suppressions at exit.
> + bool print_suppressions;
> // Override exit status if something was reported.
> int exitcode;
> // Write logs to "log_path.pid".
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Wed Mar 27 12:59:57 2013
> @@ -277,6 +277,9 @@ int Finalize(ThreadState *thr) {
> ctx->nmissed_expected);
> }
>
> + if (flags()->print_suppressions)
> + PrintMatchedSuppressions();
> +
> failed = OnFinalize(failed);
>
> StatAggregate(ctx->stat, thr->stat);
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.h Wed Mar 27 12:59:57 2013
> @@ -512,6 +512,7 @@ struct RacyAddress {
> struct FiredSuppression {
> ReportType type;
> uptr pc;
> + Suppression *supp;
> };
>
> struct Context {
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_report.cc Wed Mar 27 12:59:57 2013
> @@ -501,12 +501,13 @@ bool OutputReport(Context *ctx,
> const ReportStack *suppress_stack2) {
> atomic_store(&ctx->last_symbolize_time_ns, NanoTime(), memory_order_relaxed);
> const ReportDesc *rep = srep.GetReport();
> - uptr suppress_pc = IsSuppressed(rep->typ, suppress_stack1);
> + Suppression *supp = 0;
> + uptr suppress_pc = IsSuppressed(rep->typ, suppress_stack1, &supp);
> if (suppress_pc == 0)
> - suppress_pc = IsSuppressed(rep->typ, suppress_stack2);
> + suppress_pc = IsSuppressed(rep->typ, suppress_stack2, &supp);
> if (suppress_pc != 0) {
> - FiredSuppression supp = {srep.GetReport()->typ, suppress_pc};
> - ctx->fired_suppressions.PushBack(supp);
> + FiredSuppression s = {srep.GetReport()->typ, suppress_pc, supp};
> + ctx->fired_suppressions.PushBack(s);
> }
> if (OnReport(rep, suppress_pc != 0))
> return false;
> @@ -522,8 +523,12 @@ bool IsFiredSuppression(Context *ctx,
> if (ctx->fired_suppressions[k].type != srep.GetReport()->typ)
> continue;
> for (uptr j = 0; j < trace.Size(); j++) {
> - if (trace.Get(j) == ctx->fired_suppressions[k].pc)
> + FiredSuppression *s = &ctx->fired_suppressions[k];
> + if (trace.Get(j) == s->pc) {
> + if (s->supp)
> + s->supp->hit_count++;
> return true;
> + }
> }
> }
> return false;
> @@ -560,7 +565,7 @@ static bool IsJavaNonsense(const ReportD
> || (frame->func == 0 && frame->file == 0 && frame->line == 0
> && frame->module == 0)) {
> if (frame) {
> - FiredSuppression supp = {rep->typ, frame->pc};
> + FiredSuppression supp = {rep->typ, frame->pc, 0};
> CTX()->fired_suppressions.PushBack(supp);
> }
> return true;
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.cc Wed Mar 27 12:59:57 2013
> @@ -127,6 +127,7 @@ Suppression *SuppressionParse(Suppressio
> s->templ = (char*)internal_alloc(MBlockSuppression, end2 - line + 1);
> internal_memcpy(s->templ, line, end2 - line);
> s->templ[end2 - line] = 0;
> + s->hit_count = 0;
> }
> if (end[0] == 0)
> break;
> @@ -144,7 +145,7 @@ void InitializeSuppressions() {
> #endif
> }
>
> -uptr IsSuppressed(ReportType typ, const ReportStack *stack) {
> +uptr IsSuppressed(ReportType typ, const ReportStack *stack, Suppression **sp) {
> if (g_suppressions == 0 || stack == 0)
> return 0;
> SuppressionType stype;
> @@ -165,10 +166,38 @@ uptr IsSuppressed(ReportType typ, const
> SuppressionMatch(supp->templ, frame->file) ||
> SuppressionMatch(supp->templ, frame->module))) {
> DPrintf("ThreadSanitizer: matched suppression '%s'\n", supp->templ);
> + supp->hit_count++;
> + *sp = supp;
> return frame->pc;
> }
> }
> }
> return 0;
> }
> +
> +static const char *SuppTypeStr(SuppressionType t) {
> + switch (t) {
> + case SuppressionRace: return "race";
> + case SuppressionMutex: return "mutex";
> + case SuppressionThread: return "thread";
> + case SuppressionSignal: return "signal";
> + }
> + CHECK(0);
> + return "unknown";
> +}
> +
> +void PrintMatchedSuppressions() {
> + int hit_count = 0;
> + for (Suppression *supp = g_suppressions; supp; supp = supp->next)
> + hit_count += supp->hit_count;
> + if (hit_count == 0)
> + return;
> + Printf("ThreadSanitizer: Matched %d suppressions (pid=%d):\n",
> + hit_count, GetPid());
> + for (Suppression *supp = g_suppressions; supp; supp = supp->next) {
> + if (supp->hit_count == 0)
> + continue;
> + Printf("%d %s:%s\n", supp->hit_count, SuppTypeStr(supp->type), supp->templ);
> + }
> +}
> } // namespace __tsan
>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h?rev=178159&r1=178158&r2=178159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h (original)
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_suppressions.h Wed Mar 27 12:59:57 2013
> @@ -17,10 +17,6 @@
>
> namespace __tsan {
>
> -void InitializeSuppressions();
> -void FinalizeSuppressions();
> -uptr IsSuppressed(ReportType typ, const ReportStack *stack);
> -
> // Exposed for testing.
> enum SuppressionType {
> SuppressionRace,
> @@ -33,8 +29,13 @@ struct Suppression {
> Suppression *next;
> SuppressionType type;
> char *templ;
> + int hit_count;
> };
>
> +void InitializeSuppressions();
> +void FinalizeSuppressions();
> +void PrintMatchedSuppressions();
> +uptr IsSuppressed(ReportType typ, const ReportStack *stack, Suppression **sp);
> Suppression *SuppressionParse(Suppression *head, const char* supp);
> bool SuppressionMatch(char *templ, const char *str);
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Alexander Potapenko
Software Engineer
Google Moscow
More information about the llvm-commits
mailing list