--- /dev/null
+##
+## This file is part of the PulseView project.
+##
+## Copyright (C) 2014 Marcus Comstedt <marcus@mc.pp.se>
+##
+## 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, see <http://www.gnu.org/licenses/>.
+##
+
+include(CheckCSourceRuns)
+
+function (memaccess_check_unaligned_le _var)
+CHECK_C_SOURCE_RUNS("
+#include <stdint.h>
+int main() {
+ int i;
+ union { uint64_t u64; uint8_t u8[16]; } d;
+ uint64_t v;
+ for (i=0; i<16; i++)
+ d.u8[i] = i;
+ v = *(uint64_t *)(d.u8+1);
+ if (v != 0x0807060504030201ULL)
+ return 1;
+ return 0;
+}" ${_var})
+endfunction()
find_package(Boost 1.42 COMPONENTS system thread REQUIRED)
endif()
+#===============================================================================
+#= System Introspection
+#-------------------------------------------------------------------------------
+
+include(memaccess)
+memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS)
+
#===============================================================================
#= Config Header
#-------------------------------------------------------------------------------
#define PV_VERSION_MICRO @PV_VERSION_MICRO@
#define PV_VERSION_STRING "@PV_VERSION_STRING@"
+/* Platform properties */
+#cmakedefine HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+
#endif
#include <boost/foreach.hpp>
+#include "config.h"
#include "logicsnapshot.h"
using boost::lock_guard;
uint64_t LogicSnapshot::unpack_sample(const uint8_t *ptr) const
{
+#ifdef HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+ return *(uint64_t*)ptr;
+#else
uint64_t value = 0;
switch(_unit_size) {
default:
break;
}
return value;
+#endif
}
void LogicSnapshot::pack_sample(uint8_t *ptr, uint64_t value)
{
+#ifdef HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+ *(uint64_t*)ptr = value;
+#else
switch(_unit_size) {
default:
ptr[7] = value >> 56;
case 0:
break;
}
+#endif
}
void LogicSnapshot::append_payload(