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