X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_dump.cpp;h=e6810b6afa63e209e156b096bb8a5197b2dc32ce;hb=HEAD;hp=6a0e6a79d853389bc6031d044d6d0bdd2ca76411;hpb=946da143b5fa8b5babddd5668743e4048bf08e7d;p=apitrace diff --git a/common/trace_dump.cpp b/common/trace_dump.cpp index 6a0e6a7..e6810b6 100644 --- a/common/trace_dump.cpp +++ b/common/trace_dump.cpp @@ -24,6 +24,8 @@ **************************************************************************/ +#include + #include "formatter.hpp" #include "trace_dump.hpp" @@ -35,7 +37,7 @@ class Dumper : public Visitor { protected: std::ostream &os; - DumpFlags flags; + DumpFlags dumpFlags; formatter::Formatter *formatter; formatter::Attribute *normal; formatter::Attribute *bold; @@ -48,9 +50,9 @@ protected: public: Dumper(std::ostream &_os, DumpFlags _flags) : os(_os), - flags(_flags) + dumpFlags(_flags) { - bool color = !(flags & DUMP_FLAG_NO_COLOR); + bool color = !(dumpFlags & DUMP_FLAG_NO_COLOR); formatter = formatter::defaultFormatter(color); normal = formatter->normal(); bold = formatter->bold(); @@ -73,7 +75,7 @@ public: } void visit(Null *) { - os << "NULL"; + os << literal << "NULL" << normal; } void visit(Bool *node) { @@ -89,11 +91,15 @@ public: } void visit(Float *node) { + std::streamsize oldPrecision = os.precision(std::numeric_limits::digits10 + 1); os << literal << node->value << normal; + os.precision(oldPrecision); } void visit(Double *node) { + std::streamsize oldPrecision = os.precision(std::numeric_limits::digits10 + 1); os << literal << node->value << normal; + os.precision(oldPrecision); } void visit(String *node) { @@ -129,12 +135,10 @@ public: } void visit(Enum *node) { - const EnumSig *sig = node->sig; - for (const EnumValue *it = sig->values; it != sig->values + sig->num_values; ++it) { - if (it->value == node->value) { - os << literal << it->name << normal; - return; - } + const EnumValue *it = node->lookup(); + if (it) { + os << literal << it->name << normal; + return; } os << literal << node->value << normal; } @@ -143,7 +147,8 @@ public: unsigned long long value = bitmask->value; const BitmaskSig *sig = bitmask->sig; bool first = true; - for (const BitmaskFlag *it = sig->flags; value != 0 && it != sig->flags + sig->num_flags; ++it) { + for (const BitmaskFlag *it = sig->flags; it != sig->flags + sig->num_flags; ++it) { + assert(it->value || first); if ((it->value && (value & it->value) == it->value) || (!it->value && value == 0)) { if (!first) { @@ -153,6 +158,9 @@ public: value &= ~it->value; first = false; } + if (value == 0) { + break; + } } if (value || first) { if (!first) { @@ -162,14 +170,32 @@ public: } } - void visit(Struct *s) { - const char *sep = ""; - os << "{"; + const char * + visitMembers(Struct *s, const char *sep = "") { for (unsigned i = 0; i < s->members.size(); ++i) { - os << sep << italic << s->sig->member_names[i] << normal << " = "; - _visit(s->members[i]); + const char *memberName = s->sig->member_names[i]; + Value *memberValue = s->members[i]; + + if (!memberName || !*memberName) { + // Anonymous structure + Struct *memberStruct = dynamic_cast(memberValue); + assert(memberStruct); + if (memberStruct) { + sep = visitMembers(memberStruct, sep); + continue; + } + } + + os << sep << italic << memberName << normal << " = ", + _visit(memberValue); sep = ", "; } + return sep; + } + + void visit(Struct *s) { + os << "{"; + visitMembers(s); os << "}"; } @@ -198,12 +224,20 @@ public: os << pointer << "0x" << std::hex << p->value << std::dec << normal; } + void visit(Repr *r) { + _visit(r->humanValue); + } + void visit(Call *call) { - CallFlags flags = call->flags; + CallFlags callFlags = call->flags; + + if (!(dumpFlags & DUMP_FLAG_NO_CALL_NO)) { + os << call->no << " "; + } - if (flags & CALL_FLAG_NON_REPRODUCIBLE) { + if (callFlags & CALL_FLAG_NON_REPRODUCIBLE) { os << strike; - } else if (flags & (CALL_FLAG_FAKE | CALL_FLAG_NO_SIDE_EFFECTS)) { + } else if (callFlags & (CALL_FLAG_FAKE | CALL_FLAG_NO_SIDE_EFFECTS)) { os << normal; } else { os << bold; @@ -214,11 +248,11 @@ public: const char *sep = ""; for (unsigned i = 0; i < call->args.size(); ++i) { os << sep; - if (!(flags = DUMP_FLAG_NO_ARG_NAMES)) { + if (!(dumpFlags & DUMP_FLAG_NO_ARG_NAMES)) { os << italic << call->sig->arg_names[i] << normal << " = "; } - if (call->args[i]) { - _visit(call->args[i]); + if (call->args[i].value) { + _visit(call->args[i].value); } else { os << "?"; } @@ -231,13 +265,13 @@ public: _visit(call->ret); } - if (flags & CALL_FLAG_INCOMPLETE) { + if (callFlags & CALL_FLAG_INCOMPLETE) { os << " // " << red << "incomplete" << normal; } os << "\n"; - if (flags & CALL_FLAG_END_FRAME) { + if (callFlags & CALL_FLAG_END_FRAME) { os << "\n"; } } @@ -252,7 +286,6 @@ void dump(Value *value, std::ostream &os, DumpFlags flags) { void dump(Call &call, std::ostream &os, DumpFlags flags) { Dumper d(os, flags); - os << call.no << " "; d.visit(&call); }