summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/SourceManager.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-04 00:40:31 +0000
committerChris Lattner <sabre@nondot.org>2009-02-04 00:40:31 +0000
commit153a0f1f52f803e286b057cd31de49ac940ebe78 (patch)
tree4e721b9c9b2ade23ed75d543424c6d6fd419abd2 /clang/lib/Basic/SourceManager.cpp
parentbbf13f54e0596f2865c35d01e379b0b9a03201b8 (diff)
downloadbcm5719-llvm-153a0f1f52f803e286b057cd31de49ac940ebe78.tar.gz
bcm5719-llvm-153a0f1f52f803e286b057cd31de49ac940ebe78.zip
build per-fid linetable entries.
llvm-svn: 63694
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r--clang/lib/Basic/SourceManager.cpp51
1 files changed, 39 insertions, 12 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index 02568d373fe..54aed7c9f17 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -24,9 +24,9 @@ using namespace clang;
using namespace SrcMgr;
using llvm::MemoryBuffer;
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
// SourceManager Helper Classes
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
ContentCache::~ContentCache() {
delete Buffer;
@@ -57,11 +57,30 @@ 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;
+
+ static LineEntry get(unsigned Offs, unsigned Line, int Filename) {
+ LineEntry E;
+ E.FileOffset = Offs;
+ E.LineNo = Line;
+ E.FilenameID = Filename;
+ return E;
+ }
+};
+
+
/// LineTableInfo - This class is used to hold and unique data used to
/// represent #line information.
class LineTableInfo {
@@ -72,6 +91,10 @@ class LineTableInfo {
/// to string.
llvm::StringMap<unsigned, llvm::BumpPtrAllocator> FilenameIDs;
std::vector<llvm::StringMapEntry<unsigned>*> 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<unsigned, std::vector<LineEntry> > LineEntries;
public:
LineTableInfo() {
}
@@ -84,7 +107,7 @@ public:
~LineTableInfo() {}
unsigned getLineTableFilenameID(const char *Ptr, unsigned Len);
- void AddLineNote(FileID FID, unsigned Offset,
+ void AddLineNote(unsigned FID, unsigned Offset,
unsigned LineNo, int FilenameID);
};
} // namespace clang
@@ -109,9 +132,13 @@ unsigned LineTableInfo::getLineTableFilenameID(const char *Ptr, unsigned Len) {
/// AddLineNote - Add a line note to the line table that indicates that there
/// is a #line at the specified FID/Offset location which changes the presumed
/// location to LineNo/FilenameID.
-void LineTableInfo::AddLineNote(FileID FID, unsigned Offset,
+void LineTableInfo::AddLineNote(unsigned FID, unsigned Offset,
unsigned LineNo, int FilenameID) {
+ std::vector<LineEntry> &Entries = LineEntries[FID];
+ assert((Entries.empty() || Entries.back().FileOffset < Offset) &&
+ "Adding line entries out of order!");
+ Entries.push_back(LineEntry::get(Offset, LineNo, FilenameID));
}
@@ -139,13 +166,13 @@ void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo,
if (LineTable == 0)
LineTable = new LineTableInfo();
- LineTable->AddLineNote(LocInfo.first, LocInfo.second, LineNo, FilenameID);
+ LineTable->AddLineNote(LocInfo.first.ID, LocInfo.second, LineNo, FilenameID);
}
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
// Private 'Create' methods.
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
SourceManager::~SourceManager() {
delete LineTable;
@@ -261,9 +288,9 @@ SourceManager::getBufferData(FileID FID) const {
}
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
// SourceLocation manipulation methods.
-//===--------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
/// getFileIDSlow - Return the FileID for a SourceLocation. This is a very hot
/// method that is used for all SourceManager queries that start with a
@@ -755,7 +782,7 @@ void SourceManager::Emit(llvm::Serializer& S) const {
}
SourceManager*
-SourceManager::CreateAndRegister(llvm::Deserializer& D, FileManager& FMgr){
+SourceManager::CreateAndRegister(llvm::Deserializer &D, FileManager &FMgr) {
SourceManager *M = new SourceManager();
D.RegisterPtr(M);
OpenPOWER on IntegriCloud