17 #include "llvm/ADT/SmallString.h"
18 #include "llvm/Support/DataTypes.h"
19 #include "llvm/Support/MathExtras.h"
20 #include "llvm/Support/MemoryBuffer.h"
23 using namespace clang;
62 const char *
S = Str.begin(), *
End = Str.end();
81 unsigned FileSize = FE->
getSize();
82 if (FileSize <=
sizeof(
HMapHeader))
return nullptr;
85 if (!FileBuffer)
return nullptr;
86 const char *FileStart = (*FileBuffer)->getBufferStart();
96 NeedsByteSwap =
false;
103 if (Header->
Reserved != 0)
return nullptr;
106 return new HeaderMap(std::move(*FileBuffer), NeedsByteSwap);
116 return FileBuffer->getBufferIdentifier();
119 unsigned HeaderMap::getEndianAdjustedWord(
unsigned X)
const {
120 if (!NeedsBSwap)
return X;
121 return llvm::ByteSwap_32(X);
126 const HMapHeader &HeaderMap::getHeader()
const {
128 return *
reinterpret_cast<const HMapHeader*
>(FileBuffer->getBufferStart());
134 HMapBucket HeaderMap::getBucket(
unsigned BucketNo)
const {
139 reinterpret_cast<const HMapBucket*
>(FileBuffer->getBufferStart() +
142 const HMapBucket *BucketPtr = BucketArray+BucketNo;
143 if ((
const char*)(BucketPtr+1) > FileBuffer->getBufferEnd()) {
150 Result.
Key = getEndianAdjustedWord(BucketPtr->
Key);
151 Result.
Prefix = getEndianAdjustedWord(BucketPtr->
Prefix);
152 Result.
Suffix = getEndianAdjustedWord(BucketPtr->
Suffix);
158 const char *HeaderMap::getString(
unsigned StrTabIdx)
const {
160 StrTabIdx += getEndianAdjustedWord(getHeader().StringsOffset);
163 if (StrTabIdx >= FileBuffer->getBufferSize())
169 return FileBuffer->getBufferStart()+StrTabIdx;
179 unsigned NumBuckets = getEndianAdjustedWord(Hdr.
NumBuckets);
181 fprintf(stderr,
"Header Map %s:\n %d buckets, %d entries\n",
185 for (
unsigned i = 0; i != NumBuckets; ++i) {
189 const char *Key = getString(B.
Key);
190 const char *Prefix = getString(B.
Prefix);
191 const char *Suffix = getString(B.
Suffix);
192 fprintf(stderr,
" %d. %s -> '%s' '%s'\n", i, Key, Prefix, Suffix);
212 unsigned NumBuckets = getEndianAdjustedWord(Hdr.
NumBuckets);
216 if (NumBuckets & (NumBuckets-1))
225 if (!Filename.equals_lower(getString(B.
Key)))
230 StringRef Prefix = getString(B.
Prefix);
231 StringRef Suffix = getString(B.
Suffix);
233 DestPath.append(Prefix.begin(), Prefix.end());
234 DestPath.append(Suffix.begin(), Suffix.end());
235 return StringRef(DestPath.begin(), DestPath.size());
Implements support for file system lookup, file system caching, and directory search management...
Defines the clang::FileManager interface and associated types.
const FileEntry * getFile(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Lookup, cache, and verify the specified file (real or virtual).
The result type of a method or function.
Cached information about one file (either on disk or in the virtual file system). ...
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(const FileEntry *Entry, bool isVolatile=false, bool ShouldCloseOpenFile=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful, otherwise returning null.
static LLVM_READONLY char toLowercase(char c)
llvm::TimeRecord * Bucket