summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-11-05 10:30:45 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-11-05 10:30:45 +0800
commit840c541cd1a000bb29f68ea3c059863ea7260281 (patch)
tree72a197b570fe26a9fbb63c1230b14ab92e362586 /src/hir
parent715ab49457f5d797fae8b155f51142674fe0075c (diff)
downloadmrust-840c541cd1a000bb29f68ea3c059863ea7260281.tar.gz
MIR - Use SwitchValue terminator
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/deserialise.cpp31
-rw-r--r--src/hir/serialise.cpp7
-rw-r--r--src/hir/serialise_lowlevel.hpp6
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();