From b31e8a67d9b1f11b9943b595a4fd66d3a07dd085 Mon Sep 17 00:00:00 2001 From: ludwig Date: Mon, 3 Nov 2008 17:03:54 +0000 Subject: fix strict aliasing issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch by Przemysław Iskra (#3805) git-svn-id: svn://svn.icculus.org/quake3/trunk@1481 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/tools/lcc/src/bytecode.c | 11 ++++++----- code/tools/lcc/src/c.h | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'code/tools') diff --git a/code/tools/lcc/src/bytecode.c b/code/tools/lcc/src/bytecode.c index b267d6f..871056a 100644 --- a/code/tools/lcc/src/bytecode.c +++ b/code/tools/lcc/src/bytecode.c @@ -40,8 +40,9 @@ static void I(defconst)(int suffix, int size, Value v) { case P: print("byte %d %U\n", size, (unsigned long)v.p); return; case F: if (size == 4) { - float f = v.d; - print("byte 4 %u\n", *(unsigned *)&f); + floatint_t fi; + fi.f = v.d; + print("byte 4 %u\n", fi.ui); } else { unsigned *p = (unsigned *)&v.d; print("byte 4 %u\n", p[swap]); @@ -67,10 +68,10 @@ static void I(defsymbol)(Symbol p) { case P: p->x.name = stringf("%U", p->u.c.v.p); break; case F: { // JDC: added this to get inline floats - unsigned temp; + floatint_t temp; - *(float *)&temp = p->u.c.v.d; - p->x.name = stringf("%U", temp ); + temp.f = p->u.c.v.d; + p->x.name = stringf("%U", temp.ui ); } break;// JDC: added this default: assert(0); diff --git a/code/tools/lcc/src/c.h b/code/tools/lcc/src/c.h index e36380e..68c8f62 100644 --- a/code/tools/lcc/src/c.h +++ b/code/tools/lcc/src/c.h @@ -98,6 +98,12 @@ typedef struct { void *xt; } Xtype; +typedef union { + float f; + int i; + unsigned int ui; +} floatint_t; + #include "config.h" typedef struct metrics { unsigned char size, align, outofline; -- cgit v1.2.3