Fix strict aliasing issues
This commit is contained in:
parent
7146d83cd4
commit
977c5bb6cc
@ -299,47 +299,160 @@ do
|
|||||||
local load = {}
|
local load = {}
|
||||||
local store = {}
|
local store = {}
|
||||||
|
|
||||||
local cast = ffi.cast
|
local copy = ffi.copy
|
||||||
|
|
||||||
local ptr_i8 = ffi.typeof('int8_t *')
|
local RE_INSTANCE = ffi.new [[union {
|
||||||
local ptr_i16 = ffi.typeof('int16_t *')
|
int8_t i8;
|
||||||
local ptr_i32 = ffi.typeof('int32_t *')
|
int16_t i16;
|
||||||
local ptr_i64 = ffi.typeof('int64_t *')
|
int32_t i32;
|
||||||
|
int64_t i64;
|
||||||
|
|
||||||
local ptr_u16 = ffi.typeof('uint16_t *')
|
uint8_t u8;
|
||||||
local ptr_u32 = ffi.typeof('uint32_t *')
|
uint16_t u16;
|
||||||
|
uint32_t u32;
|
||||||
|
uint64_t u64;
|
||||||
|
|
||||||
local ptr_f32 = ffi.typeof('float *')
|
float f32;
|
||||||
local ptr_f64 = ffi.typeof('double *')
|
double f64;
|
||||||
|
}]]
|
||||||
|
|
||||||
function load.i32_i8(memory, addr) return cast(ptr_i8, memory.data)[addr] end
|
function load.i32_i8(memory, addr)
|
||||||
function load.i32_u8(memory, addr) return memory.data[addr] end
|
copy(RE_INSTANCE, memory.data + addr, 1)
|
||||||
function load.i32_i16(memory, addr) return cast(ptr_i16, memory.data + addr)[0] end
|
|
||||||
function load.i32_u16(memory, addr) return cast(ptr_u16, memory.data + addr)[0] end
|
|
||||||
function load.i32(memory, addr) return cast(ptr_i32, memory.data + addr)[0] end
|
|
||||||
|
|
||||||
function load.i64_i8(memory, addr) return i64(cast(ptr_i8, memory.data)[addr]) end
|
return RE_INSTANCE.i8
|
||||||
function load.i64_u8(memory, addr) return i64(memory.data[addr]) end
|
end
|
||||||
function load.i64_i16(memory, addr) return i64(cast(ptr_i16, memory.data + addr)[0]) end
|
|
||||||
function load.i64_u16(memory, addr) return i64(cast(ptr_u16, memory.data + addr)[0]) end
|
|
||||||
function load.i64_i32(memory, addr) return i64(cast(ptr_i32, memory.data + addr)[0]) end
|
|
||||||
function load.i64_u32(memory, addr) return i64(cast(ptr_u32, memory.data + addr)[0]) end
|
|
||||||
function load.i64(memory, addr) return cast(ptr_i64, memory.data + addr)[0] end
|
|
||||||
|
|
||||||
function load.f32(memory, addr) return cast(ptr_f32, memory.data + addr)[0] end
|
function load.i32_u8(memory, addr)
|
||||||
function load.f64(memory, addr) return cast(ptr_f64, memory.data + addr)[0] end
|
copy(RE_INSTANCE, memory.data + addr, 1)
|
||||||
|
|
||||||
function store.i32_n8(memory, addr, value) memory.data[addr] = value end
|
return RE_INSTANCE.u8
|
||||||
function store.i32_n16(memory, addr, value) cast(ptr_i16, memory.data + addr)[0] = value end
|
end
|
||||||
function store.i32(memory, addr, value) cast(ptr_i32, memory.data + addr)[0] = value end
|
|
||||||
|
|
||||||
function store.i64_n8(memory, addr, value) memory.data[addr] = value end
|
function load.i32_i16(memory, addr)
|
||||||
function store.i64_n16(memory, addr, value) cast(ptr_i16, memory.data + addr)[0] = value end
|
copy(RE_INSTANCE, memory.data + addr, 2)
|
||||||
function store.i64_n32(memory, addr, value) cast(ptr_i32, memory.data + addr)[0] = value end
|
|
||||||
function store.i64(memory, addr, value) cast(ptr_i64, memory.data + addr)[0] = value end
|
|
||||||
|
|
||||||
function store.f32(memory, addr, value) cast(ptr_f32, memory.data + addr)[0] = value end
|
return RE_INSTANCE.i16
|
||||||
function store.f64(memory, addr, value) cast(ptr_f64, memory.data + addr)[0] = value end
|
end
|
||||||
|
|
||||||
|
function load.i32_u16(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 2)
|
||||||
|
|
||||||
|
return RE_INSTANCE.u16
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i32(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 4)
|
||||||
|
|
||||||
|
return RE_INSTANCE.i32
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_i8(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 1)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.i8)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_u8(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 1)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.u8)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_i16(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 2)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.i16)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_u16(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 2)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.u16)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_i32(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 4)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.i32)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64_u32(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 4)
|
||||||
|
|
||||||
|
return i64(RE_INSTANCE.u32)
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.i64(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 8)
|
||||||
|
|
||||||
|
return RE_INSTANCE.i64
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.f32(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 4)
|
||||||
|
|
||||||
|
return RE_INSTANCE.f32
|
||||||
|
end
|
||||||
|
|
||||||
|
function load.f64(memory, addr)
|
||||||
|
copy(RE_INSTANCE, memory.data + addr, 8)
|
||||||
|
|
||||||
|
return RE_INSTANCE.f64
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i32_n8(memory, addr, value)
|
||||||
|
RE_INSTANCE.i32 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i32_n16(memory, addr, value)
|
||||||
|
RE_INSTANCE.i32 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i32(memory, addr, value)
|
||||||
|
RE_INSTANCE.i32 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i64_n8(memory, addr, value)
|
||||||
|
RE_INSTANCE.i64 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i64_n16(memory, addr, value)
|
||||||
|
RE_INSTANCE.i64 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i64_n32(memory, addr, value)
|
||||||
|
RE_INSTANCE.i64 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.i64(memory, addr, value)
|
||||||
|
RE_INSTANCE.i64 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 8)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.f32(memory, addr, value)
|
||||||
|
RE_INSTANCE.f32 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
function store.f64(memory, addr, value)
|
||||||
|
RE_INSTANCE.f64 = value
|
||||||
|
|
||||||
|
copy(memory.data + addr, RE_INSTANCE, 8)
|
||||||
|
end
|
||||||
|
|
||||||
module.load = load
|
module.load = load
|
||||||
module.store = store
|
module.store = store
|
||||||
@ -362,8 +475,6 @@ do
|
|||||||
void free(void *ptr);
|
void free(void *ptr);
|
||||||
]]
|
]]
|
||||||
|
|
||||||
local mem_t = ffi.typeof('struct Memory')
|
|
||||||
|
|
||||||
local function finalizer(memory) ffi.C.free(memory.data) end
|
local function finalizer(memory) ffi.C.free(memory.data) end
|
||||||
|
|
||||||
local function grow_unchecked(memory, old, new)
|
local function grow_unchecked(memory, old, new)
|
||||||
@ -379,7 +490,9 @@ do
|
|||||||
|
|
||||||
assert(data ~= nil, 'failed to allocate')
|
assert(data ~= nil, 'failed to allocate')
|
||||||
|
|
||||||
return ffi.gc(mem_t(min, max, data), finalizer)
|
local memory = ffi.new('struct Memory', min, max, data)
|
||||||
|
|
||||||
|
return ffi.gc(memory, finalizer)
|
||||||
end
|
end
|
||||||
|
|
||||||
function memory.init(memory, offset, data) ffi.copy(memory.data + offset, data) end
|
function memory.init(memory, offset, data) ffi.copy(memory.data + offset, data) end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user