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