diff options
-rw-r--r-- | Lex/HeaderMap.cpp | 23 | ||||
-rw-r--r-- | include/clang/Lex/HeaderMap.h | 19 |
2 files changed, 31 insertions, 11 deletions
diff --git a/Lex/HeaderMap.cpp b/Lex/HeaderMap.cpp index ebcbc17f80..c698aba066 100644 --- a/Lex/HeaderMap.cpp +++ b/Lex/HeaderMap.cpp @@ -44,11 +44,11 @@ const HeaderMap *HeaderMap::Create(const FileEntry *FE) { unsigned FileSize = FE->getSize(); if (FileSize <= sizeof(HMapHeader)) return 0; - llvm::scoped_ptr<const llvm::MemoryBuffer> File( + llvm::scoped_ptr<const llvm::MemoryBuffer> FileBuffer( llvm::MemoryBuffer::getFile(FE->getName(), strlen(FE->getName()), 0, FE->getSize())); - if (File == 0) return 0; // Unreadable file? - const char *FileStart = File->getBufferStart(); + if (FileBuffer == 0) return 0; // Unreadable file? + const char *FileStart = FileBuffer->getBufferStart(); // We know the file is at least as big as the header, check it now. const HMapHeader *Header = reinterpret_cast<const HMapHeader*>(FileStart); @@ -65,8 +65,21 @@ const HeaderMap *HeaderMap::Create(const FileEntry *FE) { NeedsByteSwap = true; // Mixed endianness headermap. else return 0; // Not a header map. - - return 0; + + // Okay, everything looks good, create the header map. + HeaderMap *NewHM = new HeaderMap(FileBuffer.get(), NeedsByteSwap); + FileBuffer.reset(); // Don't deallocate the buffer on return. + return NewHM; +} + +HeaderMap::~HeaderMap() { + delete FileBuffer; +} + + +/// getFileName - Return the filename of the headermap. +const char *HeaderMap::getFileName() const { + return FileBuffer->getBufferIdentifier(); } /// LookupFile - Check to see if the specified relative filename is located in diff --git a/include/clang/Lex/HeaderMap.h b/include/clang/Lex/HeaderMap.h index dc70d848e0..973cf10a86 100644 --- a/include/clang/Lex/HeaderMap.h +++ b/include/clang/Lex/HeaderMap.h @@ -14,8 +14,9 @@ #ifndef LLVM_CLANG_LEX_HEADERMAP_H #define LLVM_CLANG_LEX_HEADERMAP_H -#include <string> - +namespace llvm { + class MemoryBuffer; +} namespace clang { class FileEntry; class FileManager; @@ -27,7 +28,16 @@ namespace clang { class HeaderMap { HeaderMap(const HeaderMap&); // DO NOT IMPLEMENT void operator=(const HeaderMap&); // DO NOT IMPLEMENT + + const llvm::MemoryBuffer *FileBuffer; + bool NeedsBSwap; + + HeaderMap(const llvm::MemoryBuffer *File, bool BSwap) + : FileBuffer(File), NeedsBSwap(BSwap) { + } public: + ~HeaderMap(); + /// HeaderMap::Create - This attempts to load the specified file as a header /// map. If it doesn't look like a HeaderMap, it gives up and returns null. static const HeaderMap *Create(const FileEntry *FE); @@ -38,10 +48,7 @@ public: FileManager &FM) const; /// getFileName - Return the filename of the headermap. - const char *getFileName() const { - return ""; - } - + const char *getFileName() const; }; } // end namespace clang. |