From 357b87a28196d94ce758e14ecb236b3bc63facd9 Mon Sep 17 00:00:00 2001 From: bsongis Date: Thu, 15 Mar 2012 06:16:58 +0000 Subject: [PATCH] Fix for gcc 4.7.0 memcpy alignment bug --- src/file.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/file.cpp b/src/file.cpp index 2656a2d38..48a1d19d4 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -206,9 +206,18 @@ bool EFile::exists(uint8_t i_fileId) */ void EFile::swap(uint8_t i_fileId1, uint8_t i_fileId2) { - DirEnt tmp = eeFs.files[i_fileId1]; - eeFs.files[i_fileId1] = eeFs.files[i_fileId2]; - eeFs.files[i_fileId2] = tmp; + /* This code causes horrible alignment problem with avr-gcc 4.7.0 + * + * DirEnt tmp = eeFs.files[i_fileId1]; + * eeFs.files[i_fileId1] = eeFs.files[i_fileId2]; + * eeFs.files[i_fileId2] = tmp; + */ + + DirEnt tmp; + __builtin_memcpy(&tmp, __builtin_assume_aligned(&eeFs.files[i_fileId1], sizeof(DirEnt)), sizeof(DirEnt)); + __builtin_memcpy(&eeFs.files[i_fileId1], __builtin_assume_aligned(&eeFs.files[i_fileId2], sizeof(DirEnt)), sizeof(DirEnt)); + __builtin_memcpy(&eeFs.files[i_fileId2], __builtin_assume_aligned(&tmp, sizeof(DirEnt)), sizeof(DirEnt)); + s_sync_write = true; EeFsFlushDirEnt(i_fileId1); EeFsFlushDirEnt(i_fileId2);