1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Copyright (C) 2009 The Android Open Source Project 3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Licensed under the Apache License, Version 2.0 (the "License"); 5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * you may not use this file except in compliance with the License. 6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * You may obtain a copy of the License at 7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * http://www.apache.org/licenses/LICENSE-2.0 9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Unless required by applicable law or agreed to in writing, software 11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * distributed under the License is distributed on an "AS IS" BASIS, 12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * See the License for the specific language governing permissions and 14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * limitations under the License. 15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "../../CompilerInternals.h" 18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "libdex/DexOpcodes.h" 19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "MipsLIR.h" 20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* For dumping instructions */ 22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define MIPS_REG_COUNT 32 23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic const char *mipsRegName[MIPS_REG_COUNT] = { 24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", 25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", 26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra" 28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham}; 29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Interpret a format string and build a string no longer than size 32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * See format key in Assemble.c. 33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void buildInsnString(const char *fmt, MipsLIR *lir, char* buf, 35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham unsigned char *baseAddr, int size) 36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char *bufEnd = &buf[size-1]; 39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham const char *fmtEnd = &fmt[strlen(fmt)]; 40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char tbuf[256]; 41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char nc; 42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham while (fmt < fmtEnd) { 43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int operand; 44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (*fmt == '!') { 45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham fmt++; 46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(fmt < fmtEnd); 47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham nc = *fmt++; 48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (nc=='!') { 49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "!"); 50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(fmt < fmtEnd); 52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((unsigned)(nc-'0') < 4); 53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham operand = lir->operands[nc-'0']; 54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham switch(*fmt++) { 55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'b': 56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf,"0000"); 57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=3; i>= 0; i--) { 58a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham tbuf[i] += operand & 1; 59a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham operand >>= 1; 60a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 61a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 62a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 's': 63a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"$f%d",operand & FP_REG_MASK); 64a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 65a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'S': 66a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(((operand & FP_REG_MASK) & 1) == 0); 67a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"$f%d",operand & FP_REG_MASK); 68a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 69a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'h': 70a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"%04x", operand); 71a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 72a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'M': 73a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'd': 74a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"%d", operand); 75a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 76a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'D': 77a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"%d", operand+1); 78a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 79a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'E': 80a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"%d", operand*4); 81a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 82a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'F': 83a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"%d", operand*2); 84a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 85a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'c': 86a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham switch (operand) { 87a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondEq: 88a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "eq"); 89a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 90a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondNe: 91a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "ne"); 92a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 93a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondLt: 94a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "lt"); 95a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 96a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondGe: 97a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "ge"); 98a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 99a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondGt: 100a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "gt"); 101a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 102a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondLe: 103a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "le"); 104a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 105a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondCs: 106a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "cs"); 107a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 108a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsCondMi: 109a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "mi"); 110a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 111a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham default: 112a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, ""); 113a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 114a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 115a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 116a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 't': 117a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"0x%08x (L%p)", 118a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (int) baseAddr + lir->generic.offset + 4 + 119a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (operand << 2), 120a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lir->generic.target); 121a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 122a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'T': 123a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf,"0x%08x", 124a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (int) (operand << 2)); 125a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 126a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'u': { 127a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int offset_1 = lir->operands[0]; 128a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int offset_2 = NEXT_LIR(lir)->operands[0]; 129a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham intptr_t target = 130a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((((intptr_t) baseAddr + lir->generic.offset + 4) & 131a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ~3) + (offset_1 << 21 >> 9) + (offset_2 << 1)) & 132a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 0xfffffffc; 133a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(tbuf, "%p", (void *) target); 134a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 135a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 136a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 137a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Nothing to print for BLX_2 */ 138a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'v': 139a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, "see above"); 140a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 141a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case 'r': 142a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(operand >= 0 && operand < MIPS_REG_COUNT); 143a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf, mipsRegName[operand]); 144a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 145a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham default: 146a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(tbuf,"DecodeError"); 147a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 148a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 149a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (buf+strlen(tbuf) <= bufEnd) { 150a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(buf, tbuf); 151a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham buf += strlen(tbuf); 152a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 153a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 154a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 155a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 156a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 157a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *buf++ = *fmt++; 158a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 159a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (buf == bufEnd) 160a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 161a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 162a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *buf = 0; 163a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 164a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 165a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmDumpResourceMask(LIR *lir, u8 mask, const char *prefix) 166a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 167a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char buf[256]; 168a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham buf[0] = 0; 169a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham MipsLIR *mipsLIR = (MipsLIR *) lir; 170a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 171a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask == ENCODE_ALL) { 172a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcpy(buf, "all"); 173a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 174a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char num[8]; 175a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 176a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 177a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i = 0; i < kRegEnd; i++) { 178a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & (1ULL << i)) { 179a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(num, "%d ", i); 180a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, num); 181a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 182a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 183a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 184a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & ENCODE_CCODE) { 185a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, "cc "); 186a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 187a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & ENCODE_FP_STATUS) { 188a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, "fpcc "); 189a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 190a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Memory bits */ 191a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mipsLIR && (mask & ENCODE_DALVIK_REG)) { 192a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sprintf(buf + strlen(buf), "dr%d%s", mipsLIR->aliasInfo & 0xffff, 193a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (mipsLIR->aliasInfo & 0x80000000) ? "(+1)" : ""); 194a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 195a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & ENCODE_LITERAL) { 196a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, "lit "); 197a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 198a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 199a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & ENCODE_HEAP_REF) { 200a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, "heap "); 201a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 202a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (mask & ENCODE_MUST_NOT_ALIAS) { 203a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham strcat(buf, "noalias "); 204a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 205a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 206a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (buf[0]) { 207fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("%s: %s", prefix, buf); 208a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 209a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 210a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 211a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 212a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Debugging macros 213a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 214a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define DUMP_RESOURCE_MASK(X) 215a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define DUMP_SSA_REP(X) 216a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 217a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Pretty-print a LIR instruction */ 218a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmDumpLIRInsn(LIR *arg, unsigned char *baseAddr) 219a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 220a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham MipsLIR *lir = (MipsLIR *) arg; 221a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char buf[256]; 222a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham char opName[256]; 223a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int offset = lir->generic.offset; 224a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int dest = lir->operands[0]; 225a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham const bool dumpNop = false; 226a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 227a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Handle pseudo-ops individually, and all regular insns as a group */ 228a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham switch(lir->opcode) { 229a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsChainingCellBottom: 230fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- end of chaining cells (0x%04x)", offset); 231a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 232a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoBarrier: 233fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- BARRIER"); 234a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 235a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoExtended: 236a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* intentional fallthrough */ 237a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoSSARep: 238fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham DUMP_SSA_REP(ALOGD("-------- %s", (char *) dest)); 239a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 240a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoChainingCellBackwardBranch: 241fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 242fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- chaining cell (backward branch): 0x%04x", dest); 243a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 244a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoChainingCellNormal: 245fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 246fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- chaining cell (normal): 0x%04x", dest); 247a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 248a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoChainingCellHot: 249fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 250fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- chaining cell (hot): 0x%04x", dest); 251a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 252a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoChainingCellInvokePredicted: 253fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 254fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- chaining cell (predicted): %s%s", 255a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dest ? ((Method *) dest)->clazz->descriptor : "", 256a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dest ? ((Method *) dest)->name : "N/A"); 257a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 258a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoChainingCellInvokeSingleton: 259fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 260fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- chaining cell (invoke singleton): %s%s/%p", 261a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((Method *)dest)->clazz->descriptor, 262a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((Method *)dest)->name, 263a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((Method *)dest)->insns); 264a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 265a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoEntryBlock: 266fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- entry offset: 0x%04x", dest); 267a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 268a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoDalvikByteCodeBoundary: 269fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- dalvik offset: 0x%04x @ %s", dest, 270a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (char *) lir->operands[1]); 271a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 272a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoExitBlock: 273fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- exit offset: 0x%04x", dest); 274a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 275a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoPseudoAlign4: 276fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("%p (%04x): .align4", baseAddr + offset, offset); 277a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 278a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoPCReconstructionCell: 279fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 280fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("-------- reconstruct dalvik PC : 0x%04x @ +0x%04x", dest, 281a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lir->operands[1]); 282a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 283a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoPCReconstructionBlockLabel: 284a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Do nothing */ 285a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 286a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoEHBlockLabel: 287fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("Exception_Handling:"); 288a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 289a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoTargetLabel: 290a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kMipsPseudoNormalBlockLabel: 291fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("L%p:", lir); 292a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 293a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham default: 294a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (lir->flags.isNop && !dumpNop) { 295a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 296a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 297a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham buildInsnString(EncodingMap[lir->opcode].name, lir, opName, 298a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham baseAddr, 256); 299a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham buildInsnString(EncodingMap[lir->opcode].fmt, lir, buf, baseAddr, 300a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 256); 301fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("%p (%04x): %08x %-9s%s%s", 302a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham baseAddr + offset, offset, *(u4 *)(baseAddr + offset), opName, buf, 303a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lir->flags.isNop ? "(nop)" : ""); 304a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 305a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 306a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 307a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (lir->useMask && (!lir->flags.isNop || dumpNop)) { 308a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir, 309a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lir->useMask, "use")); 310a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 311a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (lir->defMask && (!lir->flags.isNop || dumpNop)) { 312a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham DUMP_RESOURCE_MASK(dvmDumpResourceMask((LIR *) lir, 313a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lir->defMask, "def")); 314a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 315a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 316a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 317a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Dump instructions and constant pool contents */ 318a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCodegenDump(CompilationUnit *cUnit) 319a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 320fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("Dumping LIR insns"); 321a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LIR *lirInsn; 322a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham MipsLIR *mipsLIR; 323a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 324fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("installed code is at %p", cUnit->baseAddr); 325fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("total size is %d bytes", cUnit->totalSize); 326a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (lirInsn = cUnit->firstLIRInsn; lirInsn; lirInsn = lirInsn->next) { 327a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmDumpLIRInsn(lirInsn, (unsigned char *) cUnit->baseAddr); 328a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 329a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (lirInsn = cUnit->classPointerList; lirInsn; lirInsn = lirInsn->next) { 330a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham mipsLIR = (MipsLIR *) lirInsn; 331fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("%p (%04x): .class (%s)", 332a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (char*)cUnit->baseAddr + mipsLIR->generic.offset, 333a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham mipsLIR->generic.offset, 334a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((CallsiteInfo *) mipsLIR->operands[0])->classDescriptor); 335a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 336a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (lirInsn = cUnit->literalList; lirInsn; lirInsn = lirInsn->next) { 337a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham mipsLIR = (MipsLIR *) lirInsn; 338fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGD("%p (%04x): .word (%#x)", 339a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (char*)cUnit->baseAddr + mipsLIR->generic.offset, 340a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham mipsLIR->generic.offset, 341a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham mipsLIR->operands[0]); 342a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 343a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 344a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 345a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache flushing */ 3460c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chenvoid dvmCompilerCacheFlush(long start, long end, long flags) 347a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 3480c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen cacheflush(start, end, flags); 349a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 350a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 351a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Target-specific cache clearing */ 352a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerCacheClear(char *start, size_t size) 353a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 354a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* 0x66 is an invalid opcode for mips. */ 355a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham memset(start, 0x66, size); 356a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 357