| 4384 | } |
| 4385 | |
| 4386 | DbgTypedValue WinDebugger::ReadReturnValue(CPURegisters* registers, DbgType* type) |
| 4387 | { |
| 4388 | DbgTypedValue retValue; |
| 4389 | |
| 4390 | if (type->IsFloat()) |
| 4391 | { |
| 4392 | retValue.mType = type; |
| 4393 | #if BF_DBG_32 |
| 4394 | retValue.mDouble = ConvertFloat80ToDouble(registers->mFpMmRegsArray[0].fp.fp80); |
| 4395 | if (type->mSize == 4) |
| 4396 | retValue.mSingle = (float)retValue.mDouble; |
| 4397 | #else |
| 4398 | if (retValue.mType->mTypeCode == DbgType_Single) |
| 4399 | retValue.mSingle = registers->mXmmRegsArray[0].f[0]; |
| 4400 | else |
| 4401 | retValue.mDouble = registers->mXmmDRegsArray[0].d[0]; |
| 4402 | #endif |
| 4403 | } |
| 4404 | else if (type->IsCompositeType()) |
| 4405 | { |
| 4406 | retValue.mType = type; |
| 4407 | if (CheckNeedsSRetArgument(type)) |
| 4408 | { |
| 4409 | #ifdef BF_DBG_32 |
| 4410 | retValue.mSrcAddress = mSavedContext.Esp - BF_ALIGN(type->GetByteCount(), 16); |
| 4411 | #else |
| 4412 | retValue.mSrcAddress = mSavedContext.Rsp - BF_ALIGN(type->GetByteCount(), 16); |
| 4413 | #endif |
| 4414 | } |
| 4415 | else |
| 4416 | { |
| 4417 | #ifdef BF_DBG_32 |
| 4418 | retValue.mInt32 = mSavedContext.Eax; |
| 4419 | #else |
| 4420 | retValue.mInt64 = mSavedContext.Rax; |
| 4421 | #endif |
| 4422 | } |
| 4423 | } |
| 4424 | else |
| 4425 | { |
| 4426 | #ifdef BF_DBG_32 |
| 4427 | retValue.mType = type; |
| 4428 | retValue.mInt32 = registers->mIntRegs.eax; |
| 4429 | if (type->mSize == 8) |
| 4430 | (&retValue.mInt32)[1] = registers->mIntRegs.edx; |
| 4431 | #else |
| 4432 | retValue.mType = type; |
| 4433 | retValue.mInt64 = registers->mIntRegs.rax; |
| 4434 | #endif |
| 4435 | return retValue; |
| 4436 | } |
| 4437 | |
| 4438 | return retValue; |
| 4439 | } |
| 4440 | |
| 4441 | bool WinDebugger::SetRegisters(CPURegisters* registers) |
| 4442 | { |
no test coverage detected