aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/DeclBase.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-05 22:27:05 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-05 22:27:05 +0000
commitb6b60c1521a2e65f60e93c5fd56c103cf027df63 (patch)
tree3f7b845da88ecc38adcc50abba137f9ca97b83e8 /lib/AST/DeclBase.cpp
parent1e68ecc4fcce12f683c4fd38acfd1a004001b04f (diff)
When we deserialize a declaration from a module file, allocate extra
storage for the global declaration ID. Declarations that are parsed (rather than deserialized) are unaffected, so the number of declarations that pay this cost tends to be relatively small (since relatively few declarations are ever deserialized). This replaces a largish DenseMap within the AST reader. It's not strictly a win in terms of memory use---not every declaration was added to that DenseMap in the first place---but it's cleaner to have this information available for every deserialized declaration, so that future clients can rely on it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147617 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclBase.cpp')
-rw-r--r--lib/AST/DeclBase.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 55484188c8..f4e5d43ee6 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -44,7 +44,20 @@ static bool StatSwitch = false;
void *Decl::AllocateDeserializedDecl(const ASTContext &Context,
unsigned ID,
unsigned Size) {
- return Context.Allocate(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*);
+
+ // Store the global declaration ID
+ unsigned *IDPtr = (unsigned*)Result - 1;
+ *IDPtr = ID;
+
+ return Result;
}
const char *Decl::getDeclKindName() const {