mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Started with some simulation to determine 'step into' symbol lookup
This commit is contained in:
parent
9413d3ded4
commit
6412a27f97
6 changed files with 118 additions and 20 deletions
|
@ -2993,14 +2993,17 @@ BfTypeDef* BfSystem::GetCombinedPartial(BfTypeDef* typeDef)
|
|||
if ((!typeDef->mIsPartial) || (typeDef->mIsCombinedPartial))
|
||||
return typeDef;
|
||||
|
||||
auto itr = mTypeDefs.TryGet(typeDef->mFullName);
|
||||
bool foundPartial = false;
|
||||
BfTypeDef* checkTypeDef = typeDef;
|
||||
auto itr = mTypeDefs.TryGet(checkTypeDef->mFullName);
|
||||
do
|
||||
{
|
||||
BF_ASSERT(typeDef->mIsPartial);
|
||||
typeDef = *itr;
|
||||
if (checkTypeDef == typeDef)
|
||||
foundPartial = true;
|
||||
checkTypeDef = *itr;
|
||||
itr.MoveToNextHashMatch();
|
||||
} while (!typeDef->mIsCombinedPartial);
|
||||
return typeDef;
|
||||
} while ((!checkTypeDef->mIsCombinedPartial) || (!foundPartial));
|
||||
return checkTypeDef;
|
||||
}
|
||||
|
||||
BfTypeDef* BfSystem::GetOuterTypeNonPartial(BfTypeDef* typeDef)
|
||||
|
|
|
@ -11710,6 +11710,7 @@ String WinDebugger::FindLineCallAddresses(intptr inAddress)
|
|||
if (!mDebugTarget->DecodeInstruction(addr, &inst))
|
||||
break;
|
||||
|
||||
*registers.GetPCRegisterRef() = addr;
|
||||
if (inst.IsCall())
|
||||
{
|
||||
bool addSymbol = true;
|
||||
|
@ -11718,7 +11719,7 @@ String WinDebugger::FindLineCallAddresses(intptr inAddress)
|
|||
callAddresses += "-";
|
||||
callAddresses += EncodeDataPtr(addr, false);
|
||||
|
||||
addr_target targetAddr = inst.GetTarget(®isters);
|
||||
addr_target targetAddr = inst.GetTarget(this, ®isters);
|
||||
if (targetAddr != 0)
|
||||
{
|
||||
String outSymbol;
|
||||
|
@ -11784,6 +11785,7 @@ String WinDebugger::FindLineCallAddresses(intptr inAddress)
|
|||
callAddresses += "\n";
|
||||
}
|
||||
|
||||
inst.PartialSimulate(this, ®isters);
|
||||
addr += inst.GetLength();
|
||||
}
|
||||
};
|
||||
|
|
|
@ -520,10 +520,14 @@ bool X64Instr::GetIndexRegisterAndOffset(int* outRegister, int* outOffset)
|
|||
if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
|
||||
((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
|
||||
{
|
||||
auto baseReg = mMCInst.getOperand(llvm::X86::AddrBaseReg);
|
||||
auto scaleAmt = mMCInst.getOperand(llvm::X86::AddrScaleAmt);
|
||||
auto indexReg = mMCInst.getOperand(llvm::X86::AddrIndexReg);
|
||||
auto addrDisp = mMCInst.getOperand(llvm::X86::AddrDisp);
|
||||
int regOffset = 0;
|
||||
if (form == llvm::X86II::MRMSrcMem)
|
||||
regOffset = 1;
|
||||
|
||||
auto baseReg = mMCInst.getOperand(regOffset + llvm::X86::AddrBaseReg);
|
||||
auto scaleAmt = mMCInst.getOperand(regOffset + llvm::X86::AddrScaleAmt);
|
||||
auto indexReg = mMCInst.getOperand(regOffset + llvm::X86::AddrIndexReg);
|
||||
auto addrDisp = mMCInst.getOperand(regOffset + llvm::X86::AddrDisp);
|
||||
|
||||
/*bool a = baseReg.isReg();
|
||||
bool b = scaleAmt.isImm();
|
||||
|
@ -695,19 +699,35 @@ void X64Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
|
|||
}
|
||||
}
|
||||
|
||||
uint64 X64Instr::GetTarget(X64CPURegisters* registers)
|
||||
uint64 X64Instr::GetTarget(Debugger* debugger, X64CPURegisters* registers)
|
||||
{
|
||||
const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
|
||||
|
||||
if (mMCInst.getNumOperands() < 1)
|
||||
return 0;
|
||||
|
||||
/*if ((debugger != NULL) && (registers != NULL))
|
||||
{
|
||||
int regNum = 0;
|
||||
int offset = 0;
|
||||
if (GetIndexRegisterAndOffset(®Num, &offset))
|
||||
{
|
||||
uint64 addr = registers->mIntRegsArray[regNum] + offset;
|
||||
uint64 val = 0;
|
||||
debugger->ReadMemory(addr, 8, &val);
|
||||
return val;
|
||||
}
|
||||
}*/
|
||||
|
||||
int opIdx = 0;
|
||||
auto operand = mMCInst.getOperand(0);
|
||||
if ((instDesc.OpInfo[0].OperandType == MCOI::OPERAND_REGISTER) && (instDesc.OpInfo[4].OperandType == MCOI::OPERAND_MEMORY))
|
||||
if (mMCInst.getNumOperands() > 4)
|
||||
{
|
||||
opIdx = 4;
|
||||
operand = mMCInst.getOperand(opIdx);
|
||||
if ((instDesc.OpInfo[0].OperandType == MCOI::OPERAND_REGISTER) && (instDesc.OpInfo[4].OperandType == MCOI::OPERAND_MEMORY))
|
||||
{
|
||||
opIdx = 4;
|
||||
operand = mMCInst.getOperand(opIdx);
|
||||
}
|
||||
}
|
||||
|
||||
if (operand.isImm())
|
||||
|
@ -720,6 +740,72 @@ uint64 X64Instr::GetTarget(X64CPURegisters* registers)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool X64Instr::PartialSimulate(Debugger* debugger, X64CPURegisters* registers)
|
||||
{
|
||||
// const MCInstrDesc &instDesc = mX64->mInstrInfo->get(mMCInst.getOpcode());
|
||||
//
|
||||
// for (int i = 0; i < instDesc.NumOperands; i++)
|
||||
// {
|
||||
// auto regInfo = mMCInst.getOperand(i);
|
||||
// NOP;
|
||||
// }
|
||||
//
|
||||
// if (instDesc.getOpcode() == X86::MOV64rm)
|
||||
// {
|
||||
// auto form = (instDesc.TSFlags & llvm::X86II::FormMask);
|
||||
//
|
||||
// if ((form == llvm::X86II::MRMSrcMem) && (instDesc.NumOperands == 6))
|
||||
// {
|
||||
// auto destReg = mMCInst.getOperand(llvm::X86::AddrBaseReg);
|
||||
// if (destReg.isReg())
|
||||
// {
|
||||
// int regNum = 0;
|
||||
// int offset = 0;
|
||||
// if (GetIndexRegisterAndOffset(®Num, &offset))
|
||||
// {
|
||||
// uint64 addr = registers->mIntRegsArray[regNum] + offset;
|
||||
// uint64 val = 0;
|
||||
// debugger->ReadMemory(addr, 8, &val);
|
||||
//
|
||||
// switch (destReg.getReg())
|
||||
// {
|
||||
//
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//// if ((form == llvm::X86II::MRMDestMem) || (form == llvm::X86II::MRMSrcMem) ||
|
||||
//// ((form >= llvm::X86II::MRM0m) && (form <= llvm::X86II::MRM7m)))
|
||||
//// {
|
||||
//// }
|
||||
// }
|
||||
//
|
||||
// if (instDesc.getOpcode() == X86::XOR8rr)
|
||||
// {
|
||||
// if (instDesc.NumOperands == 3)
|
||||
// {
|
||||
// auto destReg = mMCInst.getOperand(0);
|
||||
// auto srcReg = mMCInst.getOperand(1);
|
||||
//
|
||||
// if ((destReg.isReg()) && (srcReg.isReg()))
|
||||
// {
|
||||
// if (destReg.getReg() == srcReg.getReg())
|
||||
// {
|
||||
// switch (destReg.getReg())
|
||||
// {
|
||||
// case X86::AL:
|
||||
// ((uint8*)®isters->mIntRegs.rax)[0] = 0;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
X64CPU::X64CPU() :
|
||||
mWarningStream(mWarningString),
|
||||
mCommentStream(mCommentString)
|
||||
|
|
|
@ -466,7 +466,8 @@ public:
|
|||
int GetJmpState(int flags);
|
||||
void MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm);
|
||||
|
||||
uint64 GetTarget(X64CPURegisters* registers = NULL);
|
||||
uint64 GetTarget(Debugger* debugger = NULL, X64CPURegisters* registers = NULL);
|
||||
bool PartialSimulate(Debugger* debugger, X64CPURegisters* registers);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -374,7 +374,7 @@ void X86Instr::MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm)
|
|||
}
|
||||
}
|
||||
|
||||
uint32 X86Instr::GetTarget(X86CPURegisters* registers)
|
||||
uint32 X86Instr::GetTarget(Debugger* debugger, X86CPURegisters* registers)
|
||||
{
|
||||
const MCInstrDesc &instDesc = mX86->mInstrInfo->get(mMCInst.getOpcode());
|
||||
|
||||
|
@ -402,6 +402,11 @@ uint32 X86Instr::GetTarget(X86CPURegisters* registers)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool X86Instr::PartialSimulate(Debugger* debugger, X86CPURegisters* registers)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
X86CPU::X86CPU() :
|
||||
mWarningStream(mWarningString),
|
||||
mCommentStream(mCommentString)
|
||||
|
|
|
@ -303,7 +303,8 @@ public:
|
|||
int GetJmpState(int flags);
|
||||
void MarkRegsUsed(Array<RegForm>& regsUsed, bool overrideForm);
|
||||
|
||||
uint32 GetTarget(X86CPURegisters* registers = NULL);
|
||||
uint32 GetTarget(Debugger* debugger = NULL, X86CPURegisters* registers = NULL);
|
||||
bool PartialSimulate(Debugger* debugger, X86CPURegisters* registers);
|
||||
};
|
||||
|
||||
class X86CPU
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue