ArchUtility.cpp revision 4238ec2ad1ace5103b2206a483f5f03d2e96c476
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) { 2074238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng case ARM_PSEUDO_EXTENDED_MIR: 2084238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng /* intentional fallthrough */ 2094238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng case ARM_PSEUDO_SSA_REP: 2104238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng LOGD("-------- %s\n", (char *) dest); 2114238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 21289efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_TARGET_LABEL: 213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 2144238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng case ARM_PSEUDO_CHAINING_CELL_BACKWARD_BRANCH: 2154238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng LOGD("-------- chaining cell (backward branch): 0x%04x\n", dest); 2164238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 21789efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_NORMAL: 2181efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (normal): 0x%04x\n", dest); 219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 22089efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_HOT: 2211efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (hot): 0x%04x\n", dest); 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 22389efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_PREDICTED: 22438329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (predicted)\n"); 22538329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng break; 22689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_CHAINING_CELL_INVOKE_SINGLETON: 22738329f5678fd7a4879528b02a0ab60322d38a897Ben Cheng LOGD("-------- chaining cell (invoke singleton): %s/%p\n", 228ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->name, 229ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->insns); 230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 2314238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng case ARM_PSEUDO_ENTRY_BLOCK: 2324238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng LOGD("-------- entry offset: 0x%04x\n", dest); 23397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao break; 23489efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_DALVIK_BYTECODE_BOUNDARY: 235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- dalvik offset: 0x%04x @ %s\n", dest, 236ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng getOpcodeName(lir->operands[1])); 237ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 2384238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng case ARM_PSEUDO_EXIT_BLOCK: 2394238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng LOGD("-------- exit offset: 0x%04x\n", dest); 2404238ec2ad1ace5103b2206a483f5f03d2e96c476Ben Cheng break; 24189efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_ALIGN4: 242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .align4\n", baseAddr + offset, offset); 243ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 24489efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_CELL: 245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x\n", dest, 246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng lir->operands[1]); 247ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 24889efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_PC_RECONSTRUCTION_BLOCK_LABEL: 249ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Do nothing */ 250ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 25189efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_EH_BLOCK_LABEL: 252ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Exception_Handling:\n"); 253ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 25489efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee case ARM_PSEUDO_NORMAL_BLOCK_LABEL: 255ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("L%#06x:\n", dest); 256ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 257ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 258e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng if (lir->isNop) { 259e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng break; 260e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng } 261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].name, lir, opName, 262ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng baseAddr, 256); 263ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].fmt, lir, buf, baseAddr, 264ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256); 265e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng LOGD("%p (%04x): %-8s%s\n", 266e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng baseAddr + offset, offset, opName, buf); 267ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 268ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 269ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 270ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 271ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */ 272ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 273ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 274ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Dumping LIR insns\n"); 275ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LIR *lirInsn; 27689efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee ArmLIR *armLIR; 277ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 278ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("installed code is at %p\n", cUnit->baseAddr); 279ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("total size is %d bytes\n", cUnit->totalSize); 280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 281ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng dumpLIRInsn(lirInsn, cUnit->baseAddr); 282ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 283ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->wordList; lirInsn; lirInsn = lirInsn->next) { 28489efc3d632adfa076bd622369b1ad8e4b49cf20eBill Buzbee armLIR = (ArmLIR *) lirInsn; 285ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .word (0x%x)\n", 286716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee (char*)cUnit->baseAddr + armLIR->generic.offset, armLIR->generic.offset, 287ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR->operands[0]); 288ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 290