diff --git a/clang/include/clang/Basic/SourceManagerInternals.h b/clang/include/clang/Basic/SourceManagerInternals.h new file mode 100644 index 000000000000..2f90f64b0fc5 --- /dev/null +++ b/clang/include/clang/Basic/SourceManagerInternals.h @@ -0,0 +1,120 @@ +//===--- SourceManagerInternals.h - SourceManager Internals -----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the implementation details of the SourceManager +// class. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_SOURCEMANAGER_INTERNALS_H +#define LLVM_CLANG_SOURCEMANAGER_INTERNALS_H + +#include "clang/Basic/SourceManager.h" +#include "llvm/ADT/StringMap.h" +#include + +namespace clang { + +//===----------------------------------------------------------------------===// +// Line Table Implementation +//===----------------------------------------------------------------------===// + +struct LineEntry { + /// FileOffset - The offset in this file that the line entry occurs at. + unsigned FileOffset; + + /// LineNo - The presumed line number of this line entry: #line 4. + unsigned LineNo; + + /// FilenameID - The ID of the filename identified by this line entry: + /// #line 4 "foo.c". This is -1 if not specified. + int FilenameID; + + /// Flags - Set the 0 if no flags, 1 if a system header, + SrcMgr::CharacteristicKind FileKind; + + /// IncludeOffset - This is the offset of the virtual include stack location, + /// which is manipulated by GNU linemarker directives. If this is 0 then + /// there is no virtual #includer. + unsigned IncludeOffset; + + static LineEntry get(unsigned Offs, unsigned Line, int Filename, + SrcMgr::CharacteristicKind FileKind, + unsigned IncludeOffset) { + LineEntry E; + E.FileOffset = Offs; + E.LineNo = Line; + E.FilenameID = Filename; + E.FileKind = FileKind; + E.IncludeOffset = IncludeOffset; + return E; + } +}; + +// needed for FindNearestLineEntry (upper_bound of LineEntry) +inline bool operator<(const LineEntry &lhs, const LineEntry &rhs) { + // FIXME: should check the other field? + return lhs.FileOffset < rhs.FileOffset; +} + +inline bool operator<(const LineEntry &E, unsigned Offset) { + return E.FileOffset < Offset; +} + +inline bool operator<(unsigned Offset, const LineEntry &E) { + return Offset < E.FileOffset; +} + +/// LineTableInfo - This class is used to hold and unique data used to +/// represent #line information. +class LineTableInfo { + /// FilenameIDs - This map is used to assign unique IDs to filenames in + /// #line directives. This allows us to unique the filenames that + /// frequently reoccur and reference them with indices. FilenameIDs holds + /// the mapping from string -> ID, and FilenamesByID holds the mapping of ID + /// to string. + llvm::StringMap FilenameIDs; + std::vector*> FilenamesByID; + + /// LineEntries - This is a map from FileIDs to a list of line entries (sorted + /// by the offset they occur in the file. + std::map > LineEntries; +public: + LineTableInfo() { + } + + void clear() { + FilenameIDs.clear(); + FilenamesByID.clear(); + LineEntries.clear(); + } + + ~LineTableInfo() {} + + unsigned getLineTableFilenameID(const char *Ptr, unsigned Len); + const char *getFilename(unsigned ID) const { + assert(ID < FilenamesByID.size() && "Invalid FilenameID"); + return FilenamesByID[ID]->getKeyData(); + } + + void AddLineNote(unsigned FID, unsigned Offset, + unsigned LineNo, int FilenameID); + void AddLineNote(unsigned FID, unsigned Offset, + unsigned LineNo, int FilenameID, + unsigned EntryExit, SrcMgr::CharacteristicKind FileKind); + + + /// FindNearestLineEntry - Find the line entry nearest to FID that is before + /// it. If there is no line entry before Offset in FID, return null. + const LineEntry *FindNearestLineEntry(unsigned FID, unsigned Offset); +}; + +} // end namespace clang + +#endif diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 2c667811a15d..d3fbeeb1bb86 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/SourceManager.h" +#include "clang/Basic/SourceManagerInternals.h" #include "clang/Basic/FileManager.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/MemoryBuffer.h" @@ -57,102 +58,6 @@ const llvm::MemoryBuffer *ContentCache::getBuffer() const { return Buffer; } -//===----------------------------------------------------------------------===// -// Line Table Implementation -//===----------------------------------------------------------------------===// - -namespace clang { -struct LineEntry { - /// FileOffset - The offset in this file that the line entry occurs at. - unsigned FileOffset; - - /// LineNo - The presumed line number of this line entry: #line 4. - unsigned LineNo; - - /// FilenameID - The ID of the filename identified by this line entry: - /// #line 4 "foo.c". This is -1 if not specified. - int FilenameID; - - /// Flags - Set the 0 if no flags, 1 if a system header, - SrcMgr::CharacteristicKind FileKind; - - /// IncludeOffset - This is the offset of the virtual include stack location, - /// which is manipulated by GNU linemarker directives. If this is 0 then - /// there is no virtual #includer. - unsigned IncludeOffset; - - static LineEntry get(unsigned Offs, unsigned Line, int Filename, - SrcMgr::CharacteristicKind FileKind, - unsigned IncludeOffset) { - LineEntry E; - E.FileOffset = Offs; - E.LineNo = Line; - E.FilenameID = Filename; - E.FileKind = FileKind; - E.IncludeOffset = IncludeOffset; - return E; - } -}; - -// needed for FindNearestLineEntry (upper_bound of LineEntry) -inline bool operator<(const LineEntry &lhs, const LineEntry &rhs) { - // FIXME: should check the other field? - return lhs.FileOffset < rhs.FileOffset; -} - -inline bool operator<(const LineEntry &E, unsigned Offset) { - return E.FileOffset < Offset; -} - -inline bool operator<(unsigned Offset, const LineEntry &E) { - return Offset < E.FileOffset; -} - -/// LineTableInfo - This class is used to hold and unique data used to -/// represent #line information. -class LineTableInfo { - /// FilenameIDs - This map is used to assign unique IDs to filenames in - /// #line directives. This allows us to unique the filenames that - /// frequently reoccur and reference them with indices. FilenameIDs holds - /// the mapping from string -> ID, and FilenamesByID holds the mapping of ID - /// to string. - llvm::StringMap FilenameIDs; - std::vector*> FilenamesByID; - - /// LineEntries - This is a map from FileIDs to a list of line entries (sorted - /// by the offset they occur in the file. - std::map > LineEntries; -public: - LineTableInfo() { - } - - void clear() { - FilenameIDs.clear(); - FilenamesByID.clear(); - LineEntries.clear(); - } - - ~LineTableInfo() {} - - unsigned getLineTableFilenameID(const char *Ptr, unsigned Len); - const char *getFilename(unsigned ID) const { - assert(ID < FilenamesByID.size() && "Invalid FilenameID"); - return FilenamesByID[ID]->getKeyData(); - } - - void AddLineNote(unsigned FID, unsigned Offset, - unsigned LineNo, int FilenameID); - void AddLineNote(unsigned FID, unsigned Offset, - unsigned LineNo, int FilenameID, - unsigned EntryExit, SrcMgr::CharacteristicKind FileKind); - - - /// FindNearestLineEntry - Find the line entry nearest to FID that is before - /// it. If there is no line entry before Offset in FID, return null. - const LineEntry *FindNearestLineEntry(unsigned FID, unsigned Offset); -}; -} // namespace clang - unsigned LineTableInfo::getLineTableFilenameID(const char *Ptr, unsigned Len) { // Look up the filename in the string table, returning the pre-existing value // if it exists.