diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-08-14 20:10:47 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-08-14 20:10:47 +0800 |
commit | 18c3d284a6c5bce86f72fbff64e98d3db9a306a9 (patch) | |
tree | e7836d5cecc3c62ad4c892b32553dd05e861d79a | |
parent | 66a176784df8801a9ef6fabd2f489c125554e0f5 (diff) | |
download | mrust-18c3d284a6c5bce86f72fbff64e98d3db9a306a9.tar.gz |
Standalone MIRI - Start on u128/i128 support ideas
-rw-r--r-- | tools/standalone_miri/u128.hpp | 15 | ||||
-rw-r--r-- | tools/standalone_miri/value.hpp | 21 |
2 files changed, 36 insertions, 0 deletions
diff --git a/tools/standalone_miri/u128.hpp b/tools/standalone_miri/u128.hpp new file mode 100644 index 00000000..03c004d9 --- /dev/null +++ b/tools/standalone_miri/u128.hpp @@ -0,0 +1,15 @@ +#pragma once + +class U128 +{ + uint64_t lo, hi; +public: + U128(): lo(0), hi(0) {} +}; + +class I128 +{ + U128 v; +public: + I128() {} +}; diff --git a/tools/standalone_miri/value.hpp b/tools/standalone_miri/value.hpp index a0350681..764df8fa 100644 --- a/tools/standalone_miri/value.hpp +++ b/tools/standalone_miri/value.hpp @@ -14,6 +14,7 @@ #include <cassert> #include "debug.hpp" +#include "u128.hpp" namespace HIR { struct TypeRef; @@ -192,10 +193,12 @@ struct ValueCommonRead uint16_t read_u16(size_t ofs) const { uint16_t rv; read_bytes(ofs, &rv, 2); return rv; } uint32_t read_u32(size_t ofs) const { uint32_t rv; read_bytes(ofs, &rv, 4); return rv; } uint64_t read_u64(size_t ofs) const { uint64_t rv; read_bytes(ofs, &rv, 8); return rv; } + U128 read_u128(size_t ofs) const { U128 rv; read_bytes(ofs, &rv, 16); return rv; } int8_t read_i8(size_t ofs) const { return static_cast<int8_t>(read_u8(ofs)); } int16_t read_i16(size_t ofs) const { return static_cast<int16_t>(read_u16(ofs)); } int32_t read_i32(size_t ofs) const { return static_cast<int32_t>(read_u32(ofs)); } int64_t read_i64(size_t ofs) const { return static_cast<int64_t>(read_u64(ofs)); } + I128 read_i128(size_t ofs) const { I128 rv; read_bytes(ofs, &rv, 16); return rv; } float read_f32(size_t ofs) const { float rv; read_bytes(ofs, &rv, 4); return rv; } double read_f64(size_t ofs) const { double rv; read_bytes(ofs, &rv, 8); return rv; } uint64_t read_usize(size_t ofs) const; @@ -304,11 +307,29 @@ public: }; extern ::std::ostream& operator<<(::std::ostream& os, const Allocation& x); +// TODO: Rename to be `StackSlot` struct Value: public ValueCommonWrite { + // TODO: Use this union for more compact representation + union Inner { + bool is_alloc; + struct { + bool is_alloc; + AllocationHandle alloc; + } alloc; + // Sizeof = 4+8+8 = 20b (plus vtable?) + struct { + bool is_alloc; + uint8_t size; + uint8_t mask[2]; + uint8_t data[2*8]; + RelocationPtr reloc_0; // Relocation only for 0+POINTER_SIZE + } direct; + }; // If NULL, data is direct AllocationHandle allocation; + // TODO: Use an enum and a single relocation slot struct { // NOTE: Can't pack the mask+size tighter, need 4 bits of size (8-15) leaving 12 bits of mask uint8_t data[2*8-3]; // 13 data bytes, plus 16bit mask, plus size = 16 bytes |