]> granicus.if.org Git - clang/commitdiff
Always allocate an extra 8 bytes for a deserialized declaration, since
authorDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 23:49:36 +0000 (23:49 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 5 Jan 2012 23:49:36 +0000 (23:49 +0000)
some code in Clang expects 8-byte alignment of declarations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147626 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclBase.cpp

index f4e5d43ee6c46fbd36dc0c25fef83711a9265be1..4dc5bb7e850701aa5dc40ff5aaee2805a56b8122 100644 (file)
@@ -44,14 +44,11 @@ static bool StatSwitch = false;
 void *Decl::AllocateDeserializedDecl(const ASTContext &Context, 
                                      unsigned ID,
                                      unsigned Size) {
-  // Allocate an extra pointer's worth of storage, which ensures that 
-  //   (1) We have enough storage to stash the global declaration ID, and
-  //   (2) We maintain pointer alignment.
-  //
-  // Note that this wastes 4 bytes on x86-64, which we'll undoubtedly end up
-  // finding a use for later.
-  void *Start = Context.Allocate(Size + sizeof(void*));
-  void *Result = (char*)Start + sizeof(void*);
+  // Allocate an extra 8 bytes worth of storage, which ensures that the
+  // resulting pointer will still be 8-byte aligned. At present, we're only
+  // using the latter 4 bytes of this storage.
+  void *Start = Context.Allocate(Size + 8);
+  void *Result = (char*)Start + 8;
   
   // Store the global declaration ID 
   unsigned *IDPtr = (unsigned*)Result - 1;