1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00
Beef/IDEHelper/Debugger.cpp
Brian Fiete 939c818581 Added back the "wantsDIForwardDecl = false" for LLVM
Not having this extra type information was causing types like enums to come out as 'void' in debug information due to (seemingly) an LLVM bug with forward decls
2019-12-21 05:46:24 -08:00

117 lines
2.7 KiB
C++

#include "Debugger.h"
#include "DebugManager.h"
#include "Compiler/BfSystem.h"
USING_NS_BF;
DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, int size)
{
mAddr = addr;
mSize = size;
mBlockSize = 4096;
mBlockCount = size / mBlockSize;
BF_ASSERT((size & (mBlockSize - 1)) == 0);
//mBlocks = (uint8**)dwarf->mAlloc.AllocBytes(dwarf->mOrigImageBlockCount * sizeof(uint8*), alignof(uint8*));
mBlocks = new uint8*[mBlockCount];
memset(mBlocks, 0, mBlockCount * sizeof(uint8*));
mFlags = new DbgMemoryFlags[mBlockCount];
memset(mFlags, 0, mBlockCount * sizeof(DbgMemoryFlags));
mOwns = true;
}
// DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, uint8* data, int size, bool makeCopy)
// {
// mAddr = addr;
// mBlockSize = size;
// mBlocks = new uint8*[1];
// mFlags = new DbgMemoryFlags[1];
// mSize = size;
//
// if (makeCopy)
// {
// uint8* dataCopy = new uint8[size];
// if (data != NULL)
// memcpy(dataCopy, data, size);
// else
// memset(dataCopy, 0, size);
// mBlocks[0] = dataCopy;
// }
// else
// {
// mBlocks[0] = data;
// }
//
// mOwns = makeCopy;
// mBlockCount = 1;
// }
DbgModuleMemoryCache::~DbgModuleMemoryCache()
{
if (mOwns)
{
for (int i = 0; i < mBlockCount; i++)
delete mBlocks[i];
}
delete [] mBlocks;
delete [] mFlags;
}
DbgMemoryFlags DbgModuleMemoryCache::Read(uintptr addr, uint8* data, int size)
{
BF_ASSERT(mAddr != 0);
int sizeLeft = size;
DbgMemoryFlags flags = DbgMemoryFlags_None;
if ((addr < mAddr) || (addr > mAddr + mSize))
{
gDebugger->ReadMemory(addr, size, data);
flags = gDebugger->GetMemoryFlags(addr);
BfLogDbg("Got memory flags %p = %d\n", addr, flags);
return flags;
}
int relAddr = (int)(addr - mAddr);
int blockIdx = relAddr / mBlockSize;
int curOffset = relAddr % mBlockSize;
while (sizeLeft > 0)
{
uint8* block = mBlocks[blockIdx];
if (block == NULL)
{
block = new uint8[mBlockSize];
gDebugger->ReadMemory(mAddr + blockIdx * mBlockSize, mBlockSize, block);
mBlocks[blockIdx] = block;
mFlags[blockIdx] = gDebugger->GetMemoryFlags(mAddr + blockIdx * mBlockSize);
BfLogDbg("Memory flags for %p = %d\n", mAddr + blockIdx * mBlockSize, mFlags[blockIdx]);
}
flags = mFlags[blockIdx];
int readSize = BF_MIN(sizeLeft, mBlockSize - curOffset);
if (data != NULL)
{
memcpy(data, block + curOffset, readSize);
data += readSize;
}
sizeLeft -= readSize;
curOffset = 0;
blockIdx++;
}
return flags;
}
void DbgModuleMemoryCache::ReportMemory(MemReporter * memReporter)
{
int totalMemory = 0;
if (mOwns)
{
for (int i = 0; i < mBlockCount; i++)
if (mBlocks[i] != NULL)
totalMemory += mBlockSize;
}
memReporter->Add(totalMemory);
}