summaryrefslogtreecommitdiff
path: root/src/mir/mir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/mir.cpp')
-rw-r--r--src/mir/mir.cpp63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/mir/mir.cpp b/src/mir/mir.cpp
index 30d94a3d..9edc925b 100644
--- a/src/mir/mir.cpp
+++ b/src/mir/mir.cpp
@@ -24,22 +24,22 @@ namespace MIR {
os << (e.v ? "true" : "false");
),
(Bytes,
- os << "[";
+ os << "b\"";
os << ::std::hex;
for(auto v : e)
- os << static_cast<unsigned int>(v) << " ";
- os << ::std::dec;
- os << "]";
- ),
- (StaticString,
- os << "\"";
- for(auto v : e) {
+ {
if( ' ' <= v && v < 0x7F && v != '"' && v != '\\' )
os << v;
+ else if( v < 16 )
+ os << "\\x0" << (unsigned int)v;
else
- os << "\\u{" << FMT(::std::hex << (unsigned int)v) << "}";
+ os << "\\x" << ((unsigned int)v & 0xFF);
}
os << "\"";
+ os << ::std::dec;
+ ),
+ (StaticString,
+ os << "\"" << FmtEscaped(e) << "\"";
),
(Const,
os << e.p;
@@ -50,34 +50,40 @@ namespace MIR {
)
return os;
}
- bool Constant::operator==(const Constant& b) const
+ ::Ordering Constant::ord(const Constant& b) const
{
if( this->tag() != b.tag() )
- return false;
+ return ::ord( static_cast<unsigned int>(this->tag()), b.tag() );
TU_MATCHA( (*this,b), (ae,be),
(Int,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Uint,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Float,
- return ae.v == be.v && ae.t == be.t;
+ if( ae.v != be.v )
+ return ::ord(ae.v, be.v);
+ return ::ord((unsigned)ae.t, (unsigned)be.t);
),
(Bool,
- return ae.v == be.v;
+ return ::ord(ae.v, be.v);
),
(Bytes,
- return ae == be;
+ return ::ord(ae, be);
),
(StaticString,
- return ae == be;
+ return ::ord(ae, be);
),
(Const,
- return ae.p == be.p;
+ return ::ord(ae.p, be.p);
),
(ItemAddr,
- return ae == be;
+ return ::ord(ae, be);
)
)
throw "";
@@ -460,11 +466,30 @@ namespace MIR {
os << "), clobbers=[" << e.clobbers << "], flags=[" << e.flags << "])";
),
(SetDropFlag,
+ os << "df$" << e.idx << " = ";
+ if( e.other == ~0u )
+ {
+ os << e.new_val;
+ }
+ else
+ {
+ os << (e.new_val ? "!" : "") << "df$" << e.other;
+ }
),
(Drop,
os << "drop(" << e.slot;
if(e.kind == ::MIR::eDropKind::SHALLOW)
os << " SHALLOW";
+ if(e.flag_idx != ~0u)
+ os << "IF df$" << e.flag_idx;
+ os << ")";
+ ),
+ (ScopeEnd,
+ os << "ScopeEnd(";
+ for(auto idx : e.vars)
+ os << "var$" << idx << ",";
+ for(auto idx : e.tmps)
+ os << "tmp$" << idx << ",";
os << ")";
)
)