blob: af2c4f31525bf7edae088dfcb53f0082ae67a119 [file] [log] [blame]
Shih-wei Liao63433ba2011-10-15 18:40:39 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#include <stdio.h>
4
5#include "UniquePtr.h"
6#include "class_linker.h"
7#include "dex_verifier.h"
8#include "object.h"
9#include "jni.h"
10
11namespace art {
12
Ian Rogersd81871c2011-10-03 13:57:23 -070013#define REG(method, reg_bitmap, reg) \
Shih-wei Liao63433ba2011-10-15 18:40:39 -070014 ( ((reg) < (method)->NumRegisters()) && \
Ian Rogersd81871c2011-10-03 13:57:23 -070015 (( *((reg_bitmap) + (reg)/8) >> ((reg) % 8) ) & 0x01) )
Shih-wei Liao63433ba2011-10-15 18:40:39 -070016
17#define CHECK_REGS(...) do { \
18 int t[] = {__VA_ARGS__}; \
19 int t_size = sizeof(t) / sizeof(*t); \
20 for (int i = 0; i < t_size; ++i) \
Ian Rogersd81871c2011-10-03 13:57:23 -070021 EXPECT_TRUE(REG(m, reg_bitmap, t[i])) << "Error: Reg " << i << " is not in RegisterMap"; \
Shih-wei Liao63433ba2011-10-15 18:40:39 -070022 } while(false)
23
24// << "Error: Reg " << i << " is not in RegisterMap";
25
26struct ReferenceMap2Visitor : public Thread::StackVisitor {
27 ReferenceMap2Visitor() {
28 }
29
30 void VisitFrame(const Frame& frame, uintptr_t pc) {
31 Method* m = frame.GetMethod();
Brian Carlstrom40381fb2011-10-19 14:13:40 -070032 if (!m || m->IsNative()) {
Shih-wei Liao63433ba2011-10-15 18:40:39 -070033 return;
34 }
35 LOG(INFO) << "At " << PrettyMethod(m, false);
36
Ian Rogersd81871c2011-10-03 13:57:23 -070037 verifier::PcToReferenceMap map(m);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070038
39 if (!pc) {
40 // pc == NULL: m is either a native method or a phony method
41 return;
42 }
43 if (m->IsCalleeSaveMethod()) {
44 LOG(WARNING) << "no PC for " << PrettyMethod(m);
45 return;
46 }
47
Ian Rogersd81871c2011-10-03 13:57:23 -070048 const uint8_t* reg_bitmap = NULL;
Shih-wei Liao63433ba2011-10-15 18:40:39 -070049 std::string m_name = m->GetName()->ToModifiedUtf8();
50
51 // Given the method name and the number of times the method has been called,
52 // we know the Dex registers with live reference values. Assert that what we
53 // find is what is expected.
54 if (m_name.compare("f") == 0) {
Ian Rogersd81871c2011-10-03 13:57:23 -070055 reg_bitmap = map.FindBitMap(0x01U);
56 if (reg_bitmap) {
57 LOG(WARNING) << "Reg1: " << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070058 CHECK_REGS(7); //v7: this
59 }
60
Ian Rogersd81871c2011-10-03 13:57:23 -070061 reg_bitmap = map.FindBitMap(0x02U);
62 if (reg_bitmap) {
63 LOG(WARNING) << "Reg2: " << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070064 CHECK_REGS(7); //v7: this
65 }
66
Ian Rogersd81871c2011-10-03 13:57:23 -070067 reg_bitmap = map.FindBitMap(0x03U);
68 if (reg_bitmap) {
69 LOG(WARNING) << "Reg3: " << std::hex << reg_bitmap[0] << reg_bitmap[1];
Shih-wei Liao63433ba2011-10-15 18:40:39 -070070 CHECK_REGS(7); //v7: this
71 }
72
Ian Rogersd81871c2011-10-03 13:57:23 -070073 reg_bitmap = map.FindBitMap(0x05U);
74 if (reg_bitmap) {
75 LOG(WARNING) << "Reg4: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070076 CHECK_REGS(0, 7); //v0: x, v7: this
77 }
78
Ian Rogersd81871c2011-10-03 13:57:23 -070079 reg_bitmap = map.FindBitMap(0x06U);
80 if (reg_bitmap) {
81 LOG(WARNING) << "Reg5: " << std::hex << reg_bitmap[0] << reg_bitmap[1];
Shih-wei Liao63433ba2011-10-15 18:40:39 -070082 CHECK_REGS(0, 7); //v0: x, v7: this
83 }
84
Ian Rogersd81871c2011-10-03 13:57:23 -070085 reg_bitmap = map.FindBitMap(0x08U);
86 if (reg_bitmap) {
87 LOG(WARNING) << "Reg6: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070088 CHECK_REGS(0, 2, 7); //v0: x, v2: y, v7: this
89 }
90
Ian Rogersd81871c2011-10-03 13:57:23 -070091 reg_bitmap = map.FindBitMap(0x0bU);
92 if (reg_bitmap) {
93 LOG(WARNING) << "Reg7: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -070094 CHECK_REGS(0, 2, 7); //v0: x, v2: y, v7: this
95 }
96
Ian Rogersd81871c2011-10-03 13:57:23 -070097 reg_bitmap = map.FindBitMap(0x0cU);
98 if (reg_bitmap) {
99 LOG(WARNING) << "Reg8: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700100 CHECK_REGS(0, 2, 7); //v0: x, v2: y, v7: this
101 }
102
Ian Rogersd81871c2011-10-03 13:57:23 -0700103 reg_bitmap = map.FindBitMap(0x38U);
104 if (reg_bitmap) {
105 LOG(WARNING) << "Reg9: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700106 CHECK_REGS(0, 2, 7); //v0: x, v2: y, v7: this
107 }
108
Ian Rogersd81871c2011-10-03 13:57:23 -0700109 reg_bitmap = map.FindBitMap(0x39U);
110 if (reg_bitmap) {
111 LOG(WARNING) << "Reg10: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700112 CHECK_REGS(0, 2, 7, 1); //v0: x, v2: y, v7: this, v1: ex
113 }
114
Ian Rogersd81871c2011-10-03 13:57:23 -0700115 reg_bitmap = map.FindBitMap(0x3aU);
116 if (reg_bitmap) {
117 LOG(WARNING) << "Reg11: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700118 CHECK_REGS(0, 2, 7, 1); //v0: x, v2: y, v7: this, v1: y
119 }
120
Ian Rogersd81871c2011-10-03 13:57:23 -0700121 reg_bitmap = map.FindBitMap(0x16U);
122 if (reg_bitmap) {
123 LOG(WARNING) << "Reg12: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700124 CHECK_REGS(0, 7, 1); //v0: x, v7: this, v1: y
125 }
126
Ian Rogersd81871c2011-10-03 13:57:23 -0700127 reg_bitmap = map.FindBitMap(0x20U);
128 if (reg_bitmap) {
129 LOG(WARNING) << "Reg13: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700130 CHECK_REGS(0, 7, 1); //v0: x, v7: this, v1: y
131 }
132
Ian Rogersd81871c2011-10-03 13:57:23 -0700133 reg_bitmap = map.FindBitMap(0x22U);
134 if (reg_bitmap) {
135 LOG(WARNING) << "Reg14: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700136 CHECK_REGS(0, 7, 1); //v0: x, v7: this, v1: y
137 }
138
Ian Rogersd81871c2011-10-03 13:57:23 -0700139 reg_bitmap = map.FindBitMap(0x25U);
140 if (reg_bitmap) {
141 LOG(WARNING) << "Reg15: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700142 CHECK_REGS(0); //v0: x, v7: this, v1: y
143 }
144
Ian Rogersd81871c2011-10-03 13:57:23 -0700145 reg_bitmap = map.FindBitMap(0x26U);
146 if (reg_bitmap) {
147 LOG(WARNING) << "Reg16: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700148 CHECK_REGS(0, 7, 1); //v0: y, v7: this, v1: y
149 }
150
Ian Rogersd81871c2011-10-03 13:57:23 -0700151 reg_bitmap = map.FindBitMap(0x14U);
152 if (reg_bitmap) {
153 LOG(WARNING) << "Reg17: " << std::hex << *reg_bitmap << *(reg_bitmap+1);
Shih-wei Liao63433ba2011-10-15 18:40:39 -0700154 CHECK_REGS(0, 7); //v0: y, v7: this
155 }
156 }
157
158 }
159};
160
161extern "C"
162JNIEXPORT jint JNICALL Java_ReferenceMap_refmap(JNIEnv* env, jobject thisObj, jint count) {
163 // Visitor
164 ReferenceMap2Visitor mapper;
165 Thread::Current()->WalkStack(&mapper);
166
167 return count + 1;
168}
169
170}