aboutsummaryrefslogtreecommitdiffstats
path: root/executor/executor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'executor/executor.cc')
-rw-r--r--executor/executor.cc19
1 files changed, 13 insertions, 6 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index ab8ae3d6c..19aa45e81 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -95,6 +95,7 @@ const int kOutFd = 4;
static uint32* output_data;
static uint32* output_pos;
static uint32* write_output(uint32 v);
+static uint32* write_output_64(uint64 v);
static void write_completed(uint32 completed);
static uint32 hash(uint32 a);
static bool dedup(uint32 sig);
@@ -1308,6 +1309,15 @@ uint32* write_output(uint32 v)
return output_pos++;
}
+uint32* write_output_64(uint64 v)
+{
+ if (output_pos < output_data || (char*)(output_pos + 1) >= (char*)output_data + kMaxOutput)
+ fail("output overflow: pos=%p region=[%p:%p]",
+ output_pos, output_data, (char*)output_data + kMaxOutput);
+ *(uint64*)output_pos = v;
+ return output_pos + 2;
+}
+
void write_completed(uint32 completed)
{
__atomic_store_n(output_data, completed, __ATOMIC_RELEASE);
@@ -1344,13 +1354,10 @@ void kcov_comparison_t::write()
if (!is_size_8) {
write_output((uint32)arg1);
write_output((uint32)arg2);
- return;
+ } else {
+ write_output_64(arg1);
+ write_output_64(arg2);
}
- // If we have 64 bits arguments then write them in Little-endian.
- write_output((uint32)(arg1 & 0xFFFFFFFF));
- write_output((uint32)(arg1 >> 32));
- write_output((uint32)(arg2 & 0xFFFFFFFF));
- write_output((uint32)(arg2 >> 32));
}
bool kcov_comparison_t::ignore() const