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

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..950fd1676b57f6f048293c1524479c20397ea843 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -25,35 +25,44 @@ 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) == (0x80 | (THR & 7))) { // [r14+disp32]
+ int32_t offset = *reinterpret_cast<int32_t*>(pc + 3);
+ return Thread::ObjectAtOffset(offset, obj);
+ }
+ if ((bytes[2] & 0xc7) == (0x40 | (THR & 7))) { // [r14+disp8]
+ uint8_t offset = *reinterpret_cast<uint8_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