static VG_REGPARM(2) void drd_trace_load(Addr addr, SizeT size)
{
- Segment* sg;
-
#if 0
/* The assert below has been commented out because of performance reasons.*/
tl_assert(thread_get_running_tid()
{
drd_trace_mem_access(addr, size, eLoad);
}
- sg = running_thread_get_segment();
- bm_access_range_load(sg->bm, addr, addr + size);
- if (bm_load_has_conflict_with(thread_get_danger_set(), addr, addr + size))
+ if (bm_access_load_triggers_conflict(addr, addr + size))
{
drd_report_race(addr, size, eLoad);
}
static VG_REGPARM(1) void drd_trace_load_1(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 1, eLoad);
}
- sg = running_thread_get_segment();
- bm_access_load_1(sg->bm, addr);
- if (bm_load_1_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_load_1_triggers_conflict(addr))
{
drd_report_race(addr, 1, eLoad);
}
static VG_REGPARM(1) void drd_trace_load_2(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 2, eLoad);
}
- sg = running_thread_get_segment();
- bm_access_load_2(sg->bm, addr);
- if (bm_load_2_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_load_2_triggers_conflict(addr))
{
drd_report_race(addr, 2, eLoad);
}
static VG_REGPARM(1) void drd_trace_load_4(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 4, eLoad);
}
- sg = running_thread_get_segment();
- bm_access_load_4(sg->bm, addr);
- if (bm_load_4_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_load_4_triggers_conflict(addr))
{
drd_report_race(addr, 4, eLoad);
}
static VG_REGPARM(1) void drd_trace_load_8(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 8, eLoad);
}
- sg = running_thread_get_segment();
- bm_access_load_8(sg->bm, addr);
- if (bm_load_8_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_load_8_triggers_conflict(addr))
{
drd_report_race(addr, 8, eLoad);
}
static
VG_REGPARM(2) void drd_trace_store(Addr addr, SizeT size)
{
- Segment* sg;
-
#if 0
/* The assert below has been commented out because of performance reasons.*/
tl_assert(thread_get_running_tid()
{
drd_trace_mem_access(addr, size, eStore);
}
- sg = running_thread_get_segment();
- bm_access_range_store(sg->bm, addr, addr + size);
- if (bm_store_has_conflict_with(thread_get_danger_set(), addr, addr + size))
+ if (bm_access_store_triggers_conflict(addr, addr + size))
{
drd_report_race(addr, size, eStore);
}
static VG_REGPARM(1) void drd_trace_store_1(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 1, eStore);
}
- sg = running_thread_get_segment();
- bm_access_store_1(sg->bm, addr);
- if (bm_store_1_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_store_1_triggers_conflict(addr))
{
drd_report_race(addr, 1, eStore);
}
static VG_REGPARM(1) void drd_trace_store_2(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 2, eStore);
}
- sg = running_thread_get_segment();
- bm_access_store_2(sg->bm, addr);
- if (bm_store_2_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_store_2_triggers_conflict(addr))
{
drd_report_race(addr, 2, eStore);
}
static VG_REGPARM(1) void drd_trace_store_4(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 4, eStore);
}
- sg = running_thread_get_segment();
- bm_access_store_4(sg->bm, addr);
- if (bm_store_4_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_store_4_triggers_conflict(addr))
{
drd_report_race(addr, 4, eStore);
}
static VG_REGPARM(1) void drd_trace_store_8(Addr addr)
{
- Segment* sg;
-
if (! running_thread_is_recording())
return;
{
drd_trace_mem_access(addr, 8, eStore);
}
- sg = running_thread_get_segment();
- bm_access_store_8(sg->bm, addr);
- if (bm_store_8_has_conflict_with(thread_get_danger_set(), addr))
+ if (bm_access_store_8_triggers_conflict(addr))
{
drd_report_race(addr, 8, eStore);
}
s_danger_set_combine_vc_count++;
}
+Bool bm_access_load_1_triggers_conflict(const Addr a1)
+{
+ bm_access_load_1(running_thread_get_segment()->bm, a1);
+ return bm_load_1_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_load_2_triggers_conflict(const Addr a1)
+{
+ bm_access_load_2(running_thread_get_segment()->bm, a1);
+ return bm_load_2_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_load_4_triggers_conflict(const Addr a1)
+{
+ bm_access_load_4(running_thread_get_segment()->bm, a1);
+ return bm_load_4_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_load_8_triggers_conflict(const Addr a1)
+{
+ bm_access_load_8(running_thread_get_segment()->bm, a1);
+ return bm_load_8_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_load_triggers_conflict(const Addr a1, const Addr a2)
+{
+ bm_access_range_load(running_thread_get_segment()->bm, a1, a2);
+ return bm_load_has_conflict_with(thread_get_danger_set(), a1, a2);
+}
+
+Bool bm_access_store_1_triggers_conflict(const Addr a1)
+{
+ bm_access_store_1(running_thread_get_segment()->bm, a1);
+ return bm_store_1_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_store_2_triggers_conflict(const Addr a1)
+{
+ bm_access_store_2(running_thread_get_segment()->bm, a1);
+ return bm_store_2_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_store_4_triggers_conflict(const Addr a1)
+{
+ bm_access_store_4(running_thread_get_segment()->bm, a1);
+ return bm_store_4_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_store_8_triggers_conflict(const Addr a1)
+{
+ bm_access_store_8(running_thread_get_segment()->bm, a1);
+ return bm_store_8_has_conflict_with(thread_get_danger_set(), a1);
+}
+
+Bool bm_access_store_triggers_conflict(const Addr a1, const Addr a2)
+{
+ bm_access_range_store(running_thread_get_segment()->bm, a1, a2);
+ return bm_store_has_conflict_with(thread_get_danger_set(), a1, a2);
+}
+
/** Call this function whenever a thread is no longer using the memory
* [ a1, a2 [, e.g. because of a call to free() or a stack pointer
* increase.