Add DRD as an experimental tool.  Bart Van Assche is the maintainer.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7211 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_error.h b/exp-drd/drd_error.h
new file mode 100644
index 0000000..dc9ed1c
--- /dev/null
+++ b/exp-drd/drd_error.h
@@ -0,0 +1,125 @@
+/*
+  This file is part of drd, a data race detector.
+
+  Copyright (C) 2006-2007 Bart Van Assche
+  bart.vanassche@gmail.com
+
+  This program is free software; you can redistribute it and/or
+  modify it under the terms of the GNU General Public License as
+  published by the Free Software Foundation; either version 2 of the
+  License, or (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+  02111-1307, USA.
+
+  The GNU General Public License is contained in the file COPYING.
+*/
+
+
+#ifndef __DRD_ERROR_H
+#define __DRD_ERROR_H
+
+
+#include "pub_drd_bitmap.h"         // BmAccessTypeT
+#include "drd_thread.h"         // DrdThreadId
+#include "pub_tool_basics.h"    // SizeT
+#include "pub_tool_debuginfo.h" // SegInfo
+#include "pub_tool_errormgr.h"  // ExeContext
+
+
+/* DRD error types. */
+
+typedef enum {
+   DataRaceErr    = 1,
+   MutexErr       = 2,
+   CondRaceErr    = 3,
+   CondErr = 4,
+} DrdErrorKind;
+
+/* The classification of a faulting address. */
+typedef 
+enum { 
+   //Undescribed,   // as-yet unclassified
+   eStack, 
+   eUnknown,       // classification yielded nothing useful
+   //Freed,
+   eMallocd, 
+   eSegment,       // in a segment (as defined in pub_tool_debuginfo.h)
+   //UserG,         // in a user-defined block
+   //Mempool,       // in a mempool
+   //Register,      // in a register;  for Param errors only
+}
+   AddrKind;
+
+/* Records info about a faulting address. */
+typedef
+struct {                      // Used by:
+   AddrKind    akind;         //   ALL
+   SizeT       size;          //   ALL
+   OffT        rwoffset;      //   ALL
+   ExeContext* lastchange;    //   Mallocd
+   DrdThreadId stack_tid;     //   Stack
+   SegInfo*    seginfo;       //   Segment
+   Char        name[256];     //   Segment
+   Char        descr[256];    //   Segment
+}
+   AddrInfo;
+
+#ifdef OLD_RACE_DETECTION_ALGORITHM
+/* Records info about a data race. */
+typedef struct {
+   ThreadId tid1;      // Thread ID of first thread involved in the data race.
+   ThreadId tid2;      // Thread ID of second thread involved in the data race.
+   Addr     range_begin;  // Start address of range involved.
+   Addr     range_end;    // Last address (exclusive) of range involved.
+   UInt     range_access; // How the range was accessed (LHS_[RW] | RHS_[RW]).
+} DataRaceInfo;
+#endif
+
+typedef struct {
+   ThreadId      tid;         // Thread ID of the running thread.
+   Addr          addr;        // Conflicting address in current thread.
+   SizeT         size;        // Size in bytes of conflicting operation.
+   BmAccessTypeT access_type; // Access type: load or store.
+} DataRaceErrInfo;
+
+typedef struct {
+   Addr mutex;
+   Int recursion_count;
+   DrdThreadId owner;
+} MutexErrInfo;
+
+typedef struct {
+   Addr cond;
+   Addr mutex;
+} CondRaceErrInfo;
+
+typedef struct {
+   Addr cond;
+} CondErrInfo;
+
+void describe_addr(Addr const a, SizeT const len, AddrInfo* const ai);
+Char* describe_addr_text(Addr const a, SizeT const len, AddrInfo* const ai,
+                         Char* const buf, UInt const n_buf);
+#ifdef OLD_RACE_DETECTION_ALGORITHM
+void drd_report_data_race(const DataRaceInfo* const dri);
+#endif
+//void drd_report_data_race2(const DataRaceErrInfo* const dri);
+void drd_register_error_handlers(void);
+
+
+#endif /* __DRD_ERROR_H */
+
+
+/*
+ * Local variables:
+ * c-basic-offset: 3
+ * End:
+ */