ArchUtility.cpp revision e9695e5d281ad8bfbe3091e825befbedfc1b2007
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" 19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "Armv5teLIR.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 40ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 41ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Interpret a format string and build a string no longer than size 42ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See format key in Assemble.c. 43ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 44ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic void buildInsnString(char *fmt, Armv5teLIR *lir, char* buf, 45ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng unsigned char *baseAddr, int size) 46ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 47ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int i; 48ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char *bufEnd = &buf[size-1]; 49ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char *fmtEnd = &fmt[strlen(fmt)]; 50ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char tbuf[256]; 51ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char nc; 52ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng while (fmt < fmtEnd) { 53ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int operand; 54ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (*fmt == '!') { 55ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng fmt++; 56ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 57ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng nc = *fmt++; 58ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (nc=='!') { 59ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "!"); 60ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 61ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert(fmt < fmtEnd); 62ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng assert((unsigned)(nc-'0') < 3); 63ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng operand = lir->operands[nc-'0']; 64ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(*fmt++) { 65ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'h': 66ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%04x", operand); 67ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 68ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'd': 69ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand); 70ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 71ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'D': 72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand+8); 73ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 74ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'E': 75ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*4); 76ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 77ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'F': 78ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"%d", operand*2); 79ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 80ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'c': 81ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch (operand) { 82ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_EQ: 83ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "beq"); 84ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 85ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_NE: 86ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bne"); 87ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 88ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LT: 89ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "blt"); 90ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 91ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GE: 92ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bge"); 93ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 94ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_GT: 95ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bgt"); 96ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 97ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_LE: 98ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "ble"); 99ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 100ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARM_COND_CS: 101ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "bcs"); 102ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 103ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 104ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, ""); 105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 106ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 107ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 108ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 't': 109ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf,"0x%08x", 110ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (int) baseAddr + lir->generic.offset + 4 + 111ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng (operand << 1)); 112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 113ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'u': { 114ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_1 = lir->operands[0]; 115ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset_2 = NEXT_LIR(lir)->operands[0]; 116ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng intptr_t target = 117ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((((intptr_t) baseAddr + lir->generic.offset + 4) & 118ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) & 119ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 0xfffffffc; 120ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng sprintf(tbuf, "%p", (void *) target); 121ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 122ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 123ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 124ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Nothing to print for BLX_2 */ 125ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'v': 126ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf, "see above"); 127ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 128ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case 'R': 129ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng decodeRegList(operand, tbuf); 130ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 131ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(tbuf,"DecodeError"); 133ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 134ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 135ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf+strlen(tbuf) <= bufEnd) { 136ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng strcpy(buf, tbuf); 137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buf += strlen(tbuf); 138ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 139ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 140ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } else { 143ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf++ = *fmt++; 144ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 145ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng if (buf == bufEnd) 146ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 147ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 148ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *buf = 0; 149ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 150ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 151ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Pretty-print a LIR instruction */ 152ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic void dumpLIRInsn(LIR *arg, unsigned char *baseAddr) 153ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 154ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng Armv5teLIR *lir = (Armv5teLIR *) arg; 155ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char buf[256]; 156ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng char opName[256]; 157ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int offset = lir->generic.offset; 158ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng int dest = lir->operands[0]; 159ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng u2 *cPtr = (u2*)baseAddr; 160ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Handle pseudo-ops individually, and all regular insns as a group */ 161ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng switch(lir->opCode) { 162ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_TARGET_LABEL: 163ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1641efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng case ARMV5TE_PSEUDO_CHAINING_CELL_NORMAL: 1651efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (normal): 0x%04x\n", dest); 166ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 1671efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng case ARMV5TE_PSEUDO_CHAINING_CELL_HOT: 1681efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng LOGD("-------- chaining cell (hot): 0x%04x\n", dest); 169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 170ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_CHAINING_CELL_INVOKE: 171ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- chaining cell (invoke): %s/%p\n", 172ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->name, 173ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng ((Method *)dest)->insns); 174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_DALVIK_BYTECODE_BOUNDARY: 176ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- dalvik offset: 0x%04x @ %s\n", dest, 177ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng getOpcodeName(lir->operands[1])); 178ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 179ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_ALIGN4: 180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .align4\n", baseAddr + offset, offset); 181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 182ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_PC_RECONSTRUCTION_CELL: 183ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x\n", dest, 184ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng lir->operands[1]); 185ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 186ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_PC_RECONSTRUCTION_BLOCK_LABEL: 187ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng /* Do nothing */ 188ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 189ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_EH_BLOCK_LABEL: 190ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Exception_Handling:\n"); 191ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 192ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng case ARMV5TE_PSEUDO_NORMAL_BLOCK_LABEL: 193ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("L%#06x:\n", dest); 194ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 195ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng default: 196e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng if (lir->isNop) { 197e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng break; 198e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng } 199ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].name, lir, opName, 200ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng baseAddr, 256); 201ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng buildInsnString(EncodingMap[lir->opCode].fmt, lir, buf, baseAddr, 202ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 256); 203e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng LOGD("%p (%04x): %-8s%s\n", 204e9695e5d281ad8bfbe3091e825befbedfc1b2007Ben Cheng baseAddr + offset, offset, opName, buf); 205ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng break; 206ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 207ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 209ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* Dump instructions and constant pool contents */ 210ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 211ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng{ 212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("Dumping LIR insns\n"); 213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LIR *lirInsn; 214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng Armv5teLIR *armLIR; 215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("installed code is at %p\n", cUnit->baseAddr); 217ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("total size is %d bytes\n", cUnit->totalSize); 218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng dumpLIRInsn(lirInsn, cUnit->baseAddr); 220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng for (lirInsn = cUnit->wordList; lirInsn; lirInsn = lirInsn->next) { 222ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR = (Armv5teLIR *) lirInsn; 223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng LOGD("%p (%04x): .word (0x%x)\n", 224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng cUnit->baseAddr + armLIR->generic.offset, armLIR->generic.offset, 225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng armLIR->operands[0]); 226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng } 227ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 228