[cfe-commits] r61956 - /cfe/trunk/Driver/CacheTokens.cpp
Ted Kremenek
kremenek at apple.com
Thu Jan 8 15:40:50 PST 2009
Author: kremenek
Date: Thu Jan 8 17:40:50 2009
New Revision: 61956
URL: http://llvm.org/viewvc/llvm-project?rev=61956&view=rev
Log:
PTH: For the cached spellings of literals, store one whitespace character after the spelling to accomodate sanity checking in LiteralSuppoert.cpp.
Modified:
cfe/trunk/Driver/CacheTokens.cpp
Modified: cfe/trunk/Driver/CacheTokens.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/CacheTokens.cpp?rev=61956&r1=61955&r2=61956&view=diff
==============================================================================
--- cfe/trunk/Driver/CacheTokens.cpp (original)
+++ cfe/trunk/Driver/CacheTokens.cpp Thu Jan 8 17:40:50 2009
@@ -29,7 +29,8 @@
typedef uint32_t Offset;
-typedef std::vector<std::pair<Offset, llvm::StringMapEntry<Offset>*> >
+typedef std::pair<Offset,bool> SpellingTy;
+typedef std::vector<std::pair<Offset, llvm::StringMapEntry<SpellingTy>*> >
SpellMapTy;
namespace {
@@ -55,7 +56,7 @@
typedef llvm::DenseMap<const FileEntry*, PCHEntry> PCHMap;
typedef llvm::DenseMap<const IdentifierInfo*,uint32_t> IDMap;
-typedef llvm::StringMap<Offset, llvm::BumpPtrAllocator> CachedStrsTy;
+typedef llvm::StringMap< SpellingTy, llvm::BumpPtrAllocator> CachedStrsTy;
namespace {
class VISIBILITY_HIDDEN PTHWriter {
@@ -143,21 +144,31 @@
return;
switch (T.getKind()) {
- default:
- break;
- case tok::string_literal:
+ default: return;
+ case tok::numeric_constant:
+ case tok::string_literal:
case tok::wide_string_literal:
case tok::angle_string_literal:
- case tok::numeric_constant:
case tok::char_constant: {
// FIXME: This uses the slow getSpelling(). Perhaps we do better
// in the future? This only slows down PTH generation.
- const std::string& spelling = PP.getSpelling(T);
+ std::string spelling = PP.getSpelling(T);
+
+ // If the token is a numeric literal we add a space after the spelling.
+ // This is to handle a shortcoming in LiteralSupport.cpp where
+ // literals are assumed to have a "valid" character after them.
+ bool IsNumeric = T.getKind() == tok::numeric_constant;
+
+ if (IsNumeric)
+ spelling.push_back(' ');
+
const char* s = spelling.c_str();
// Get the string entry.
- llvm::StringMapEntry<Offset> *E =
- &CachedStrs.GetOrCreateValue(s, s+spelling.size());
+ llvm::StringMapEntry<std::pair<Offset,bool> > *E =
+ &CachedStrs.GetOrCreateValue(s, s + spelling.size());
+
+ E->getValue().second = IsNumeric;
// Store the address of the string entry in our spelling map.
(*CurSpellMap).push_back(std::make_pair(fpos, E));
@@ -405,14 +416,18 @@
// Write out the length of the string before the string itself.
unsigned len = I->getKeyLength();
- Emit16(len);
+
+ // Adjust the length we write in the PTH file to accomodate for numeric
+ // literals. We implicitly have a space after them, but only want to later
+ // read the characters that are just part of the literal itself.
+ Emit16(I->getValue().second ? len - 1 : len);
// Write out the string data.
const char* data = I->getKeyData();
EmitBuf(data, data+len);
// Now patch the offset of the string in the PTH file into the string map.
- I->setValue(off);
+ I->getValue().first = off;
}
// Now emit the spelling tables.
@@ -429,7 +444,7 @@
Emit32(spellings[i].first);
// Write out the offset of the spelling data within the PTH file.
- Emit32(spellings[i].second->getValue());
+ Emit32(spellings[i].second->getValue().first);
}
// Delete the spelling map for this source file.
More information about the cfe-commits
mailing list