Elliott Hughes | 2faa5f1 | 2012-01-30 14:42:07 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2011 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 16 | |
| 17 | #include <stdio.h> |
| 18 | |
| 19 | #include "UniquePtr.h" |
| 20 | #include "class_linker.h" |
Ian Rogers | 4f6ad8a | 2013-03-18 15:27:28 -0700 | [diff] [blame] | 21 | #include "dex_file-inl.h" |
Ian Rogers | 0c7abda | 2012-09-19 13:33:42 -0700 | [diff] [blame] | 22 | #include "gc_map.h" |
Brian Carlstrom | ea46f95 | 2013-07-30 01:26:50 -0700 | [diff] [blame] | 23 | #include "mirror/art_method.h" |
| 24 | #include "mirror/art_method-inl.h" |
Ian Rogers | 4f6ad8a | 2013-03-18 15:27:28 -0700 | [diff] [blame] | 25 | #include "mirror/class-inl.h" |
Ian Rogers | 2dd0e2c | 2013-01-24 12:42:14 -0800 | [diff] [blame] | 26 | #include "mirror/object_array-inl.h" |
Ian Rogers | 8d11af5 | 2013-08-15 14:24:29 -0700 | [diff] [blame] | 27 | #include "mirror/object-inl.h" |
Ian Rogers | 6d4d9fc | 2011-11-30 16:24:48 -0800 | [diff] [blame] | 28 | #include "object_utils.h" |
Ian Rogers | 00f7d0e | 2012-07-19 15:28:27 -0700 | [diff] [blame] | 29 | #include "scoped_thread_state_change.h" |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 30 | #include "thread.h" |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 31 | #include "jni.h" |
Ian Rogers | 776ac1f | 2012-04-13 23:36:36 -0700 | [diff] [blame] | 32 | #include "verifier/method_verifier.h" |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 33 | |
| 34 | namespace art { |
| 35 | |
Ian Rogers | 6d4d9fc | 2011-11-30 16:24:48 -0800 | [diff] [blame] | 36 | #define IS_IN_REF_BITMAP(mh, ref_bitmap, reg) \ |
Brian Carlstrom | 6f485c6 | 2013-07-18 15:35:35 -0700 | [diff] [blame] | 37 | (((reg) < mh.GetCodeItem()->registers_size_) && \ |
| 38 | ((*((ref_bitmap) + (reg)/8) >> ((reg) % 8) ) & 0x01)) |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 39 | |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 40 | #define CHECK_REGS_CONTAIN_REFS(...) \ |
| 41 | do { \ |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 42 | int t[] = {__VA_ARGS__}; \ |
| 43 | int t_size = sizeof(t) / sizeof(*t); \ |
| 44 | for (int i = 0; i < t_size; ++i) \ |
Ian Rogers | 6d4d9fc | 2011-11-30 16:24:48 -0800 | [diff] [blame] | 45 | CHECK(IS_IN_REF_BITMAP(mh, ref_bitmap, t[i])) \ |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 46 | << "Error: Reg @ " << i << "-th argument is not in GC map"; \ |
Elliott Hughes | b25c3f6 | 2012-03-26 16:35:06 -0700 | [diff] [blame] | 47 | } while (false) |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 48 | |
Ian Rogers | 0399dde | 2012-06-06 17:09:28 -0700 | [diff] [blame] | 49 | struct ReferenceMap2Visitor : public StackVisitor { |
Ian Rogers | 7a22fa6 | 2013-01-23 12:16:16 -0800 | [diff] [blame] | 50 | explicit ReferenceMap2Visitor(Thread* thread) |
Ian Rogers | b726dcb | 2012-09-05 08:57:23 -0700 | [diff] [blame] | 51 | SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) |
Ian Rogers | 7a22fa6 | 2013-01-23 12:16:16 -0800 | [diff] [blame] | 52 | : StackVisitor(thread, NULL) { |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 53 | } |
| 54 | |
Ian Rogers | b726dcb | 2012-09-05 08:57:23 -0700 | [diff] [blame] | 55 | bool VisitFrame() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { |
Brian Carlstrom | ea46f95 | 2013-07-30 01:26:50 -0700 | [diff] [blame] | 56 | mirror::ArtMethod* m = GetMethod(); |
Ian Rogers | 0399dde | 2012-06-06 17:09:28 -0700 | [diff] [blame] | 57 | if (!m || m->IsNative() || m->IsRuntimeMethod() || IsShadowFrame()) { |
Elliott Hughes | 530fa00 | 2012-03-12 11:44:49 -0700 | [diff] [blame] | 58 | return true; |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 59 | } |
| 60 | LOG(INFO) << "At " << PrettyMethod(m, false); |
| 61 | |
Ian Rogers | 0c7abda | 2012-09-19 13:33:42 -0700 | [diff] [blame] | 62 | NativePcOffsetToReferenceMap map(m->GetNativeGcMap()); |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 63 | |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 64 | if (m->IsCalleeSaveMethod()) { |
| 65 | LOG(WARNING) << "no PC for " << PrettyMethod(m); |
Elliott Hughes | 530fa00 | 2012-03-12 11:44:49 -0700 | [diff] [blame] | 66 | return true; |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 67 | } |
| 68 | |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 69 | const uint8_t* ref_bitmap = NULL; |
Ian Rogers | 6d4d9fc | 2011-11-30 16:24:48 -0800 | [diff] [blame] | 70 | MethodHelper mh(m); |
| 71 | std::string m_name(mh.GetName()); |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 72 | |
| 73 | // Given the method name and the number of times the method has been called, |
| 74 | // we know the Dex registers with live reference values. Assert that what we |
| 75 | // find is what is expected. |
| 76 | if (m_name.compare("f") == 0) { |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 77 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x03U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 78 | CHECK(ref_bitmap); |
| 79 | CHECK_REGS_CONTAIN_REFS(8); // v8: this |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 80 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 81 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x06U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 82 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 83 | CHECK_REGS_CONTAIN_REFS(8, 1); // v8: this, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 84 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 85 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x08U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 86 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 87 | CHECK_REGS_CONTAIN_REFS(8, 3, 1); // v8: this, v3: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 88 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 89 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x0cU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 90 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 91 | CHECK_REGS_CONTAIN_REFS(8, 3, 1); // v8: this, v3: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 92 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 93 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x0eU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 94 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 95 | CHECK_REGS_CONTAIN_REFS(8, 3, 1); // v8: this, v3: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 96 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 97 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x10U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 98 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 99 | CHECK_REGS_CONTAIN_REFS(8, 3, 1); // v8: this, v3: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 100 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 101 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x13U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 102 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 103 | // v2 is added because of the instruction at DexPC 0024. Object merges with 0 is Object. See: |
| 104 | // 0024: move-object v3, v2 |
| 105 | // 0025: goto 0013 |
| 106 | // Detaled dex instructions for ReferenceMap.java are at the end of this function. |
Brian Carlstrom | 0f055d1 | 2013-07-26 12:46:02 -0700 | [diff] [blame] | 107 | // CHECK_REGS_CONTAIN_REFS(8, 3, 2, 1); // v8: this, v3: y, v2: y, v1: x |
Ian Rogers | b8c7859 | 2013-07-25 23:52:52 +0000 | [diff] [blame] | 108 | // We eliminate the non-live registers at a return, so only v3 is live: |
| 109 | CHECK_REGS_CONTAIN_REFS(3); // v3: y |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 110 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 111 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x18U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 112 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 113 | CHECK_REGS_CONTAIN_REFS(8, 2, 1, 0); // v8: this, v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 114 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 115 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x1aU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 116 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 117 | CHECK_REGS_CONTAIN_REFS(8, 5, 2, 1, 0); // v8: this, v5: x[1], v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 118 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 119 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x1dU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 120 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 121 | CHECK_REGS_CONTAIN_REFS(8, 5, 2, 1, 0); // v8: this, v5: x[1], v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 122 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 123 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x1fU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 124 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 125 | // v5 is removed from the root set because there is a "merge" operation. |
| 126 | // See 0015: if-nez v2, 001f. |
| 127 | CHECK_REGS_CONTAIN_REFS(8, 2, 1, 0); // v8: this, v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 128 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 129 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x21U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 130 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 131 | CHECK_REGS_CONTAIN_REFS(8, 2, 1, 0); // v8: this, v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 132 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 133 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x27U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 134 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 135 | CHECK_REGS_CONTAIN_REFS(8, 4, 2, 1); // v8: this, v4: ex, v2: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 136 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 137 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x29U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 138 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 139 | CHECK_REGS_CONTAIN_REFS(8, 4, 2, 1); // v8: this, v4: ex, v2: y, v1: x |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 140 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 141 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x2cU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 142 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 143 | CHECK_REGS_CONTAIN_REFS(8, 4, 2, 1); // v8: this, v4: ex, v2: y, v1: x |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 144 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 145 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x2fU))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 146 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 147 | CHECK_REGS_CONTAIN_REFS(8, 4, 3, 2, 1); // v8: this, v4: ex, v3: y, v2: y, v1: x |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 148 | |
Ian Rogers | 1809a72 | 2013-08-09 22:05:32 -0700 | [diff] [blame] | 149 | ref_bitmap = map.FindBitMap(m->NativePcOffset(m->ToNativePc(0x32U))); |
Shih-wei Liao | 39723d3 | 2011-10-24 02:20:31 -0700 | [diff] [blame] | 150 | CHECK(ref_bitmap); |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 151 | CHECK_REGS_CONTAIN_REFS(8, 3, 2, 1, 0); // v8: this, v3: y, v2: y, v1: x, v0: ex |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 152 | } |
Elliott Hughes | 530fa00 | 2012-03-12 11:44:49 -0700 | [diff] [blame] | 153 | |
| 154 | return true; |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 155 | } |
| 156 | }; |
| 157 | |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 158 | // Dex instructions for the function 'f' in ReferenceMap.java |
| 159 | // Virtual methods - |
| 160 | // #0 : (in LReferenceMap;) |
| 161 | // name : 'f' |
| 162 | // type : '()Ljava/lang/Object;' |
| 163 | // access : 0x0000 () |
| 164 | // code - |
| 165 | // registers : 9 |
| 166 | // ins : 1 |
| 167 | // outs : 2 |
| 168 | // insns size : 51 16-bit code units |
| 169 | // |[0001e8] ReferenceMap.f:()Ljava/lang/Object; |
| 170 | // |0000: const/4 v4, #int 2 // #2 |
| 171 | // |0001: const/4 v7, #int 0 // #0 |
| 172 | // |0002: const/4 v6, #int 1 // #1 |
| 173 | // |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 174 | // 0:[Unknown],1:[Unknown],2:[Unknown],3:[Unknown],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
| 175 | // |0003: new-array v1, v4, [Ljava/lang/Object; // type@0007 |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 176 | // |0005: const/4 v2, #int 0 // #0 |
| 177 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 178 | // 0:[Unknown],1:[Reference: java.lang.Object[]],2:[Zero],3:[Unknown],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
| 179 | // |0006: new-instance v3, Ljava/lang/Object; // type@0003 |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 180 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 181 | // [Unknown],1:[Reference: java.lang.Object[]],2:[Zero],3:[Uninitialized Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 182 | // |0008: +invoke-object-init/range {}, Ljava/lang/Object;.<init>:()V // method@0005 |
| 183 | // |000b: const/4 v4, #int 2 // #2 |
| 184 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 185 | // 0:[Unknown],1:[Reference: java.lang.Object[]],2:[Zero],3:[Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 186 | // |000c: aput-object v3, v1, v4 |
| 187 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 188 | // 0:[Unknown],1:[Reference: java.lang.Object[]],2:[Zero],3:[Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 189 | // |000e: aput-object v3, v1, v6 |
| 190 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 191 | // 0:[Unknown],1:[Reference: java.lang.Object[]],2:[Zero],3:[Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 192 | // |0010: +invoke-virtual-quick {v8, v7}, [000c] // vtable #000c |
| 193 | |
Brian Carlstrom | 0f055d1 | 2013-07-26 12:46:02 -0700 | [diff] [blame] | 194 | // 0:[Conflict],1:[Conflict],2:[Conflict],3:[Reference: java.lang.Object],4:[Conflict],5:[Conflict],6:[Conflict],7:[Conflict],8:[Conflict], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 195 | // |0013: return-object v3 |
| 196 | // |0014: move-exception v0 |
| 197 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 198 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 199 | // |0015: if-nez v2, 001f // +000a |
| 200 | // |0017: const/4 v4, #int 1 // #1 |
| 201 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 202 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 1],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
| 203 | // |0018: new-instance v5, Ljava/lang/Object; // type@0003 |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 204 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 205 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 1],5:[Uninitialized Reference: java.lang.Object],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 206 | // |001a: +invoke-object-init/range {}, Ljava/lang/Object;.<init>:()V // method@0005 |
| 207 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 208 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 1],5:[Reference: java.lang.Object],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 209 | // |001d: aput-object v5, v1, v4 |
| 210 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 211 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 2],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 212 | // |001f: aput-object v2, v1, v6 |
| 213 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 214 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[32-bit Constant: 2],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 215 | // |0021: +invoke-virtual-quick {v8, v7}, [000c] // vtable #000c |
| 216 | // |0024: move-object v3, v2 |
| 217 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 218 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 219 | // |0025: goto 0013 // -0012 |
| 220 | // |0026: move-exception v4 |
| 221 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 222 | // 0:[Conflict],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[Reference: java.lang.Throwable],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 223 | // |0027: aput-object v2, v1, v6 |
| 224 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 225 | // 0:[Conflict],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[Reference: java.lang.Throwable],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 226 | // |0029: +invoke-virtual-quick {v8, v7}, [000c] // vtable #000c |
| 227 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 228 | // 0:[Conflict],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Conflict],4:[Reference: java.lang.Throwable],5:[Conflict],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 229 | // |002c: throw v4 |
| 230 | // |002d: move-exception v4 |
| 231 | // |002e: move-object v2, v3 |
| 232 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 233 | // 0:[Unknown],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Reference: java.lang.Object],4:[Reference: java.lang.Throwable],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 234 | // |002f: goto 0027 // -0008 |
| 235 | // |0030: move-exception v0 |
| 236 | // |0031: move-object v2, v3 |
| 237 | |
Brian Carlstrom | 7934ac2 | 2013-07-26 10:54:15 -0700 | [diff] [blame] | 238 | // 0:[Reference: java.lang.Exception],1:[Reference: java.lang.Object[]],2:[Reference: java.lang.Object],3:[Reference: java.lang.Object],4:[32-bit Constant: 2],5:[Unknown],6:[32-bit Constant: 1],7:[Zero],8:[Reference: ReferenceMap], |
Shih-wei Liao | 371814f | 2011-10-27 16:52:10 -0700 | [diff] [blame] | 239 | // |0032: goto 0015 // -001d |
| 240 | // catches : 3 |
| 241 | // 0x0006 - 0x000b |
| 242 | // Ljava/lang/Exception; -> 0x0014 |
| 243 | // <any> -> 0x0026 |
| 244 | // 0x000c - 0x000e |
| 245 | // Ljava/lang/Exception; -> 0x0030 |
| 246 | // <any> -> 0x002d |
| 247 | // 0x0018 - 0x001f |
| 248 | // <any> -> 0x0026 |
| 249 | // positions : |
| 250 | // 0x0003 line=8 |
| 251 | // 0x0005 line=9 |
| 252 | // 0x0006 line=11 |
| 253 | // 0x000b line=12 |
| 254 | // 0x000e line=18 |
| 255 | // 0x0010 line=19 |
| 256 | // 0x0013 line=21 |
| 257 | // 0x0014 line=13 |
| 258 | // 0x0015 line=14 |
| 259 | // 0x0017 line=15 |
| 260 | // 0x001f line=18 |
| 261 | // 0x0021 line=19 |
| 262 | // 0x0025 line=20 |
| 263 | // 0x0026 line=18 |
| 264 | // 0x0029 line=19 |
| 265 | // 0x002d line=18 |
| 266 | // 0x0030 line=13 |
| 267 | // locals : |
| 268 | // 0x0006 - 0x000b reg=2 y Ljava/lang/Object; |
| 269 | // 0x000b - 0x0013 reg=3 y Ljava/lang/Object; |
| 270 | // 0x0014 - 0x0015 reg=2 y Ljava/lang/Object; |
| 271 | // 0x0015 - 0x0026 reg=0 ex Ljava/lang/Exception; |
| 272 | // 0x002d - 0x0032 reg=3 y Ljava/lang/Object; |
| 273 | // 0x0005 - 0x0033 reg=1 x [Ljava/lang/Object; |
| 274 | // 0x0032 - 0x0033 reg=2 y Ljava/lang/Object; |
| 275 | // 0x0000 - 0x0033 reg=8 this LReferenceMap; |
| 276 | |
Elliott Hughes | 1bac54f | 2012-03-16 12:48:31 -0700 | [diff] [blame] | 277 | extern "C" JNIEXPORT jint JNICALL Java_ReferenceMap_refmap(JNIEnv*, jobject, jint count) { |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 278 | // Visitor |
Ian Rogers | 7a22fa6 | 2013-01-23 12:16:16 -0800 | [diff] [blame] | 279 | ScopedObjectAccess soa(Thread::Current()); |
| 280 | ReferenceMap2Visitor mapper(soa.Self()); |
Ian Rogers | 0399dde | 2012-06-06 17:09:28 -0700 | [diff] [blame] | 281 | mapper.WalkStack(); |
Shih-wei Liao | 63433ba | 2011-10-15 18:40:39 -0700 | [diff] [blame] | 282 | |
| 283 | return count + 1; |
| 284 | } |
| 285 | |
Brian Carlstrom | 0cd7ec2 | 2013-07-17 23:40:20 -0700 | [diff] [blame] | 286 | } // namespace art |