fix strict aliasing issues

Patch by Przemysław Iskra (#3805)
This commit is contained in:
Ludwig Nussel 2008-11-03 17:03:54 +00:00
parent f86f8e8ed8
commit c754d6fdfb
15 changed files with 91 additions and 108 deletions

View file

@ -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);

View file

@ -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;