aboutsummaryrefslogtreecommitdiffstats
path: root/executor/executor.cc
diff options
context:
space:
mode:
authorAlexander Egorenkov <Alexander.Egorenkov@ibm.com>2020-06-02 09:28:11 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-06-23 16:18:44 +0200
commite5d10a43278b10875ef0a80be4af2d1b5692c1c9 (patch)
tree5d573de44c3c373721e7f36c12170a44109f20f6 /executor/executor.cc
parent54566aff1679fc74487d3efb9f7bbfbc21beed4b (diff)
ipc: fix endianness issues
Use native byte-order for IPC and program serialization. This way we will be able to support both little- and big-endian architectures. Signed-off-by: Alexander Egorenkov <Alexander.Egorenkov@ibm.com>
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