diff options
| author | Alexander Egorenkov <Alexander.Egorenkov@ibm.com> | 2020-06-02 09:28:11 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-06-23 16:18:44 +0200 |
| commit | e5d10a43278b10875ef0a80be4af2d1b5692c1c9 (patch) | |
| tree | 5d573de44c3c373721e7f36c12170a44109f20f6 /executor/executor.cc | |
| parent | 54566aff1679fc74487d3efb9f7bbfbc21beed4b (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.cc | 19 |
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 |
