Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1873)

Unified Diff: runtime/vm/instructions_x64.cc

Issue 1888353002: x64: Decode more objects for code view. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/instructions_x64.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/instructions_x64.cc
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index 3fa610aa9b04015ecd6b772f38fbffe5b7998b04..33ded5b449055fe8042784fb0a9a6a721de83f68 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -25,35 +25,46 @@ bool DecodeLoadObjectFromPoolOrThread(uword pc,
ASSERT(code.ContainsInstructionAt(pc));
uint8_t* bytes = reinterpret_cast<uint8_t*>(pc);
+
COMPILE_ASSERT(PP == R15);
- if (((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x9f)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x87)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0xa7)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x9f)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x97))) {
- intptr_t index = IndexFromPPLoad(pc + 3);
- const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
- if (pool.InfoAt(index) == ObjectPool::kTaggedObject) {
- *obj = pool.ObjectAt(index);
- return true;
+ if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
+ if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) { // movq, cmpq
+ if ((bytes[2] & 0xc7) == (0x80 | (PP & 7))) { // [R15+disp32]
+ intptr_t index = IndexFromPPLoad(pc + 3);
+ const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
+ if (pool.InfoAt(index) == ObjectPool::kTaggedObject) {
+ *obj = pool.ObjectAt(index);
+ return true;
+ }
+ }
+ if ((bytes[2] & 0xc7) == (0x40 | (PP & 7))) { // [R15+disp8]
+ intptr_t index = IndexFromPPLoadDisp8(pc + 3);
+ const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
+ if (pool.InfoAt(index) == ObjectPool::kTaggedObject) {
+ *obj = pool.ObjectAt(index);
+ return true;
+ }
+ }
}
}
+
COMPILE_ASSERT(THR == R14);
- if (((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x86)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0xb6)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x96)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x9e)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x9e)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0xa6))) {
- int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
- return Thread::ObjectAtOffset(offset, obj);
+ if ((bytes[0] == 0x49) || (bytes[0] == 0x4d)) {
+ if ((bytes[1] == 0x8b) || (bytes[1] == 0x3b)) { // movq, cmpq
+ if ((bytes[2] & 0xc7) == (0x40 | (R14 & 7))) {
Florian Schneider 2016/04/15 16:57:49 s/R14/THR/g for consistency with PP above. Maybe
sra1 2016/04/15 17:55:00 Done.
+ // [r14+disp8]
Florian Schneider 2016/04/15 16:57:49 Move to prev line.
sra1 2016/04/15 17:55:00 Done.
+ uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+ if ((bytes[2] & 0307) == (0x80 | (R14 & 7))) {
Florian Schneider 2016/04/15 16:57:49 Please don't use octal literals... if ((bytes[2]
sra1 2016/04/15 17:55:00 Done. I missed that one. (mod r/m fields correspon
sra1 2016/04/15 17:55:00 Done.
+ // [r14+disp32]
+ int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+ }
}
- if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x3b) && (bytes[2] == 0x66)) ||
- ((bytes[0] == 0x49) && (bytes[1] == 0x8b) && (bytes[2] == 0x46)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x5e)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x66)) ||
- ((bytes[0] == 0x4d) && (bytes[1] == 0x8b) && (bytes[2] == 0x6e))) {
+ if (((bytes[0] == 0x41) && (bytes[1] == 0xff) && (bytes[2] == 0x76))) {
+ // push [r14+disp8]
uint8_t offset = *reinterpret_cast<uint8_t*>(pc + 3);
return Thread::ObjectAtOffset(offset, obj);
}
« no previous file with comments | « runtime/vm/instructions_x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698