OSDN Git Service

Round up arena allocations to 8 bytes.
authorVladimir Marko <vmarko@google.com>
Tue, 10 Jun 2014 13:47:51 +0000 (14:47 +0100)
committerVladimir Marko <vmarko@google.com>
Tue, 10 Jun 2014 13:47:51 +0000 (14:47 +0100)
Prevent SIGBUS/BUS_ADRALN when we use the arena for classes
with 64-bit alignment.

Change-Id: I5382ed7072fcfb2349f61558e1fd8257315ee336

compiler/utils/arena_allocator.cc
compiler/utils/arena_allocator.h
compiler/utils/scoped_arena_allocator.cc
compiler/utils/scoped_arena_allocator.h

index ca4635d..6a39641 100644 (file)
@@ -215,7 +215,7 @@ void ArenaAllocator::UpdateBytesAllocated() {
 }
 
 void* ArenaAllocator::AllocValgrind(size_t bytes, ArenaAllocKind kind) {
-  size_t rounded_bytes = (bytes + 3 + kValgrindRedZoneBytes) & ~3;
+  size_t rounded_bytes = RoundUp(bytes + kValgrindRedZoneBytes, 8);
   if (UNLIKELY(ptr_ + rounded_bytes > end_)) {
     // Obtain a new block.
     ObtainNewArenaForAllocation(rounded_bytes);
index dbe482d..ac3938f 100644 (file)
@@ -156,7 +156,7 @@ class ArenaAllocator : private ArenaAllocatorStats {
     if (UNLIKELY(running_on_valgrind_)) {
       return AllocValgrind(bytes, kind);
     }
-    bytes = RoundUp(bytes, 4);
+    bytes = RoundUp(bytes, 8);
     if (UNLIKELY(ptr_ + bytes > end_)) {
       // Obtain a new block.
       ObtainNewArenaForAllocation(bytes);
index b8b0e6e..aeb2f76 100644 (file)
@@ -92,7 +92,7 @@ void ArenaStack::UpdateBytesAllocated() {
 }
 
 void* ArenaStack::AllocValgrind(size_t bytes, ArenaAllocKind kind) {
-  size_t rounded_bytes = RoundUp(bytes + kValgrindRedZoneBytes, 4);
+  size_t rounded_bytes = RoundUp(bytes + kValgrindRedZoneBytes, 8);
   uint8_t* ptr = top_ptr_;
   if (UNLIKELY(static_cast<size_t>(top_end_ - ptr) < rounded_bytes)) {
     ptr = AllocateFromNextArena(rounded_bytes);
index c090062..37799cb 100644 (file)
@@ -67,7 +67,7 @@ class ArenaStack : private DebugStackRefCounter {
     if (UNLIKELY(running_on_valgrind_)) {
       return AllocValgrind(bytes, kind);
     }
-    size_t rounded_bytes = RoundUp(bytes, 4);
+    size_t rounded_bytes = RoundUp(bytes, 8);
     uint8_t* ptr = top_ptr_;
     if (UNLIKELY(static_cast<size_t>(top_end_ - ptr) < rounded_bytes)) {
       ptr = AllocateFromNextArena(rounded_bytes);