codegen_util.cc revision e3acd07f28d5625062b599c2817cb5f7a53f54a9
1e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
2e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Copyright (C) 2011 The Android Open Source Project
3e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
4e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Licensed under the Apache License, Version 2.0 (the "License");
5e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * you may not use this file except in compliance with the License.
6e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * You may obtain a copy of the License at
7e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
8e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      http://www.apache.org/licenses/LICENSE-2.0
9e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
10e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Unless required by applicable law or agreed to in writing, software
11e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * distributed under the License is distributed on an "AS IS" BASIS,
12e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * See the License for the specific language governing permissions and
14e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * limitations under the License.
15e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
16e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
17e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
18e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
19e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC void pushWord(std::vector<uint16_t>&buf, int data) {
20e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    buf.push_back( data & 0xffff);
21e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    buf.push_back( (data >> 16) & 0xffff);
22e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
24e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid alignBuffer(std::vector<uint16_t>&buf, size_t offset) {
25e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (buf.size() < (offset/2))
26e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        buf.push_back(0);
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
29e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Write the literal pool to the output stream */
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC void installLiteralPools(CompilationUnit* cUnit)
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
32e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    alignBuffer(cUnit->codeBuffer, cUnit->dataOffset);
33e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    TGT_LIR* dataLIR = (TGT_LIR*) cUnit->literalList;
34e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (dataLIR != NULL) {
35e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        pushWord(cUnit->codeBuffer, dataLIR->operands[0]);
36e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        dataLIR = NEXT_LIR(dataLIR);
37e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
38e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
39e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
40e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Write the switch tables to the output stream */
41e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC void installSwitchTables(CompilationUnit* cUnit)
42e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    GrowableListIterator iterator;
44e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    oatGrowableListIteratorInit(&cUnit->switchTables, &iterator);
45e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (true) {
46e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        SwitchTable* tabRec = (SwitchTable *) oatGrowableListIteratorNext(
47e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee             &iterator);
48e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec == NULL) break;
49e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        alignBuffer(cUnit->codeBuffer, tabRec->offset);
50e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        int bxOffset = tabRec->bxInst->generic.offset + 4;
51e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (cUnit->printMe) {
52e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            LOG(INFO) << "Switch table for offset 0x" << std::hex << bxOffset;
53e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
54e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec->table[0] == kSparseSwitchSignature) {
55e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            int* keys = (int*)&(tabRec->table[2]);
56e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            for (int elems = 0; elems < tabRec->table[1]; elems++) {
57e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                int disp = tabRec->targets[elems]->generic.offset - bxOffset;
58e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                if (cUnit->printMe) {
59e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                    LOG(INFO) << "    Case[" << elems << "] key: 0x" <<
60e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                        std::hex << keys[elems] << ", disp: 0x" <<
61e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                        std::hex << disp;
62e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                }
63e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                pushWord(cUnit->codeBuffer, keys[elems]);
64e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                pushWord(cUnit->codeBuffer,
65e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                    tabRec->targets[elems]->generic.offset - bxOffset);
66e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            }
67e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        } else {
68e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            DCHECK_EQ(tabRec->table[0], kPackedSwitchSignature);
69e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            for (int elems = 0; elems < tabRec->table[1]; elems++) {
70e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                int disp = tabRec->targets[elems]->generic.offset - bxOffset;
71e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                if (cUnit->printMe) {
72e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                    LOG(INFO) << "    Case[" << elems << "] disp: 0x" <<
73e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                        std::hex << disp;
74e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                }
75e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                pushWord(cUnit->codeBuffer,
76e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                         tabRec->targets[elems]->generic.offset - bxOffset);
77e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            }
78e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
79e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
80e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
81e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
82e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Write the fill array dta to the output stream */
83e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC void installFillArrayData(CompilationUnit* cUnit)
84e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
85e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    GrowableListIterator iterator;
86e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    oatGrowableListIteratorInit(&cUnit->fillArrayData, &iterator);
87e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (true) {
88e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        FillArrayData *tabRec = (FillArrayData *) oatGrowableListIteratorNext(
89e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee             &iterator);
90e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec == NULL) break;
91e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        alignBuffer(cUnit->codeBuffer, tabRec->offset);
92e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        for (int i = 0; i < ((tabRec->size + 1) / 2) ; i++) {
93e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            cUnit->codeBuffer.push_back( tabRec->table[i]);
94e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
95e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
96e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
97e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
98e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC int assignLiteralOffsetCommon(LIR* lir, int offset)
99e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
100e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    for (;lir != NULL; lir = lir->next) {
101e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        lir->offset = offset;
102e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        offset += 4;
103e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
104e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return offset;
105e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
106e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
107e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC void createMappingTable(CompilationUnit* cUnit)
108e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
109e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    TGT_LIR* tgtLIR;
110e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int currentDalvikOffset = -1;
111e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
112e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    for (tgtLIR = (TGT_LIR *) cUnit->firstLIRInsn;
113e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee         tgtLIR;
114e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee         tgtLIR = NEXT_LIR(tgtLIR)) {
115e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if ((tgtLIR->opcode >= 0) && !tgtLIR->flags.isNop &&
116e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            (currentDalvikOffset != tgtLIR->generic.dalvikOffset)) {
117e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            // Changed - need to emit a record
118e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            cUnit->mappingTable.push_back(tgtLIR->generic.offset);
119e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            cUnit->mappingTable.push_back(tgtLIR->generic.dalvikOffset);
120e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            currentDalvikOffset = tgtLIR->generic.dalvikOffset;
121e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
122e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
123e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
124e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
125e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Determine the offset of each literal field */
126e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC int assignLiteralOffset(CompilationUnit* cUnit, int offset)
127e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
128e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    offset = assignLiteralOffsetCommon(cUnit->literalList, offset);
129e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return offset;
130e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
131e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
132e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC int assignSwitchTablesOffset(CompilationUnit* cUnit, int offset)
133e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
134e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    GrowableListIterator iterator;
135e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    oatGrowableListIteratorInit(&cUnit->switchTables, &iterator);
136e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (true) {
137e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        SwitchTable *tabRec = (SwitchTable *) oatGrowableListIteratorNext(
138e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee             &iterator);
139e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec == NULL) break;
140e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        tabRec->offset = offset;
141e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec->table[0] == kSparseSwitchSignature) {
142e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            offset += tabRec->table[1] * (sizeof(int) * 2);
143e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        } else {
144e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            DCHECK_EQ(tabRec->table[0], kPackedSwitchSignature);
145e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            offset += tabRec->table[1] * sizeof(int);
146e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
147e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
148e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return offset;
149e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
150e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
151e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeeSTATIC int assignFillArrayDataOffset(CompilationUnit* cUnit, int offset)
152e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
153e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    GrowableListIterator iterator;
154e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    oatGrowableListIteratorInit(&cUnit->fillArrayData, &iterator);
155e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (true) {
156e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        FillArrayData *tabRec = (FillArrayData *) oatGrowableListIteratorNext(
157e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee             &iterator);
158e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (tabRec == NULL) break;
159e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        tabRec->offset = offset;
160e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        offset += tabRec->size;
161e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        // word align
162e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        offset = (offset + 3) & ~3;
163e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
164e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    return offset;
165e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
166e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
167e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
168e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Walk the compilation unit and assign offsets to instructions
169e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * and literals and compute the total size of the compiled unit.
170e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
171e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatAssignOffsets(CompilationUnit* cUnit)
172e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
173e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    int offset = oatAssignInsnOffsets(cUnit);
174e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
175e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /* Const values have to be word aligned */
176e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    offset = (offset + 3) & ~3;
177e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
178e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /* Set up offsets for literals */
179e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    cUnit->dataOffset = offset;
180e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
181e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    offset = assignLiteralOffset(cUnit, offset);
182e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
183e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    offset = assignSwitchTablesOffset(cUnit, offset);
184e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
185e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    offset = assignFillArrayDataOffset(cUnit, offset);
186e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
187e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    cUnit->totalSize = offset;
188e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
189e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
190e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
191e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Go over each instruction in the list and calculate the offset from the top
192e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * before sending them off to the assembler. If out-of-range branch distance is
193e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * seen rearrange the instructions a bit to correct it.
194e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
195e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatAssembleLIR(CompilationUnit* cUnit)
196e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
197e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    oatAssignOffsets(cUnit);
198e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /*
199e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Assemble here.  Note that we generate code with optimistic assumptions
200e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * and if found now to work, we'll have to redo the sequence and retry.
201e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     */
202e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
203e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    while (true) {
204e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        AssemblerStatus res = oatAssembleInstructions(cUnit, 0);
205e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        if (res == kSuccess) {
206e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            break;
207e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        } else {
208e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            cUnit->assemblerRetries++;
209e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            if (cUnit->assemblerRetries > MAX_ASSEMBLER_RETRIES) {
210e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee                LOG(FATAL) << "Assembler error - too many retries";
211e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            }
212e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            // Redo offsets and try again
213e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            oatAssignOffsets(cUnit);
214e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            cUnit->codeBuffer.clear();
215e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        }
216e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
217e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
218e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    // Install literals
219e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    installLiteralPools(cUnit);
220e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
221e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    // Install switch tables
222e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    installSwitchTables(cUnit);
223e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
224e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    // Install fill array data
225e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    installFillArrayData(cUnit);
226e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
227e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /*
228e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Create the mapping table
229e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     */
230e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    createMappingTable(cUnit);
231e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
232e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
233e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
234e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
235e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}  // namespace art
236