Add code dumping to oatdump.
Change-Id: I7dccdffb3bac422fee52a4bd82dfac220da91722
diff --git a/src/dex_instruction.cc b/src/dex_instruction.cc
index 2bb53d6..31e9d3a 100644
--- a/src/dex_instruction.cc
+++ b/src/dex_instruction.cc
@@ -290,28 +290,28 @@
std::ostringstream os;
const char* opcode = kInstructionNames[insn.opcode_];
switch (Format()) {
- case k10x: os << opcode; break;
- case k12x: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_; break;
- case k11n: os << opcode << " v" << insn.vA_ << ", #+" << insn.vB_; break;
- case k11x: os << opcode << " v" << insn.vA_; break;
- case k10t: os << opcode << " +" << (int)insn.vA_; break;
- case k20bc: os << opcode << " " << insn.vA_ << ", kind@" << insn.vB_; break;
- case k20t: os << opcode << " +" << (int)insn.vA_; break;
- case k22x: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_; break;
- case k21t: os << opcode << " v" << insn.vA_ << ", +" << insn.vB_; break;
- case k21s: os << opcode << " v" << insn.vA_ << ", #+" << insn.vB_; break;
- case k21h: os << opcode << " v" << insn.vA_ << ", #+" << insn.vB_ << "00000[00000000]"; break;
- case k21c: os << opcode << " " << insn.vA_ << ", thing@" << insn.vB_; break;
- case k23x: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_ << ", v" << insn.vC_; break;
- case k22b: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_ << ", #+" << insn.vC_; break;
- case k22t: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_ << ", +" << insn.vC_; break;
- case k22s: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_ << ", #+" << insn.vC_; break;
- case k22c: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_ << ", thing@" << insn.vC_; break;
- case k32x: os << opcode << " v" << insn.vA_ << ", v" << insn.vB_; break;
- case k30t: os << opcode << " +" << (int)insn.vA_; break;
- case k31t: os << opcode << " v" << insn.vA_ << ", +" << insn.vB_; break;
- case k31i: os << opcode << " v" << insn.vA_ << ", #+" << insn.vB_; break;
- case k31c: os << opcode << " v" << insn.vA_ << ", thing@" << insn.vB_; break;
+ case k10x: os << opcode; break;
+ case k12x: os << StringPrintf("%s v%d, v%d", opcode, insn.vA_, insn.vB_); break;
+ case k11n: os << StringPrintf("%s v%d, #%+d", opcode, insn.vA_, insn.vB_); break;
+ case k11x: os << StringPrintf("%s v%d", opcode, insn.vA_); break;
+ case k10t: os << StringPrintf("%s %+d", opcode, insn.vA_); break;
+ case k20bc: os << StringPrintf("%s %d, kind@%d", opcode, insn.vA_, insn.vB_); break;
+ case k20t: os << StringPrintf("%s %+d", opcode, insn.vA_); break;
+ case k22x: os << StringPrintf("%s v%d, v%d", opcode, insn.vA_, insn.vB_); break;
+ case k21t: os << StringPrintf("%s v%d, %+d", opcode, insn.vA_, insn.vB_); break;
+ case k21s: os << StringPrintf("%s v%d, #%+d", opcode, insn.vA_, insn.vB_); break;
+ case k21h: os << StringPrintf("%s v%d, #%+d00000[00000000]", opcode, insn.vA_, insn.vB_); break;
+ case k21c: os << StringPrintf("%s v%d, thing@%d", opcode, insn.vA_, insn.vB_); break;
+ case k23x: os << StringPrintf("%s v%d, v%d, v%d", opcode, insn.vA_, insn.vB_, insn.vC_); break;
+ case k22b: os << StringPrintf("%s v%d, v%d, #%+d", opcode, insn.vA_, insn.vB_, insn.vC_); break;
+ case k22t: os << StringPrintf("%s v%d, v%d, %+d", opcode, insn.vA_, insn.vB_, insn.vC_); break;
+ case k22s: os << StringPrintf("%s v%d, v%d, #%+d", opcode, insn.vA_, insn.vB_, insn.vC_); break;
+ case k22c: os << StringPrintf("%s v%d, v%d, thing@%d", opcode, insn.vA_, insn.vB_, insn.vC_); break;
+ case k32x: os << StringPrintf("%s v%d, v%d", opcode, insn.vA_, insn.vB_); break;
+ case k30t: os << StringPrintf("%s %+d", opcode, insn.vA_); break;
+ case k31t: os << StringPrintf("%s v%d, %+d", opcode, insn.vA_, insn.vB_); break;
+ case k31i: os << StringPrintf("%s v%d, #%+d", opcode, insn.vA_, insn.vB_); break;
+ case k31c: os << StringPrintf("%s v%d, thing@%d", opcode, insn.vA_, insn.vB_); break;
case k35c: {
switch (insn.opcode_) {
case INVOKE_VIRTUAL:
@@ -321,11 +321,17 @@
case INVOKE_INTERFACE:
if (file != NULL) {
const DexFile::MethodId& meth_id = file->GetMethodId(insn.vB_);
- os << opcode << " {v" << insn.arg_[0] << ", v" << insn.arg_[1] << ", v" << insn.arg_[2]
- << ", v" << insn.arg_[3] << ", v" << insn.arg_[4] << "}, "
- << file->GetMethodDeclaringClassDescriptor(meth_id) << "."
- << file->GetMethodName(meth_id) << file->GetMethodSignature(meth_id)
- << " // method@" << insn.vB_;
+ os << opcode << " {";
+ for (size_t i = 0; i < insn.vA_; ++i) {
+ if (i != 0) {
+ os << ", ";
+ }
+ os << "v" << insn.arg_[i];
+ }
+ os << "}, "
+ << file->GetMethodDeclaringClassDescriptor(meth_id) << "."
+ << file->GetMethodName(meth_id) << file->GetMethodSignature(meth_id)
+ << " // method@" << insn.vB_;
break;
} // else fall-through
default:
@@ -335,8 +341,8 @@
}
break;
}
- case k3rc: os << opcode << " {v" << insn.vC_ << " .. v" << (insn.vC_+ insn.vA_ - 1) << "}, method@" << insn.vB_; break;
- case k51l: os << opcode << " v" << insn.vA_ << ", #+" << insn.vB_; break;
+ case k3rc: os << StringPrintf("%s, {v%d .. v%d}, method@%d", opcode, insn.vC_, (insn.vC_+ insn.vA_ - 1), insn.vB_); break;
+ case k51l: os << StringPrintf("%s v%d, #%+d", opcode, insn.vA_, insn.vB_); break;
default: os << " unknown format (" << DumpHex(5) << ")"; break;
}
return os.str();