mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-11-23 05:19:56 +00:00
JIT compare screen with IR blocks - fix some crashing issues
This commit is contained in:
parent
7464b5f17b
commit
f2837e3b55
@ -146,7 +146,7 @@ bool IRJit::CompileBlock(u32 em_address, std::vector<IRInst> &instructions, u32
|
||||
|
||||
IRBlock *b = blocks_.GetBlock(block_num);
|
||||
b->SetInstructions(instructions);
|
||||
b->SetOriginalSize(mipsBytes);
|
||||
b->SetOriginalAddrSize(em_address, mipsBytes);
|
||||
if (preload) {
|
||||
// Hash, then only update page stats, don't link yet.
|
||||
// TODO: Should we always hash? Then we can reuse blocks.
|
||||
|
@ -69,7 +69,8 @@ public:
|
||||
bool HasOriginalFirstOp() const;
|
||||
bool RestoreOriginalFirstOp(int number);
|
||||
bool IsValid() const { return origAddr_ != 0 && origFirstOpcode_.encoding != 0x68FFFFFF; }
|
||||
void SetOriginalSize(u32 size) {
|
||||
void SetOriginalAddrSize(u32 address, u32 size) {
|
||||
origAddr_ = address;
|
||||
origSize_ = size;
|
||||
}
|
||||
void SetTargetOffset(int offset) {
|
||||
@ -114,25 +115,28 @@ public:
|
||||
IRBlockCache() {}
|
||||
void Clear();
|
||||
std::vector<int> FindInvalidatedBlockNumbers(u32 address, u32 length);
|
||||
void FinalizeBlock(int i, bool preload = false);
|
||||
void FinalizeBlock(int blockNum, bool preload = false);
|
||||
int GetNumBlocks() const override { return (int)blocks_.size(); }
|
||||
int AllocateBlock(int emAddr) {
|
||||
blocks_.push_back(IRBlock(emAddr));
|
||||
return (int)blocks_.size() - 1;
|
||||
}
|
||||
IRBlock *GetBlock(int i) {
|
||||
if (i >= 0 && i < (int)blocks_.size()) {
|
||||
return &blocks_[i];
|
||||
IRBlock *GetBlock(int blockNum) {
|
||||
if (blockNum >= 0 && blockNum < (int)blocks_.size()) {
|
||||
return &blocks_[blockNum];
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
IRBlock *GetBlockUnchecked(int i) {
|
||||
return &blocks_[i];
|
||||
bool IsValidBlock(int blockNum) const override {
|
||||
return blockNum < (int)blocks_.size() && blocks_[blockNum].IsValid();
|
||||
}
|
||||
const IRBlock *GetBlock(int i) const {
|
||||
if (i >= 0 && i < (int)blocks_.size()) {
|
||||
return &blocks_[i];
|
||||
IRBlock *GetBlockUnchecked(int blockNum) {
|
||||
return &blocks_[blockNum];
|
||||
}
|
||||
const IRBlock *GetBlock(int blockNum) const {
|
||||
if (blockNum >= 0 && blockNum < (int)blocks_.size()) {
|
||||
return &blocks_[blockNum];
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -714,6 +714,10 @@ void IRNativeBlockCacheDebugInterface::Init(const IRNativeBackend *backend) {
|
||||
backend_ = backend;
|
||||
}
|
||||
|
||||
bool IRNativeBlockCacheDebugInterface::IsValidBlock(int blockNum) const {
|
||||
return irBlocks_.IsValidBlock(blockNum);
|
||||
}
|
||||
|
||||
int IRNativeBlockCacheDebugInterface::GetNumBlocks() const {
|
||||
return irBlocks_.GetNumBlocks();
|
||||
}
|
||||
|
@ -162,10 +162,11 @@ class IRNativeBlockCacheDebugInterface : public JitBlockCacheDebugInterface {
|
||||
public:
|
||||
IRNativeBlockCacheDebugInterface(const MIPSComp::IRBlockCache &irBlocks);
|
||||
void Init(const IRNativeBackend *backend);
|
||||
int GetNumBlocks() const;
|
||||
int GetBlockNumberFromStartAddress(u32 em_address, bool realBlocksOnly = true) const;
|
||||
JitBlockDebugInfo GetBlockDebugInfo(int blockNum) const;
|
||||
void ComputeStats(BlockCacheStats &bcStats) const;
|
||||
int GetNumBlocks() const override;
|
||||
int GetBlockNumberFromStartAddress(u32 em_address, bool realBlocksOnly = true) const override;
|
||||
JitBlockDebugInfo GetBlockDebugInfo(int blockNum) const override;
|
||||
void ComputeStats(BlockCacheStats &bcStats) const override;
|
||||
bool IsValidBlock(int blockNum) const override;
|
||||
|
||||
private:
|
||||
void GetBlockCodeRange(int blockNum, int *startOffset, int *size) const;
|
||||
|
@ -109,6 +109,7 @@ public:
|
||||
virtual int GetBlockNumberFromStartAddress(u32 em_address, bool realBlocksOnly = true) const = 0;
|
||||
virtual JitBlockDebugInfo GetBlockDebugInfo(int blockNum) const = 0;
|
||||
virtual void ComputeStats(BlockCacheStats &bcStats) const = 0;
|
||||
virtual bool IsValidBlock(int blockNum) const = 0;
|
||||
|
||||
virtual ~JitBlockCacheDebugInterface() {}
|
||||
};
|
||||
@ -164,6 +165,7 @@ public:
|
||||
void RestoreSavedEmuHackOps(const std::vector<u32> &saved);
|
||||
|
||||
int GetNumBlocks() const override { return num_blocks_; }
|
||||
bool IsValidBlock(int blockNum) const override { return blockNum < num_blocks_ && !blocks_[blockNum].invalid; }
|
||||
|
||||
static int GetBlockExitSize();
|
||||
|
||||
|
@ -1060,6 +1060,9 @@ void JitCompareScreen::UpdateDisasm() {
|
||||
}
|
||||
|
||||
JitBlockCacheDebugInterface *blockCacheDebug = MIPSComp::jit->GetBlockCacheDebugInterface();
|
||||
if (!blockCacheDebug->IsValidBlock(currentBlock_)) {
|
||||
return;
|
||||
}
|
||||
|
||||
char temp[256];
|
||||
snprintf(temp, sizeof(temp), "%i/%i", currentBlock_, blockCacheDebug->GetNumBlocks());
|
||||
@ -1205,7 +1208,13 @@ UI::EventReturn JitCompareScreen::OnRandomBlock(UI::EventParams &e) {
|
||||
|
||||
int numBlocks = blockCache->GetNumBlocks();
|
||||
if (numBlocks > 0) {
|
||||
currentBlock_ = rand() % numBlocks;
|
||||
int tries = 100;
|
||||
while (tries-- > 0) {
|
||||
currentBlock_ = rand() % numBlocks;
|
||||
if (blockCache->IsValidBlock(currentBlock_)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
UpdateDisasm();
|
||||
return UI::EVENT_DONE;
|
||||
|
Loading…
Reference in New Issue
Block a user