ArchUtility.cpp revision 270c1d64a192341be842f46734054c692bac061e
1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at 7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software 11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License. 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "../../CompilerInternals.h" 18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "dexdump/OpCodeNames.h" 1989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee#include "ArmLIR.h" 20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Decode and print a ARM register name */ 22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic char * decodeRegList(int vector, char *buf) 23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 24ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int i; 25ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng bool printed = false; 26ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf[0] = 0; 27ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (i = 0; i < 8; i++, vector >>= 1) { 28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (vector & 0x1) { 29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (printed) { 30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(buf + strlen(buf), ", r%d", i); 31ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 32ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng printed = true; 33ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(buf, "r%d", i); 34ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 35ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 36ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 37ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng return buf; 38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 39ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 407ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbeestatic int expandImmediate(int value) 417ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee{ 427ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee int mode = (value & 0xf00) >> 8; 437ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee u4 bits = value & 0xff; 447ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee switch(mode) { 457ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 0: 467ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return bits; 477ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 1: 487ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 16) | bits; 497ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 2: 507ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 24) | (bits << 8); 517ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 3: 527ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return (bits << 24) | (bits << 16) | (bits << 8) | bits; 537ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee default: 547ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 557ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee } 567ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee bits = (bits | 0x80) << 24; 577ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee return bits >> (((value & 0xf80) >> 7) - 8); 587ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee} 597ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee 60ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 61ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Interpret a format string and build a string no longer than size 62ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See format key in Assemble.c. 63ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 6489efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbeestatic void buildInsnString(char *fmt, ArmLIR *lir, char* buf, 65ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng unsigned char *baseAddr, int size) 66ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 67ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int i; 68ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char *bufEnd = &buf[size-1]; 69ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char *fmtEnd = &fmt[strlen(fmt)]; 70ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char tbuf[256]; 71ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char nc; 72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng while (fmt < fmtEnd) { 73ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int operand; 74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (*fmt == '!') { 75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng fmt++; 76ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng nc = *fmt++; 78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (nc=='!') { 79ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "!"); 80ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 81ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 82270c1d64a192341be842f46734054c692bac061eBill Buzbee assert((unsigned)(nc-'0') < 4); 83ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng operand = lir->operands[nc-'0']; 84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(*fmt++) { 85270c1d64a192341be842f46734054c692bac061eBill Buzbee case 'n': 86270c1d64a192341be842f46734054c692bac061eBill Buzbee operand = ~expandImmediate(operand); 87270c1d64a192341be842f46734054c692bac061eBill Buzbee sprintf(tbuf,"%d [0x%x]", operand, operand); 88270c1d64a192341be842f46734054c692bac061eBill Buzbee break; 897ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'm': 907ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee operand = expandImmediate(operand); 917ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee sprintf(tbuf,"%d [0x%x]", operand, operand); 927ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 939727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 's': 949727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"s%d",operand & FP_REG_MASK); 959727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 969727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 'S': 979727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"d%d",(operand & FP_REG_MASK) >> 1); 989727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 99ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'h': 100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%04x", operand); 101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1027ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'M': 103ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'd': 104ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand); 105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'D': 107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand+8); 108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'E': 110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*4); 111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'F': 113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*2); 114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'c': 116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch (operand) { 117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_EQ: 118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "beq"); 119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_NE: 121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bne"); 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LT: 124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "blt"); 125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GE: 127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bge"); 128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GT: 130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bgt"); 131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LE: 133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "ble"); 134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_CS: 136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bcs"); 137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1387ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case ARM_COND_MI: 1397ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee strcpy(tbuf, "bmi"); 1407ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, ""); 143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 't': 147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"0x%08x", 148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (int) baseAddr + lir->generic.offset + 4 + 149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (operand << 1)); 150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'u': { 152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_1 = lir->operands[0]; 153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_2 = NEXT_LIR(lir)->operands[0]; 154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng intptr_t target = 155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((((intptr_t) baseAddr + lir->generic.offset + 4) & 156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) & 157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 0xfffffffc; 158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf, "%p", (void *) target); 159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Nothing to print for BLX_2 */ 163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'v': 164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "see above"); 165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'R': 167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng decodeRegList(operand, tbuf); 168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf,"DecodeError"); 171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf+strlen(tbuf) <= bufEnd) { 174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(buf, tbuf); 175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf += strlen(tbuf); 176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf++ = *fmt++; 182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf == bufEnd) 184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf = 0; 187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Pretty-print a LIR instruction */ 190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic void dumpLIRInsn(LIR *arg, unsigned char *baseAddr) 191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 19289efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *lir = (ArmLIR *) arg; 193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char buf[256]; 194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char opName[256]; 195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset = lir->generic.offset; 196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int dest = lir->operands[0]; 197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng u2 *cPtr = (u2*)baseAddr; 198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Handle pseudo-ops individually, and all regular insns as a group */ 199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(lir->opCode) { 20089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_TARGET_LABEL: 201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 20289efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_NORMAL: 2031efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (normal): 0x%04x\n", dest); 204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 20589efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_HOT: 2061efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (hot): 0x%04x\n", dest); 207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 20889efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_PREDICTED: 20938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (predicted)\n"); 21038329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng break; 21189efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_SINGLETON: 21238329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (invoke singleton): %s/%p\n", 213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->name, 214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->insns); 215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 21697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao case ARM_PSEUDO_CHAINING_CELL_BACKWARD_BRANCH: 21797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao LOGD("-------- chaining cell (backward branch): 0x%04x\n", dest); 21897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao break; 21989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_DALVIK_BYTECODE_BOUNDARY: 220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- dalvik offset: 0x%04x @ %s\n", dest, 221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng getOpcodeName(lir->operands[1])); 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 22389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_ALIGN4: 224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .align4\n", baseAddr + offset, offset); 225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 22689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_CELL: 227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x\n", dest, 228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng lir->operands[1]); 229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_BLOCK_LABEL: 231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Do nothing */ 232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_EH_BLOCK_LABEL: 234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Exception_Handling:\n"); 235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_NORMAL_BLOCK_LABEL: 237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("L%#06x:\n", dest); 238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 240e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng if (lir->isNop) { 241e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng break; 242e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng } 243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].name, lir, opName, 244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng baseAddr, 256); 245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].fmt, lir, buf, baseAddr, 246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256); 247e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng LOGD("%p (%04x): %-8s%s\n", 248e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng baseAddr + offset, offset, opName, buf); 249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */ 254ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Dumping LIR insns\n"); 257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LIR *lirInsn; 25889efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *armLIR; 259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("installed code is at %p\n", cUnit->baseAddr); 261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("total size is %d bytes\n", cUnit->totalSize); 262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng dumpLIRInsn(lirInsn, cUnit->baseAddr); 264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 265ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->wordList; lirInsn; lirInsn = lirInsn->next) { 26689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee armLIR = (ArmLIR *) lirInsn; 267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .word (0x%x)\n", 268716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee (char*)cUnit->baseAddr + armLIR->generic.offset, armLIR->generic.offset, 269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR->operands[0]); 270ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 272