diff options
author | Kostya Serebryany <kcc@google.com> | 2012-11-27 14:01:46 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@gcc.gnu.org> | 2012-11-27 14:01:46 +0000 |
commit | 4ba5ca4650c3fdc080ff4643da386075af5fd213 (patch) | |
tree | 689d358a17fc5081b93d1dae5d2cd4e1ee168c01 /libsanitizer/sanitizer_common | |
parent | 169d8507caebe73a977bcdb9f16cbb6254e7efd8 (diff) | |
download | gcc-4ba5ca4650c3fdc080ff4643da386075af5fd213.zip gcc-4ba5ca4650c3fdc080ff4643da386075af5fd213.tar.gz gcc-4ba5ca4650c3fdc080ff4643da386075af5fd213.tar.bz2 |
[libsanitizer] merge from upstream r168699
From-SVN: r193849
Diffstat (limited to 'libsanitizer/sanitizer_common')
7 files changed, 50 insertions, 32 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator.cc b/libsanitizer/sanitizer_common/sanitizer_allocator.cc index ff176a8..88905b7 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator.cc +++ b/libsanitizer/sanitizer_common/sanitizer_allocator.cc @@ -61,7 +61,7 @@ void *LowLevelAllocator::Allocate(uptr size) { // Align allocation size. size = RoundUpTo(size, 8); if (allocated_end_ - allocated_current_ < (sptr)size) { - uptr size_to_allocate = Max(size, kPageSize); + uptr size_to_allocate = Max(size, GetPageSizeCached()); allocated_current_ = (char*)MmapOrDie(size_to_allocate, __FUNCTION__); allocated_end_ = allocated_current_ + size_to_allocate; diff --git a/libsanitizer/sanitizer_common/sanitizer_allocator64.h b/libsanitizer/sanitizer_common/sanitizer_allocator64.h index 7614aba..222e3ad 100644 --- a/libsanitizer/sanitizer_common/sanitizer_allocator64.h +++ b/libsanitizer/sanitizer_common/sanitizer_allocator64.h @@ -215,7 +215,6 @@ class SizeClassAllocator64 { } static uptr AllocBeg() { return kSpaceBeg; } - static uptr AllocEnd() { return kSpaceBeg + kSpaceSize + AdditionalSize(); } static uptr AllocSize() { return kSpaceSize + AdditionalSize(); } static const uptr kNumClasses = 256; // Power of two <= 256 @@ -241,7 +240,7 @@ class SizeClassAllocator64 { static uptr AdditionalSize() { uptr res = sizeof(RegionInfo) * kNumClasses; - CHECK_EQ(res % kPageSize, 0); + CHECK_EQ(res % GetPageSizeCached(), 0); return res; } @@ -364,17 +363,18 @@ class LargeMmapAllocator { public: void Init() { internal_memset(this, 0, sizeof(*this)); + page_size_ = GetPageSizeCached(); } void *Allocate(uptr size, uptr alignment) { CHECK(IsPowerOfTwo(alignment)); uptr map_size = RoundUpMapSize(size); - if (alignment > kPageSize) + if (alignment > page_size_) map_size += alignment; if (map_size < size) return 0; // Overflow. uptr map_beg = reinterpret_cast<uptr>( MmapOrDie(map_size, "LargeMmapAllocator")); uptr map_end = map_beg + map_size; - uptr res = map_beg + kPageSize; + uptr res = map_beg + page_size_; if (res & (alignment - 1)) // Align. res += alignment - (res & (alignment - 1)); CHECK_EQ(0, res & (alignment - 1)); @@ -421,7 +421,7 @@ class LargeMmapAllocator { bool PointerIsMine(void *p) { // Fast check. - if ((reinterpret_cast<uptr>(p) % kPageSize) != 0) return false; + if ((reinterpret_cast<uptr>(p) & (page_size_ - 1))) return false; SpinMutexLock l(&mutex_); for (Header *l = list_; l; l = l->next) { if (GetUser(l) == p) return true; @@ -430,10 +430,10 @@ class LargeMmapAllocator { } uptr GetActuallyAllocatedSize(void *p) { - return RoundUpMapSize(GetHeader(p)->size) - kPageSize; + return RoundUpMapSize(GetHeader(p)->size) - page_size_; } - // At least kPageSize/2 metadata bytes is available. + // At least page_size_/2 metadata bytes is available. void *GetMetaData(void *p) { return GetHeader(p) + 1; } @@ -457,17 +457,20 @@ class LargeMmapAllocator { Header *prev; }; - Header *GetHeader(uptr p) { return reinterpret_cast<Header*>(p - kPageSize); } + Header *GetHeader(uptr p) { + return reinterpret_cast<Header*>(p - page_size_); + } Header *GetHeader(void *p) { return GetHeader(reinterpret_cast<uptr>(p)); } void *GetUser(Header *h) { - return reinterpret_cast<void*>(reinterpret_cast<uptr>(h) + kPageSize); + return reinterpret_cast<void*>(reinterpret_cast<uptr>(h) + page_size_); } uptr RoundUpMapSize(uptr size) { - return RoundUpTo(size, kPageSize) + kPageSize; + return RoundUpTo(size, page_size_) + page_size_; } + uptr page_size_; Header *list_; SpinMutex mutex_; }; diff --git a/libsanitizer/sanitizer_common/sanitizer_common.cc b/libsanitizer/sanitizer_common/sanitizer_common.cc index fda67a5..76a55c0 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.cc +++ b/libsanitizer/sanitizer_common/sanitizer_common.cc @@ -14,6 +14,13 @@ namespace __sanitizer { +uptr GetPageSizeCached() { + static uptr PageSize; + if (!PageSize) + PageSize = GetPageSize(); + return PageSize; +} + // By default, dump to stderr. If report_fd is kInvalidFd, try to obtain file // descriptor by opening file in report_path. static fd_t report_fd = kStderrFd; @@ -75,7 +82,8 @@ void RawWrite(const char *buffer) { uptr ReadFileToBuffer(const char *file_name, char **buff, uptr *buff_size, uptr max_len) { - const uptr kMinFileLen = kPageSize; + uptr PageSize = GetPageSizeCached(); + uptr kMinFileLen = PageSize; uptr read_len = 0; *buff = 0; *buff_size = 0; @@ -89,8 +97,8 @@ uptr ReadFileToBuffer(const char *file_name, char **buff, // Read up to one page at a time. read_len = 0; bool reached_eof = false; - while (read_len + kPageSize <= size) { - uptr just_read = internal_read(fd, *buff + read_len, kPageSize); + while (read_len + PageSize <= size) { + uptr just_read = internal_read(fd, *buff + read_len, PageSize); if (just_read == 0) { reached_eof = true; break; diff --git a/libsanitizer/sanitizer_common/sanitizer_common.h b/libsanitizer/sanitizer_common/sanitizer_common.h index e565b93..18b1e1a 100644 --- a/libsanitizer/sanitizer_common/sanitizer_common.h +++ b/libsanitizer/sanitizer_common/sanitizer_common.h @@ -21,25 +21,16 @@ namespace __sanitizer { // Constants. const uptr kWordSize = SANITIZER_WORDSIZE / 8; const uptr kWordSizeInBits = 8 * kWordSize; + #if defined(__powerpc__) || defined(__powerpc64__) -// Current PPC64 kernels use 64K pages sizes, but they can be -// configured with 4K or even other sizes. -// We may want to use getpagesize() or sysconf(_SC_PAGESIZE) here rather than -// hardcoding the values, but today these values need to be compile-time -// constants. -const uptr kPageSize = 1UL << 16; const uptr kCacheLineSize = 128; -const uptr kMmapGranularity = kPageSize; -#elif !defined(_WIN32) -const uptr kPageSize = 1UL << 12; -const uptr kCacheLineSize = 64; -const uptr kMmapGranularity = kPageSize; #else -const uptr kPageSize = 1UL << 12; const uptr kCacheLineSize = 64; -const uptr kMmapGranularity = 1UL << 16; #endif +uptr GetPageSize(); +uptr GetPageSizeCached(); +uptr GetMmapGranularity(); // Threads int GetPid(); uptr GetTid(); diff --git a/libsanitizer/sanitizer_common/sanitizer_posix.cc b/libsanitizer/sanitizer_common/sanitizer_posix.cc index bd9270e..75d1147 100644 --- a/libsanitizer/sanitizer_common/sanitizer_posix.cc +++ b/libsanitizer/sanitizer_common/sanitizer_posix.cc @@ -30,6 +30,13 @@ namespace __sanitizer { // ------------- sanitizer_common.h +uptr GetPageSize() { + return sysconf(_SC_PAGESIZE); +} + +uptr GetMmapGranularity() { + return GetPageSize(); +} int GetPid() { return getpid(); @@ -40,7 +47,7 @@ uptr GetThreadSelf() { } void *MmapOrDie(uptr size, const char *mem_type) { - size = RoundUpTo(size, kPageSize); + size = RoundUpTo(size, GetPageSizeCached()); void *res = internal_mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); @@ -72,8 +79,9 @@ void UnmapOrDie(void *addr, uptr size) { } void *MmapFixedNoReserve(uptr fixed_addr, uptr size) { - void *p = internal_mmap((void*)(fixed_addr & ~(kPageSize - 1)), - RoundUpTo(size, kPageSize), + uptr PageSize = GetPageSizeCached(); + void *p = internal_mmap((void*)(fixed_addr & ~(PageSize - 1)), + RoundUpTo(size, PageSize), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_FIXED | MAP_NORESERVE, -1, 0); @@ -96,7 +104,7 @@ void *MapFileToMemory(const char *file_name, uptr *buff_size) { uptr fsize = internal_filesize(fd); CHECK_NE(fsize, (uptr)-1); CHECK_GT(fsize, 0); - *buff_size = RoundUpTo(fsize, kPageSize); + *buff_size = RoundUpTo(fsize, GetPageSizeCached()); void *map = internal_mmap(0, *buff_size, PROT_READ, MAP_PRIVATE, fd, 0); return (map == MAP_FAILED) ? 0 : map; } diff --git a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc index 037a7c3..368d05d 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc +++ b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc @@ -63,7 +63,7 @@ void StackTrace::PrintStack(const uptr *addr, uptr size, bool symbolize, const char *strip_file_prefix, SymbolizeCallback symbolize_callback ) { MemoryMappingLayout proc_maps; - InternalScopedBuffer<char> buff(kPageSize * 2); + InternalScopedBuffer<char> buff(GetPageSizeCached() * 2); InternalScopedBuffer<AddressInfo> addr_frames(64); uptr frame_num = 0; for (uptr i = 0; i < size && addr[i]; i++) { diff --git a/libsanitizer/sanitizer_common/sanitizer_win.cc b/libsanitizer/sanitizer_common/sanitizer_win.cc index 03a5c20..15ef7d9 100644 --- a/libsanitizer/sanitizer_common/sanitizer_win.cc +++ b/libsanitizer/sanitizer_common/sanitizer_win.cc @@ -21,6 +21,14 @@ namespace __sanitizer { // --------------------- sanitizer_common.h +uptr GetPageSize() { + return 1U << 14; // FIXME: is this configurable? +} + +uptr GetMmapGranularity() { + return 1U << 16; // FIXME: is this configurable? +} + bool FileExists(const char *filename) { UNIMPLEMENTED(); } |