| 2181 | } |
| 2182 | |
| 2183 | int DebugTarget::GetFrameBaseRegister(DbgSubprogram* dwSubprogram) |
| 2184 | { |
| 2185 | if (dwSubprogram->mFrameBaseLen == 0) |
| 2186 | return -1; |
| 2187 | |
| 2188 | auto locData = dwSubprogram->mFrameBaseData; |
| 2189 | if (locData != NULL) |
| 2190 | { |
| 2191 | uint8 opCode = GET_FROM(locData, uint8); |
| 2192 | if ((opCode >= DW_OP_reg0) && (opCode <= DW_OP_reg8)) |
| 2193 | { |
| 2194 | return opCode - DW_OP_reg0; |
| 2195 | } |
| 2196 | } |
| 2197 | |
| 2198 | #ifdef BF_DBG_32 |
| 2199 | if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_VFRAME) |
| 2200 | return X86Reg_EBP; |
| 2201 | else if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_EBX) |
| 2202 | return X86Reg_EBX; |
| 2203 | return X86Reg_EBP; |
| 2204 | #else |
| 2205 | if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_RSP) |
| 2206 | return X64Reg_RSP; |
| 2207 | else if (dwSubprogram->mLocalBaseReg == DbgSubprogram::LocalBaseRegKind_R13) |
| 2208 | return X64Reg_R13; |
| 2209 | return X64Reg_RBP; |
| 2210 | #endif |
| 2211 | |
| 2212 | return -1; |
| 2213 | } |
| 2214 | |
| 2215 | bool DebugTarget::GetVariableIndexRegisterAndOffset(DbgVariable* dwVariable, int* outRegister, int* outOffset) |
| 2216 | { |