tsan: allow environment to override OnReport() and OverrideFlags()


git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@160728 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/tsan/go/buildgo.sh b/lib/tsan/go/buildgo.sh
index 8551601..92835bc 100755
--- a/lib/tsan/go/buildgo.sh
+++ b/lib/tsan/go/buildgo.sh
@@ -48,6 +48,7 @@
         "
 fi
 
+SRCS+=$ADD_SRCS
 #ASMS="../rtl/tsan_rtl_amd64.S"
 
 rm -f gotsan.cc
diff --git a/lib/tsan/rtl/tsan_flags.cc b/lib/tsan/rtl/tsan_flags.cc
index 11a5ce6..8f91939 100644
--- a/lib/tsan/rtl/tsan_flags.cc
+++ b/lib/tsan/rtl/tsan_flags.cc
@@ -24,9 +24,13 @@
 }
 
 // Can be overriden in frontend.
+#ifdef TSAN_EXTERNAL_HOOKS
+void OverrideFlags(Flags *f);
+#else
 void WEAK OverrideFlags(Flags *f) {
   (void)f;
 }
+#endif
 
 void InitializeFlags(Flags *f, const char *env) {
   internal_memset(f, 0, sizeof(*f));
diff --git a/lib/tsan/rtl/tsan_rtl_report.cc b/lib/tsan/rtl/tsan_rtl_report.cc
index 85c84dd..f66e17e 100644
--- a/lib/tsan/rtl/tsan_rtl_report.cc
+++ b/lib/tsan/rtl/tsan_rtl_report.cc
@@ -38,10 +38,14 @@
 namespace __tsan {
 
 // Can be overriden by an application/test to intercept reports.
+#ifdef TSAN_EXTERNAL_HOOKS
+bool OnReport(const ReportDesc *rep, bool suppressed);
+#else
 bool WEAK OnReport(const ReportDesc *rep, bool suppressed) {
   (void)rep;
   return suppressed;
 }
+#endif
 
 static void StackStripMain(ReportStack *stack) {
   ReportStack *last_frame = 0;
@@ -50,12 +54,12 @@
   uptr prefix_len = internal_strlen(prefix);
   const char *path_prefix = flags()->strip_path_prefix;
   uptr path_prefix_len = internal_strlen(path_prefix);
+  char *pos;
   for (ReportStack *ent = stack; ent; ent = ent->next) {
     if (ent->func && 0 == internal_strncmp(ent->func, prefix, prefix_len))
       ent->func += prefix_len;
-    if (ent->file && 0 == internal_strncmp(ent->file, path_prefix,
-                                           path_prefix_len))
-      ent->file += path_prefix_len;
+    if (ent->file && (pos = internal_strstr(ent->file, path_prefix)))
+      ent->file = pos + path_prefix_len;
     if (ent->file && ent->file[0] == '.' && ent->file[1] == '/')
       ent->file += 2;
     last_frame2 = last_frame;