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