| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // ** UNDER CONSTRUCTION ** |
| |
| /* |
| * Declaration of register map data structure and related functions. |
| */ |
| #ifndef _DALVIK_REGISTERMAP |
| #define _DALVIK_REGISTERMAP |
| |
| /* |
| * Format enumeration for RegisterMap data area. |
| */ |
| typedef enum RegisterMapFormat { |
| kFormatUnknown = 0, |
| kFormatCompact8, /* compact layout, 8-bit addresses */ |
| kFormatCompact16, /* compact layout, 16-bit addresses */ |
| // TODO: compressed stream |
| } RegisterMapFormat; |
| |
| /* |
| * This is a single variable-size structure. It may be allocated on the |
| * heap or mapped out of a (post-dexopt) DEX file. |
| */ |
| struct RegisterMap { |
| /* header */ |
| u1 format; /* enum RegisterMapFormat */ |
| u1 regWidth; /* bytes per register line, 1+ */ |
| u2 numEntries; /* number of entries */ |
| |
| /* data starts here; no alignment guarantees made */ |
| u1 data[1]; |
| }; |
| |
| /* |
| * Generate the register map for a previously-verified method. |
| * |
| * Returns a pointer to a newly-allocated RegisterMap. |
| */ |
| //RegisterMap* dvmGenerateRegisterMap(const Method* meth); |
| |
| /* |
| * Various bits of data generated by the verifier, wrapped up in a package |
| * for ease of use by the register map generator. |
| */ |
| typedef struct VerifierData { |
| /* |
| * The method we're working on. |
| */ |
| const Method* method; |
| |
| /* |
| * Number of instructions in the method. |
| */ |
| int insnsSize; |
| |
| /* |
| * Number of registers we track for each instruction. This is equal |
| * to the method's declared "registersSize". (Does not include the |
| * pending return value.) |
| */ |
| int insnRegCount; |
| |
| /* |
| * Instruction widths and flags, one entry per code unit. |
| */ |
| InsnFlags* insnFlags; |
| |
| /* |
| * Array of SRegType arrays, one entry per code unit. We only need |
| * entries for code units that hold the start of an "interesting" |
| * instruction. For register map generation, we're only interested |
| * in GC points. |
| */ |
| RegType** addrRegs; |
| } VerifierData; |
| |
| /* |
| * Generate the register map for a method that has just been verified |
| * (i.e. we're doing this as part of verification). |
| * |
| * Returns a pointer to a newly-allocated RegisterMap, or NULL on failure. |
| */ |
| RegisterMap* dvmGenerateRegisterMapV(VerifierData* vdata); |
| |
| #endif /*_DALVIK_REGISTERMAP*/ |