1822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner//===--- HeaderMap.h - A file that acts like dir of symlinks ----*- C++ -*-===// 2822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// 3822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// The LLVM Compiler Infrastructure 4822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 7822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// 8822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner//===----------------------------------------------------------------------===// 9822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// 10822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// This file defines the HeaderMap interface. 11822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner// 12822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner//===----------------------------------------------------------------------===// 13822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner 14822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner#ifndef LLVM_CLANG_LEX_HEADERMAP_H 15822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner#define LLVM_CLANG_LEX_HEADERMAP_H 16822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner 17686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 18f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko#include "llvm/Support/Compiler.h" 19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner 2098751314c4ba596860b574c3d3551030f01ff7d8Chris Lattnernamespace llvm { 2198751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner class MemoryBuffer; 2298751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner} 23822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattnernamespace clang { 24b09e71fd52d0e7fdf3e88b1df72ea0cee5d9b37bChris Lattner class FileEntry; 25b09e71fd52d0e7fdf3e88b1df72ea0cee5d9b37bChris Lattner class FileManager; 261adbf6349d4701771a814542008386ad39e3d614Chris Lattner struct HMapBucket; 271adbf6349d4701771a814542008386ad39e3d614Chris Lattner struct HMapHeader; 28822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner 29822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner/// This class represents an Apple concept known as a 'header map'. To the 30206d7db051d509e836e646377d1ecaffb35ca646James Dennett/// \#include file resolution process, it basically acts like a directory of 31822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner/// symlinks to files. Its advantages are that it is dense and more efficient 32822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner/// to create and process than a directory of symlinks. 33822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattnerclass HeaderMap { 34f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko HeaderMap(const HeaderMap &) LLVM_DELETED_FUNCTION; 35f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko void operator=(const HeaderMap &) LLVM_DELETED_FUNCTION; 361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3798751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner const llvm::MemoryBuffer *FileBuffer; 3898751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner bool NeedsBSwap; 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4098751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner HeaderMap(const llvm::MemoryBuffer *File, bool BSwap) 4198751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner : FileBuffer(File), NeedsBSwap(BSwap) { 4298751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner } 43822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattnerpublic: 4498751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner ~HeaderMap(); 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner /// HeaderMap::Create - This attempts to load the specified file as a header 47822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner /// map. If it doesn't look like a HeaderMap, it gives up and returns null. 4839b49bcaaddb1049234fca9500c0ac02c088e23dChris Lattner static const HeaderMap *Create(const FileEntry *FE, FileManager &FM); 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 50b09e71fd52d0e7fdf3e88b1df72ea0cee5d9b37bChris Lattner /// LookupFile - Check to see if the specified relative filename is located in 51b09e71fd52d0e7fdf3e88b1df72ea0cee5d9b37bChris Lattner /// this HeaderMap. If so, open it and return its FileEntry. 52b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth /// If RawPath is not NULL and the file is found, RawPath will be set to the 53b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth /// raw path at which the file was found in the file system. For example, 54b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth /// for a search path ".." and a filename "../file.h" this would be 55b5142bb7af5c70fffd09f05172a1379a35a9c29aChandler Carruth /// "../../file.h". 56686775deca8b8685eb90801495880e3abdd844c2Chris Lattner const FileEntry *LookupFile(StringRef Filename, FileManager &FM) const; 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// If the specified relative filename is located in this HeaderMap return 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines /// the filename it is mapped to, otherwise return an empty StringRef. 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef lookupFilename(StringRef Filename, 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<char> &DestPath) const; 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 633af66a9335966e9114e660cf7aafbb9272190ec2Chris Lattner /// getFileName - Return the filename of the headermap. 6498751314c4ba596860b574c3d3551030f01ff7d8Chris Lattner const char *getFileName() const; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 661adbf6349d4701771a814542008386ad39e3d614Chris Lattner /// dump - Print the contents of this headermap to stderr. 671adbf6349d4701771a814542008386ad39e3d614Chris Lattner void dump() const; 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 691adbf6349d4701771a814542008386ad39e3d614Chris Lattnerprivate: 701adbf6349d4701771a814542008386ad39e3d614Chris Lattner unsigned getEndianAdjustedWord(unsigned X) const; 711adbf6349d4701771a814542008386ad39e3d614Chris Lattner const HMapHeader &getHeader() const; 721adbf6349d4701771a814542008386ad39e3d614Chris Lattner HMapBucket getBucket(unsigned BucketNo) const; 731adbf6349d4701771a814542008386ad39e3d614Chris Lattner const char *getString(unsigned StrTabIdx) const; 74822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner}; 75822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner 76822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner} // end namespace clang. 77822da61b74ce14e89b3fa8774db18c833aa5748bChris Lattner 787360f9f2a5445064ae9728d19245104600886235Seo Sanghyeon#endif 79