Viewing file: SourceManagerInternals.h (4.27 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- SourceManagerInternals.h - SourceManager Internals -------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// Defines implementation details of the clang::SourceManager class. // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_BASIC_SOURCEMANAGERINTERNALS_H #define LLVM_CLANG_BASIC_SOURCEMANAGERINTERNALS_H
#include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Allocator.h" #include <cassert> #include <map> #include <vector>
namespace clang {
//===----------------------------------------------------------------------===// // Line Table Implementation //===----------------------------------------------------------------------===//
struct LineEntry { /// The offset in this file that the line entry occurs at. unsigned FileOffset;
/// The presumed line number of this line entry: \#line 4. unsigned LineNo;
/// The ID of the filename identified by this line entry: /// \#line 4 "foo.c". This is -1 if not specified. int FilenameID;
/// Set the 0 if no flags, 1 if a system header, SrcMgr::CharacteristicKind FileKind;
/// 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; }
/// Used to hold and unique data used to represent \#line information. class LineTableInfo { /// Map 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<unsigned, llvm::BumpPtrAllocator> FilenameIDs; std::vector<llvm::StringMapEntry<unsigned>*> FilenamesByID;
/// Map from FileIDs to a list of line entries (sorted by the offset /// at which they occur in the file). std::map<FileID, std::vector<LineEntry>> LineEntries;
public: void clear() { FilenameIDs.clear(); FilenamesByID.clear(); LineEntries.clear(); }
unsigned getLineTableFilenameID(StringRef Str);
StringRef getFilename(unsigned ID) const { assert(ID < FilenamesByID.size() && "Invalid FilenameID"); return FilenamesByID[ID]->getKey(); }
unsigned getNumFilenames() const { return FilenamesByID.size(); }
void AddLineNote(FileID FID, unsigned Offset, unsigned LineNo, int FilenameID, unsigned EntryExit, SrcMgr::CharacteristicKind FileKind);
/// Find the line entry nearest to FID that is before it. /// /// If there is no line entry before \p Offset in \p FID, returns null. const LineEntry *FindNearestLineEntry(FileID FID, unsigned Offset);
// Low-level access using iterator = std::map<FileID, std::vector<LineEntry>>::iterator;
iterator begin() { return LineEntries.begin(); } iterator end() { return LineEntries.end(); }
/// Add a new line entry that has already been encoded into /// the internal representation of the line table. void AddEntry(FileID FID, const std::vector<LineEntry> &Entries); };
} // namespace clang
#endif // LLVM_CLANG_BASIC_SOURCEMANAGERINTERNALS_H
|