From patchwork Wed Mar 18 16:51:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yerden Zhumabekov X-Patchwork-Id: 4046 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 78A5E9AA1; Wed, 18 Mar 2015 17:50:12 +0100 (CET) Received: from mgw.gov.kz (mgw.gov.kz [89.218.88.242]) by dpdk.org (Postfix) with ESMTP id 850075FEB for ; Wed, 18 Mar 2015 17:50:10 +0100 (CET) Received: from mgw.gov.kz (mx.ctsat.kz [178.89.4.95]) by mgw.gov.kz with ESMTP id t2IGo6o0008555-t2IGo6o1008555; Wed, 18 Mar 2015 22:50:06 +0600 Received: from EXCASHUB2.rgp.local (192.168.40.53) by EdgeForefront.rgp.local (192.168.40.59) with Microsoft SMTP Server (TLS) id 14.2.247.3; Wed, 18 Mar 2015 22:48:15 +0600 Received: from r220.rgp.local (192.168.59.10) by excashub2.rgp.local (192.168.40.48) with Microsoft SMTP Server (TLS) id 14.2.247.3; Wed, 18 Mar 2015 22:48:24 +0600 From: Yerden Zhumabekov To: Date: Wed, 18 Mar 2015 22:51:12 +0600 Message-ID: X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-Originating-IP: [192.168.59.10] X-FEAS-SYSTEM-WL: e_zhumabekov@sts.kz Subject: [dpdk-dev] [PATCH] hash: fix breaking strict-aliasing rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Fix rte_hash_crc() function. Casting uint64_t pointer to uin32_t may trigger a compiler warning about breaking strict-aliasing rules. To avoid that, introduce a lookup table which is used to mask out a remainder of data. See issue #1, http://dpdk.org/ml/archives/dev/2015-March/015174.html Signed-off-by: Yerden Zhumabekov Acked-by: Bruce Richardson --- lib/librte_hash/rte_hash_crc.h | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/librte_hash/rte_hash_crc.h b/lib/librte_hash/rte_hash_crc.h index 3dcd362..e81920f 100644 --- a/lib/librte_hash/rte_hash_crc.h +++ b/lib/librte_hash/rte_hash_crc.h @@ -323,6 +323,16 @@ static const uint32_t crc32c_tables[8][256] = {{ 0xE54C35A1, 0xAC704886, 0x7734CFEF, 0x3E08B2C8, 0xC451B7CC, 0x8D6DCAEB, 0x56294D82, 0x1F1530A5 }}; +static const uint64_t odd_8byte_mask[] = { + 0x00FFFFFFFFFFFFFF, + 0x0000FFFFFFFFFFFF, + 0x000000FFFFFFFFFF, + 0x00000000FFFFFFFF, + 0x0000000000FFFFFF, + 0x000000000000FFFF, + 0x00000000000000FF, +}; + #define CRC32_UPD(crc, n) \ (crc32c_tables[(n)][(crc) & 0xFF] ^ \ crc32c_tables[(n)-1][((crc) >> 8) & 0xFF]) @@ -535,38 +545,27 @@ static inline uint32_t rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val) { unsigned i; - uint64_t temp = 0; + uint64_t temp; const uint64_t *p64 = (const uint64_t *)data; for (i = 0; i < data_len / 8; i++) { init_val = rte_hash_crc_8byte(*p64++, init_val); } - switch (7 - (data_len & 0x07)) { + i = 7 - (data_len & 0x07); + switch (i) { case 0: - temp |= (uint64_t) *((const uint8_t *)p64 + 6) << 48; - /* Fallthrough */ case 1: - temp |= (uint64_t) *((const uint8_t *)p64 + 5) << 40; - /* Fallthrough */ case 2: - temp |= (uint64_t) *((const uint8_t *)p64 + 4) << 32; - temp |= *((const uint32_t *)p64); + temp = odd_8byte_mask[i] & *p64; init_val = rte_hash_crc_8byte(temp, init_val); break; case 3: - init_val = rte_hash_crc_4byte(*(const uint32_t *)p64, init_val); - break; case 4: - temp |= *((const uint8_t *)p64 + 2) << 16; - /* Fallthrough */ case 5: - temp |= *((const uint8_t *)p64 + 1) << 8; - /* Fallthrough */ case 6: - temp |= *((const uint8_t *)p64); + temp = odd_8byte_mask[i] & *p64; init_val = rte_hash_crc_4byte(temp, init_val); - /* Fallthrough */ default: break; }