| 6813 | } |
| 6814 | |
| 6815 | addr_target DbgModule::ExecuteOps(DbgSubprogram* dwSubprogram, const uint8* locData, int locDataLen, WdStackFrame* stackFrame, CPURegisters* registers, DbgAddrType* outAddrType, DbgEvalLocFlags flags, addr_target* pushValue) |
| 6816 | { |
| 6817 | bool allowReg = (flags & DbgEvalLocFlag_IsParam) == 0; |
| 6818 | |
| 6819 | const uint8* locDataEnd = locData + locDataLen; |
| 6820 | int regNum = -1; |
| 6821 | |
| 6822 | addr_target stackFrameData[256]; |
| 6823 | int stackIdx = 0; |
| 6824 | |
| 6825 | if (pushValue != NULL) |
| 6826 | stackFrameData[stackIdx++] = *pushValue; |
| 6827 | |
| 6828 | while (locData < locDataEnd) |
| 6829 | { |
| 6830 | uint8 opCode = GET_FROM(locData, uint8); |
| 6831 | switch (opCode) |
| 6832 | { |
| 6833 | case DW_OP_piece: |
| 6834 | { |
| 6835 | if (*outAddrType == DbgAddrType_Register) |
| 6836 | *outAddrType = DbgAddrType_Value; |
| 6837 | addr_target val = stackFrameData[--stackIdx]; |
| 6838 | int pieceSize = (int)DecodeULEB128(locData); |
| 6839 | if (pieceSize == 4) |
| 6840 | val &= 0xFFFFFFFF; |
| 6841 | else if (pieceSize == 2) |
| 6842 | val &= 0xFFFF; |
| 6843 | else if (pieceSize == 1) |
| 6844 | val &= 0xFF; |
| 6845 | stackFrameData[stackIdx++] = val; |
| 6846 | } |
| 6847 | break; |
| 6848 | case DW_OP_consts: |
| 6849 | { |
| 6850 | int64 val = DecodeSLEB128(locData); |
| 6851 | stackFrameData[stackIdx++] = (addr_target)val; |
| 6852 | } |
| 6853 | break; |
| 6854 | case DW_OP_stack_value: |
| 6855 | { |
| 6856 | *outAddrType = DbgAddrType_Value; |
| 6857 | } |
| 6858 | break; |
| 6859 | case DW_OP_addr_noRemap: |
| 6860 | { |
| 6861 | addr_target addr = GET_FROM(locData, addr_target); |
| 6862 | stackFrameData[stackIdx++] = addr; |
| 6863 | //*outIsAddr = true; |
| 6864 | *outAddrType = DbgAddrType_Target; |
| 6865 | } |
| 6866 | break; |
| 6867 | |
| 6868 | case DW_OP_addr: |
| 6869 | { |
| 6870 | addr_target addr = GET_FROM(locData, addr_target); |
| 6871 | //if (dwarf != NULL) |
| 6872 | addr = RemapAddr(addr); |
no test coverage detected