diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-11-05 10:30:45 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-11-05 10:30:45 +0800 |
commit | 840c541cd1a000bb29f68ea3c059863ea7260281 (patch) | |
tree | 72a197b570fe26a9fbb63c1230b14ab92e362586 /src/hir | |
parent | 715ab49457f5d797fae8b155f51142674fe0075c (diff) | |
download | mrust-840c541cd1a000bb29f68ea3c059863ea7260281.tar.gz |
MIR - Use SwitchValue terminator
Diffstat (limited to 'src/hir')
-rw-r--r-- | src/hir/deserialise.cpp | 31 | ||||
-rw-r--r-- | src/hir/serialise.cpp | 7 | ||||
-rw-r--r-- | src/hir/serialise_lowlevel.hpp | 6 |
3 files changed, 40 insertions, 4 deletions
diff --git a/src/hir/deserialise.cpp b/src/hir/deserialise.cpp index 968cf8d3..c5867542 100644 --- a/src/hir/deserialise.cpp +++ b/src/hir/deserialise.cpp @@ -325,6 +325,8 @@ namespace { ::MIR::BasicBlock deserialise_mir_basicblock(); ::MIR::Statement deserialise_mir_statement(); ::MIR::Terminator deserialise_mir_terminator(); + ::MIR::Terminator deserialise_mir_terminator_(); + ::MIR::SwitchValues deserialise_mir_switchvalues(); ::MIR::CallTarget deserialise_mir_calltarget(); ::MIR::Param deserialise_mir_param() @@ -1070,8 +1072,13 @@ namespace { } ::MIR::Terminator HirDeserialiser::deserialise_mir_terminator() { - TRACE_FUNCTION; - + ::MIR::Terminator rv; + TRACE_FUNCTION_FR("", rv); + rv = this->deserialise_mir_terminator_(); + return rv; + } + ::MIR::Terminator HirDeserialiser::deserialise_mir_terminator_() + { switch( m_in.read_tag() ) { #define _(x, ...) case ::MIR::Terminator::TAG_##x: return ::MIR::Terminator::make_##x( __VA_ARGS__ ); @@ -1089,6 +1096,12 @@ namespace { deserialise_mir_lvalue(), deserialise_vec_c<unsigned int>([&](){ return static_cast<unsigned int>(m_in.read_count()); }) }) + _(SwitchValue, { + deserialise_mir_lvalue(), + static_cast<unsigned int>(m_in.read_count()), + deserialise_vec_c<unsigned int>([&](){ return static_cast<unsigned int>(m_in.read_count()); }), + deserialise_mir_switchvalues() + }) _(Call, { static_cast<unsigned int>(m_in.read_count()), static_cast<unsigned int>(m_in.read_count()), @@ -1101,6 +1114,20 @@ namespace { throw ""; } } + ::MIR::SwitchValues HirDeserialiser::deserialise_mir_switchvalues() + { + TRACE_FUNCTION; + switch(m_in.read_tag()) + { + #define _(x, ...) case ::MIR::SwitchValues::TAG_##x: return ::MIR::SwitchValues::make_##x( __VA_ARGS__ ); + _(Unsigned, deserialise_vec_c<uint64_t>([&](){ return m_in.read_u64c(); })) + _(Signed , deserialise_vec_c< int64_t>([&](){ return m_in.read_i64c(); })) + _(String , deserialise_vec<::std::string>()) + #undef _ + default: + throw ""; + } + } ::MIR::CallTarget HirDeserialiser::deserialise_mir_calltarget() { diff --git a/src/hir/serialise.cpp b/src/hir/serialise.cpp index e200a39e..d80154ed 100644 --- a/src/hir/serialise.cpp +++ b/src/hir/serialise.cpp @@ -81,6 +81,11 @@ namespace { // m_out.write_count(val); //} + void serialise(bool v) { m_out.write_bool(v); }; + void serialise(unsigned int v) { m_out.write_count(v); }; + void serialise(uint64_t v) { m_out.write_u64c(v); }; + void serialise(int64_t v) { m_out.write_i64c(v); }; + void serialise_type(const ::HIR::TypeRef& ty) { m_out.write_tag( ty.m_data.tag() ); @@ -791,8 +796,6 @@ namespace { ) } - void serialise(unsigned int v) { m_out.write_count(v); }; - void serialise(const ::HIR::Linkage& linkage) { //m_out.write_tag( static_cast<int>(linkage.type) ); diff --git a/src/hir/serialise_lowlevel.hpp b/src/hir/serialise_lowlevel.hpp index de913432..6be8ff8c 100644 --- a/src/hir/serialise_lowlevel.hpp +++ b/src/hir/serialise_lowlevel.hpp @@ -49,6 +49,9 @@ public: }; this->write(buf, 8); } + void write_i64(int64_t v) { + write_u64(static_cast<uint64_t>(v)); + } // Variable-length encoded u64 (for array sizes) void write_u64c(uint64_t v) { if( v < (1<<7) ) { @@ -184,6 +187,9 @@ public: | (static_cast<uint64_t>(buf[7]) << 56) ; } + int64_t read_i64() { + return static_cast<int64_t>(read_u64()); + } // Variable-length encoded u64 (for array sizes) uint64_t read_u64c() { auto v = read_u8(); |