Enhance clang_getCXTUResourceUsage() to report how much memory is used by SourceManager's memory buffers.

llvm-svn: 130433
This commit is contained in:
Ted Kremenek 2011-04-28 20:36:42 +00:00
parent e203bbb47e
commit 8d58790019
4 changed files with 72 additions and 4 deletions

View File

@ -1023,13 +1023,15 @@ enum CXTUResourceUsageKind {
CXTUResourceUsage_GlobalCompletionResults = 4,
CXTUResourceUsage_SourceManagerContentCache = 5,
CXTUResourceUsage_AST_SideTables = 6,
CXTUResourceUsage_SourceManager_Membuffer_Malloc = 7,
CXTUResourceUsage_SourceManager_Membuffer_MMap = 8,
CXTUResourceUsage_MEMORY_IN_BYTES_BEGIN = CXTUResourceUsage_AST,
CXTUResourceUsage_MEMORY_IN_BYTES_END =
CXTUResourceUsage_AST_SideTables,
CXTUResourceUsage_SourceManager_Membuffer_MMap,
CXTUResourceUsage_First = CXTUResourceUsage_AST,
CXTUResourceUsage_Last = CXTUResourceUsage_AST_SideTables
CXTUResourceUsage_Last = CXTUResourceUsage_SourceManager_Membuffer_MMap
};
/**

View File

@ -21,11 +21,11 @@
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/MemoryBuffer.h"
#include <vector>
#include <cassert>
namespace llvm {
class MemoryBuffer;
class StringRef;
}
@ -112,6 +112,10 @@ namespace SrcMgr {
/// instantiated.
unsigned getSizeBytesMapped() const;
/// Returns the kind of memory used to back the memory buffer for
/// this content cache. This is used for performance analysis.
llvm::MemoryBuffer::BufferKind getMemoryBufferKind() const;
void setBuffer(const llvm::MemoryBuffer *B) {
assert(!Buffer.getPointer() && "MemoryBuffer already set.");
Buffer.setPointer(B);
@ -859,6 +863,18 @@ public:
return ContentCacheAlloc.getTotalMemory();
}
struct MemoryBufferSizes {
const size_t malloc_bytes;
const size_t mmap_bytes;
MemoryBufferSizes(size_t malloc_bytes, size_t mmap_bytes)
: malloc_bytes(malloc_bytes), mmap_bytes(mmap_bytes) {}
};
/// Return the amount of memory used by memory buffers, breaking down
/// by heap-backed versus mmap'ed memory.
MemoryBufferSizes getMemoryBufferSizes() const;
//===--------------------------------------------------------------------===//
// Other miscellaneous methods.
//===--------------------------------------------------------------------===//

View File

@ -46,6 +46,19 @@ unsigned ContentCache::getSizeBytesMapped() const {
return Buffer.getPointer() ? Buffer.getPointer()->getBufferSize() : 0;
}
/// Returns the kind of memory used to back the memory buffer for
/// this content cache. This is used for performance analysis.
llvm::MemoryBuffer::BufferKind ContentCache::getMemoryBufferKind() const {
assert(Buffer.getPointer());
// Should be unreachable, but keep for sanity.
if (!Buffer.getPointer())
return llvm::MemoryBuffer::MemoryBuffer_Malloc;
const llvm::MemoryBuffer *buf = Buffer.getPointer();
return buf->getBufferKind();
}
/// getSize - Returns the size of the content encapsulated by this ContentCache.
/// This can be the size of the source file or the size of an arbitrary
/// scratch buffer. If the ContentCache encapsulates a source file, that
@ -1493,3 +1506,24 @@ void SourceManager::PrintStats() const {
}
ExternalSLocEntrySource::~ExternalSLocEntrySource() { }
/// Return the amount of memory used by memory buffers, breaking down
/// by heap-backed versus mmap'ed memory.
SourceManager::MemoryBufferSizes SourceManager::getMemoryBufferSizes() const {
size_t malloc_bytes = 0;
size_t mmap_bytes = 0;
for (unsigned i = 0, e = MemBufferInfos.size(); i != e; ++i)
if (size_t sized_mapped = MemBufferInfos[i]->getSizeBytesMapped())
switch (MemBufferInfos[i]->getMemoryBufferKind()) {
case llvm::MemoryBuffer::MemoryBuffer_MMap:
mmap_bytes += sized_mapped;
break;
case llvm::MemoryBuffer::MemoryBuffer_Malloc:
malloc_bytes += sized_mapped;
break;
}
return MemoryBufferSizes(malloc_bytes, mmap_bytes);
}

View File

@ -5226,6 +5226,12 @@ const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
case CXTUResourceUsage_AST_SideTables:
str = "ASTContext: side tables";
break;
case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
str = "SourceManager: malloc'ed memory buffers";
break;
case CXTUResourceUsage_SourceManager_Membuffer_MMap:
str = "SourceManager: mmap'ed memory buffers";
break;
}
return str;
}
@ -5271,6 +5277,16 @@ CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
CXTUResourceUsage_SourceManagerContentCache,
(unsigned long) astContext.getSourceManager().getContentCacheSize());
// How much memory is being used by the MemoryBuffer's in SourceManager?
const SourceManager::MemoryBufferSizes &srcBufs =
astUnit->getSourceManager().getMemoryBufferSizes();
createCXTUResourceUsageEntry(*entries,
CXTUResourceUsage_SourceManager_Membuffer_Malloc,
(unsigned long) srcBufs.malloc_bytes);
createCXTUResourceUsageEntry(*entries,
CXTUResourceUsage_SourceManager_Membuffer_MMap,
(unsigned long) srcBufs.mmap_bytes);
CXTUResourceUsage usage = { (void*) entries.get(),
(unsigned) entries->size(),