ArchUtility.cpp revision a4a7f0708e75eefae8cf9fff3f9e15699f7881be
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++) { 85a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee case 'b': 86a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf,"0000"); 87a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee for (i=3; i>= 0; i--) { 88a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee tbuf[i] += operand & 1; 89a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee operand >>= 1; 90a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee } 91a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee break; 92270c1d64a192341be842f46734054c692bac061eBill Buzbee case 'n': 93270c1d64a192341be842f46734054c692bac061eBill Buzbee operand = ~expandImmediate(operand); 94270c1d64a192341be842f46734054c692bac061eBill Buzbee sprintf(tbuf,"%d [0x%x]", operand, operand); 95270c1d64a192341be842f46734054c692bac061eBill Buzbee break; 967ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'm': 977ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee operand = expandImmediate(operand); 987ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee sprintf(tbuf,"%d [0x%x]", operand, operand); 997ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 1009727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 's': 1019727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"s%d",operand & FP_REG_MASK); 1029727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 1039727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee case 'S': 1049727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee sprintf(tbuf,"d%d",(operand & FP_REG_MASK) >> 1); 1059727c3de12ab9daed0d92f6da2f5c0b0169e698dBill Buzbee break; 106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'h': 107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%04x", operand); 108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1097ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case 'M': 110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'd': 111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand); 112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'D': 114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand+8); 115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'E': 117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*4); 118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'F': 120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*2); 121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'c': 123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch (operand) { 124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_EQ: 125a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "eq"); 126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_NE: 128a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "ne"); 129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LT: 131a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "lt"); 132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GE: 134a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "ge"); 135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GT: 137a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "gt"); 138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LE: 140a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "le"); 141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_CS: 143a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "cs"); 144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1457ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee case ARM_COND_MI: 146a4a7f0708e75eefae8cf9fff3f9e15699f7881beBill Buzbee strcpy(tbuf, "mi"); 1477ea0f64d067cd8a2213c2c04a3291335c34d9602Bill Buzbee break; 148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, ""); 150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 't': 154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"0x%08x", 155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (int) baseAddr + lir->generic.offset + 4 + 156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (operand << 1)); 157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'u': { 159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_1 = lir->operands[0]; 160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_2 = NEXT_LIR(lir)->operands[0]; 161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng intptr_t target = 162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((((intptr_t) baseAddr + lir->generic.offset + 4) & 163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) & 164ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 0xfffffffc; 165ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf, "%p", (void *) target); 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 167ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 168ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Nothing to print for BLX_2 */ 170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'v': 171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "see above"); 172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'R': 174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng decodeRegList(operand, tbuf); 175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf,"DecodeError"); 178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf+strlen(tbuf) <= bufEnd) { 181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(buf, tbuf); 182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf += strlen(tbuf); 183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf++ = *fmt++; 189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf == bufEnd) 191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf = 0; 194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 196ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Pretty-print a LIR instruction */ 197ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic void dumpLIRInsn(LIR *arg, unsigned char *baseAddr) 198ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 19989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *lir = (ArmLIR *) arg; 200ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char buf[256]; 201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char opName[256]; 202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset = lir->generic.offset; 203ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int dest = lir->operands[0]; 204ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng u2 *cPtr = (u2*)baseAddr; 205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Handle pseudo-ops individually, and all regular insns as a group */ 206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(lir->opCode) { 20789efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_TARGET_LABEL: 208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 20989efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_NORMAL: 2101efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (normal): 0x%04x\n", dest); 211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 21289efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_HOT: 2131efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (hot): 0x%04x\n", dest); 214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 21589efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_PREDICTED: 21638329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (predicted)\n"); 21738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng break; 21889efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_SINGLETON: 21938329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (invoke singleton): %s/%p\n", 220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->name, 221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->insns); 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 22397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao case ARM_PSEUDO_CHAINING_CELL_BACKWARD_BRANCH: 22497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao LOGD("-------- chaining cell (backward branch): 0x%04x\n", dest); 22597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao break; 22689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_DALVIK_BYTECODE_BOUNDARY: 227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- dalvik offset: 0x%04x @ %s\n", dest, 228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng getOpcodeName(lir->operands[1])); 229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_ALIGN4: 231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .align4\n", baseAddr + offset, offset); 232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_CELL: 234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x\n", dest, 235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng lir->operands[1]); 236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 23789efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_BLOCK_LABEL: 238ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Do nothing */ 239ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 24089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_EH_BLOCK_LABEL: 241ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Exception_Handling:\n"); 242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 24389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_NORMAL_BLOCK_LABEL: 244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("L%#06x:\n", dest); 245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 247e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng if (lir->isNop) { 248e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng break; 249e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng } 250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].name, lir, opName, 251ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng baseAddr, 256); 252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].fmt, lir, buf, baseAddr, 253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256); 254e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng LOGD("%p (%04x): %-8s%s\n", 255e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng baseAddr + offset, offset, opName, buf); 256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 258ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 259ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 260ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */ 261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Dumping LIR insns\n"); 264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LIR *lirInsn; 26589efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *armLIR; 266ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("installed code is at %p\n", cUnit->baseAddr); 268ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("total size is %d bytes\n", cUnit->totalSize); 269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 270ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng dumpLIRInsn(lirInsn, cUnit->baseAddr); 271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 272ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->wordList; lirInsn; lirInsn = lirInsn->next) { 27389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee armLIR = (ArmLIR *) lirInsn; 274ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .word (0x%x)\n", 275716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee (char*)cUnit->baseAddr + armLIR->generic.offset, armLIR->generic.offset, 276ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR->operands[0]); 277ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 278ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 279