1 //===--- SourceManager.cpp - Track and cache source files -----------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the SourceManager interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Basic/SourceManager.h" 15 #include "clang/Basic/SourceManagerInternals.h" 16 #include "clang/Basic/Diagnostic.h" 17 #include "clang/Basic/FileManager.h" 18 #include "llvm/ADT/StringSwitch.h" 19 #include "llvm/Support/Compiler.h" 20 #include "llvm/Support/MemoryBuffer.h" 21 #include "llvm/Support/raw_ostream.h" 22 #include "llvm/System/Path.h" 23 #include <algorithm> 24 #include <string> 25 #include <cstring> 26 27 using namespace clang; 28 using namespace SrcMgr; 29 using llvm::MemoryBuffer; 30 31 //===----------------------------------------------------------------------===// 32 // SourceManager Helper Classes 33 //===----------------------------------------------------------------------===// 34 35 ContentCache::~ContentCache() { 36 if (shouldFreeBuffer()) 37 delete Buffer.getPointer(); 38 } 39 40 /// getSizeBytesMapped - Returns the number of bytes actually mapped for 41 /// this ContentCache. This can be 0 if the MemBuffer was not actually 42 /// instantiated. 43 unsigned ContentCache::getSizeBytesMapped() const { 44 return Buffer.getPointer() ? Buffer.getPointer()->getBufferSize() : 0; 45 } 46 47 /// getSize - Returns the size of the content encapsulated by this ContentCache. 48 /// This can be the size of the source file or the size of an arbitrary 49 /// scratch buffer. If the ContentCache encapsulates a source file, that 50 /// file is not lazily brought in from disk to satisfy this query. 51 unsigned ContentCache::getSize() const { 52 return Buffer.getPointer() ? (unsigned) Buffer.getPointer()->getBufferSize() 53 : (unsigned) Entry->getSize(); 54 } 55 56 void ContentCache::replaceBuffer(const llvm::MemoryBuffer *B, 57 bool DoNotFree) { 58 assert(B != Buffer.getPointer()); 59 60 if (shouldFreeBuffer()) 61 delete Buffer.getPointer(); 62 Buffer.setPointer(B); 63 Buffer.setInt(DoNotFree? DoNotFreeFlag : 0); 64 } 65 66 const llvm::MemoryBuffer *ContentCache::getBuffer(Diagnostic &Diag, 67 const SourceManager &SM, 68 SourceLocation Loc, 69 bool *Invalid) const { 70 if (Invalid) 71 *Invalid = false; 72 73 // Lazily create the Buffer for ContentCaches that wrap files. 74 if (!Buffer.getPointer() && Entry) { 75 std::string ErrorStr; 76 Buffer.setPointer(SM.getFileManager().getBufferForFile(Entry, 77 SM.getFileSystemOpts(), 78 &ErrorStr)); 79 80 // If we were unable to open the file, then we are in an inconsistent 81 // situation where the content cache referenced a file which no longer 82 // exists. Most likely, we were using a stat cache with an invalid entry but 83 // the file could also have been removed during processing. Since we can't 84 // really deal with this situation, just create an empty buffer. 85 // 86 // FIXME: This is definitely not ideal, but our immediate clients can't 87 // currently handle returning a null entry here. Ideally we should detect 88 // that we are in an inconsistent situation and error out as quickly as 89 // possible. 90 if (!Buffer.getPointer()) { 91 const llvm::StringRef FillStr("<<<MISSING SOURCE FILE>>>\n"); 92 Buffer.setPointer(MemoryBuffer::getNewMemBuffer(Entry->getSize(), 93 "<invalid>")); 94 char *Ptr = const_cast<char*>(Buffer.getPointer()->getBufferStart()); 95 for (unsigned i = 0, e = Entry->getSize(); i != e; ++i) 96 Ptr[i] = FillStr[i % FillStr.size()]; 97 98 if (Diag.isDiagnosticInFlight()) 99 Diag.SetDelayedDiagnostic(diag::err_cannot_open_file, 100 Entry->getName(), ErrorStr); 101 else 102 Diag.Report(Loc, diag::err_cannot_open_file) 103 << Entry->getName() << ErrorStr; 104 105 Buffer.setInt(Buffer.getInt() | InvalidFlag); 106 107 } else if (getRawBuffer()->getBufferSize() != (size_t)Entry->getSize()) { 108 // Check that the file's size is the same as in the file entry (which may 109 // have come from a stat cache). 110 if (Diag.isDiagnosticInFlight()) 111 Diag.SetDelayedDiagnostic(diag::err_file_modified, 112 Entry->getName()); 113 else 114 Diag.Report(Loc, diag::err_file_modified) 115 << Entry->getName(); 116 117 Buffer.setInt(Buffer.getInt() | InvalidFlag); 118 } 119 120 // If the buffer is valid, check to see if it has a UTF Byte Order Mark 121 // (BOM). We only support UTF-8 without a BOM right now. See 122 // http://en.wikipedia.org/wiki/Byte_order_mark for more information. 123 if (!isBufferInvalid()) { 124 llvm::StringRef BufStr = Buffer.getPointer()->getBuffer(); 125 const char *BOM = llvm::StringSwitch<const char *>(BufStr) 126 .StartsWith("\xEF\xBB\xBF", "UTF-8") 127 .StartsWith("\xFE\xFF", "UTF-16 (BE)") 128 .StartsWith("\xFF\xFE", "UTF-16 (LE)") 129 .StartsWith("\x00\x00\xFE\xFF", "UTF-32 (BE)") 130 .StartsWith("\xFF\xFE\x00\x00", "UTF-32 (LE)") 131 .StartsWith("\x2B\x2F\x76", "UTF-7") 132 .StartsWith("\xF7\x64\x4C", "UTF-1") 133 .StartsWith("\xDD\x73\x66\x73", "UTF-EBCDIC") 134 .StartsWith("\x0E\xFE\xFF", "SDSU") 135 .StartsWith("\xFB\xEE\x28", "BOCU-1") 136 .StartsWith("\x84\x31\x95\x33", "GB-18030") 137 .Default(0); 138 139 if (BOM) { 140 Diag.Report(Loc, diag::err_unsupported_bom) 141 << BOM << Entry->getName(); 142 Buffer.setInt(1); 143 } 144 } 145 } 146 147 if (Invalid) 148 *Invalid = isBufferInvalid(); 149 150 return Buffer.getPointer(); 151 } 152 153 unsigned LineTableInfo::getLineTableFilenameID(const char *Ptr, unsigned Len) { 154 // Look up the filename in the string table, returning the pre-existing value 155 // if it exists. 156 llvm::StringMapEntry<unsigned> &Entry = 157 FilenameIDs.GetOrCreateValue(Ptr, Ptr+Len, ~0U); 158 if (Entry.getValue() != ~0U) 159 return Entry.getValue(); 160 161 // Otherwise, assign this the next available ID. 162 Entry.setValue(FilenamesByID.size()); 163 FilenamesByID.push_back(&Entry); 164 return FilenamesByID.size()-1; 165 } 166 167 /// AddLineNote - Add a line note to the line table that indicates that there 168 /// is a #line at the specified FID/Offset location which changes the presumed 169 /// location to LineNo/FilenameID. 170 void LineTableInfo::AddLineNote(unsigned FID, unsigned Offset, 171 unsigned LineNo, int FilenameID) { 172 std::vector<LineEntry> &Entries = LineEntries[FID]; 173 174 assert((Entries.empty() || Entries.back().FileOffset < Offset) && 175 "Adding line entries out of order!"); 176 177 SrcMgr::CharacteristicKind Kind = SrcMgr::C_User; 178 unsigned IncludeOffset = 0; 179 180 if (!Entries.empty()) { 181 // If this is a '#line 4' after '#line 42 "foo.h"', make sure to remember 182 // that we are still in "foo.h". 183 if (FilenameID == -1) 184 FilenameID = Entries.back().FilenameID; 185 186 // If we are after a line marker that switched us to system header mode, or 187 // that set #include information, preserve it. 188 Kind = Entries.back().FileKind; 189 IncludeOffset = Entries.back().IncludeOffset; 190 } 191 192 Entries.push_back(LineEntry::get(Offset, LineNo, FilenameID, Kind, 193 IncludeOffset)); 194 } 195 196 /// AddLineNote This is the same as the previous version of AddLineNote, but is 197 /// used for GNU line markers. If EntryExit is 0, then this doesn't change the 198 /// presumed #include stack. If it is 1, this is a file entry, if it is 2 then 199 /// this is a file exit. FileKind specifies whether this is a system header or 200 /// extern C system header. 201 void LineTableInfo::AddLineNote(unsigned FID, unsigned Offset, 202 unsigned LineNo, int FilenameID, 203 unsigned EntryExit, 204 SrcMgr::CharacteristicKind FileKind) { 205 assert(FilenameID != -1 && "Unspecified filename should use other accessor"); 206 207 std::vector<LineEntry> &Entries = LineEntries[FID]; 208 209 assert((Entries.empty() || Entries.back().FileOffset < Offset) && 210 "Adding line entries out of order!"); 211 212 unsigned IncludeOffset = 0; 213 if (EntryExit == 0) { // No #include stack change. 214 IncludeOffset = Entries.empty() ? 0 : Entries.back().IncludeOffset; 215 } else if (EntryExit == 1) { 216 IncludeOffset = Offset-1; 217 } else if (EntryExit == 2) { 218 assert(!Entries.empty() && Entries.back().IncludeOffset && 219 "PPDirectives should have caught case when popping empty include stack"); 220 221 // Get the include loc of the last entries' include loc as our include loc. 222 IncludeOffset = 0; 223 if (const LineEntry *PrevEntry = 224 FindNearestLineEntry(FID, Entries.back().IncludeOffset)) 225 IncludeOffset = PrevEntry->IncludeOffset; 226 } 227 228 Entries.push_back(LineEntry::get(Offset, LineNo, FilenameID, FileKind, 229 IncludeOffset)); 230 } 231 232 233 /// FindNearestLineEntry - Find the line entry nearest to FID that is before 234 /// it. If there is no line entry before Offset in FID, return null. 235 const LineEntry *LineTableInfo::FindNearestLineEntry(unsigned FID, 236 unsigned Offset) { 237 const std::vector<LineEntry> &Entries = LineEntries[FID]; 238 assert(!Entries.empty() && "No #line entries for this FID after all!"); 239 240 // It is very common for the query to be after the last #line, check this 241 // first. 242 if (Entries.back().FileOffset <= Offset) 243 return &Entries.back(); 244 245 // Do a binary search to find the maximal element that is still before Offset. 246 std::vector<LineEntry>::const_iterator I = 247 std::upper_bound(Entries.begin(), Entries.end(), Offset); 248 if (I == Entries.begin()) return 0; 249 return &*--I; 250 } 251 252 /// \brief Add a new line entry that has already been encoded into 253 /// the internal representation of the line table. 254 void LineTableInfo::AddEntry(unsigned FID, 255 const std::vector<LineEntry> &Entries) { 256 LineEntries[FID] = Entries; 257 } 258 259 /// getLineTableFilenameID - Return the uniqued ID for the specified filename. 260 /// 261 unsigned SourceManager::getLineTableFilenameID(const char *Ptr, unsigned Len) { 262 if (LineTable == 0) 263 LineTable = new LineTableInfo(); 264 return LineTable->getLineTableFilenameID(Ptr, Len); 265 } 266 267 268 /// AddLineNote - Add a line note to the line table for the FileID and offset 269 /// specified by Loc. If FilenameID is -1, it is considered to be 270 /// unspecified. 271 void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, 272 int FilenameID) { 273 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 274 275 const SrcMgr::FileInfo &FileInfo = getSLocEntry(LocInfo.first).getFile(); 276 277 // Remember that this file has #line directives now if it doesn't already. 278 const_cast<SrcMgr::FileInfo&>(FileInfo).setHasLineDirectives(); 279 280 if (LineTable == 0) 281 LineTable = new LineTableInfo(); 282 LineTable->AddLineNote(LocInfo.first.ID, LocInfo.second, LineNo, FilenameID); 283 } 284 285 /// AddLineNote - Add a GNU line marker to the line table. 286 void SourceManager::AddLineNote(SourceLocation Loc, unsigned LineNo, 287 int FilenameID, bool IsFileEntry, 288 bool IsFileExit, bool IsSystemHeader, 289 bool IsExternCHeader) { 290 // If there is no filename and no flags, this is treated just like a #line, 291 // which does not change the flags of the previous line marker. 292 if (FilenameID == -1) { 293 assert(!IsFileEntry && !IsFileExit && !IsSystemHeader && !IsExternCHeader && 294 "Can't set flags without setting the filename!"); 295 return AddLineNote(Loc, LineNo, FilenameID); 296 } 297 298 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 299 const SrcMgr::FileInfo &FileInfo = getSLocEntry(LocInfo.first).getFile(); 300 301 // Remember that this file has #line directives now if it doesn't already. 302 const_cast<SrcMgr::FileInfo&>(FileInfo).setHasLineDirectives(); 303 304 if (LineTable == 0) 305 LineTable = new LineTableInfo(); 306 307 SrcMgr::CharacteristicKind FileKind; 308 if (IsExternCHeader) 309 FileKind = SrcMgr::C_ExternCSystem; 310 else if (IsSystemHeader) 311 FileKind = SrcMgr::C_System; 312 else 313 FileKind = SrcMgr::C_User; 314 315 unsigned EntryExit = 0; 316 if (IsFileEntry) 317 EntryExit = 1; 318 else if (IsFileExit) 319 EntryExit = 2; 320 321 LineTable->AddLineNote(LocInfo.first.ID, LocInfo.second, LineNo, FilenameID, 322 EntryExit, FileKind); 323 } 324 325 LineTableInfo &SourceManager::getLineTable() { 326 if (LineTable == 0) 327 LineTable = new LineTableInfo(); 328 return *LineTable; 329 } 330 331 //===----------------------------------------------------------------------===// 332 // Private 'Create' methods. 333 //===----------------------------------------------------------------------===// 334 335 SourceManager::SourceManager(Diagnostic &Diag, FileManager &FileMgr, 336 const FileSystemOptions &FSOpts) 337 : Diag(Diag), FileMgr(FileMgr), FileSystemOpts(FSOpts), 338 ExternalSLocEntries(0), LineTable(0), NumLinearScans(0), 339 NumBinaryProbes(0) { 340 clearIDTables(); 341 Diag.setSourceManager(this); 342 } 343 344 SourceManager::~SourceManager() { 345 delete LineTable; 346 347 // Delete FileEntry objects corresponding to content caches. Since the actual 348 // content cache objects are bump pointer allocated, we just have to run the 349 // dtors, but we call the deallocate method for completeness. 350 for (unsigned i = 0, e = MemBufferInfos.size(); i != e; ++i) { 351 MemBufferInfos[i]->~ContentCache(); 352 ContentCacheAlloc.Deallocate(MemBufferInfos[i]); 353 } 354 for (llvm::DenseMap<const FileEntry*, SrcMgr::ContentCache*>::iterator 355 I = FileInfos.begin(), E = FileInfos.end(); I != E; ++I) { 356 I->second->~ContentCache(); 357 ContentCacheAlloc.Deallocate(I->second); 358 } 359 } 360 361 void SourceManager::clearIDTables() { 362 MainFileID = FileID(); 363 SLocEntryTable.clear(); 364 LastLineNoFileIDQuery = FileID(); 365 LastLineNoContentCache = 0; 366 LastFileIDLookup = FileID(); 367 368 if (LineTable) 369 LineTable->clear(); 370 371 // Use up FileID #0 as an invalid instantiation. 372 NextOffset = 0; 373 createInstantiationLoc(SourceLocation(),SourceLocation(),SourceLocation(), 1); 374 } 375 376 /// getOrCreateContentCache - Create or return a cached ContentCache for the 377 /// specified file. 378 const ContentCache * 379 SourceManager::getOrCreateContentCache(const FileEntry *FileEnt) { 380 assert(FileEnt && "Didn't specify a file entry to use?"); 381 382 // Do we already have information about this file? 383 ContentCache *&Entry = FileInfos[FileEnt]; 384 if (Entry) return Entry; 385 386 // Nope, create a new Cache entry. Make sure it is at least 8-byte aligned 387 // so that FileInfo can use the low 3 bits of the pointer for its own 388 // nefarious purposes. 389 unsigned EntryAlign = llvm::AlignOf<ContentCache>::Alignment; 390 EntryAlign = std::max(8U, EntryAlign); 391 Entry = ContentCacheAlloc.Allocate<ContentCache>(1, EntryAlign); 392 new (Entry) ContentCache(FileEnt); 393 return Entry; 394 } 395 396 397 /// createMemBufferContentCache - Create a new ContentCache for the specified 398 /// memory buffer. This does no caching. 399 const ContentCache* 400 SourceManager::createMemBufferContentCache(const MemoryBuffer *Buffer) { 401 // Add a new ContentCache to the MemBufferInfos list and return it. Make sure 402 // it is at least 8-byte aligned so that FileInfo can use the low 3 bits of 403 // the pointer for its own nefarious purposes. 404 unsigned EntryAlign = llvm::AlignOf<ContentCache>::Alignment; 405 EntryAlign = std::max(8U, EntryAlign); 406 ContentCache *Entry = ContentCacheAlloc.Allocate<ContentCache>(1, EntryAlign); 407 new (Entry) ContentCache(); 408 MemBufferInfos.push_back(Entry); 409 Entry->setBuffer(Buffer); 410 return Entry; 411 } 412 413 void SourceManager::PreallocateSLocEntries(ExternalSLocEntrySource *Source, 414 unsigned NumSLocEntries, 415 unsigned NextOffset) { 416 ExternalSLocEntries = Source; 417 this->NextOffset = NextOffset; 418 unsigned CurPrealloc = SLocEntryLoaded.size(); 419 // If we've ever preallocated, we must not count the dummy entry. 420 if (CurPrealloc) --CurPrealloc; 421 SLocEntryLoaded.resize(NumSLocEntries + 1); 422 SLocEntryLoaded[0] = true; 423 SLocEntryTable.resize(SLocEntryTable.size() + NumSLocEntries - CurPrealloc); 424 } 425 426 void SourceManager::ClearPreallocatedSLocEntries() { 427 unsigned I = 0; 428 for (unsigned N = SLocEntryLoaded.size(); I != N; ++I) 429 if (!SLocEntryLoaded[I]) 430 break; 431 432 // We've already loaded all preallocated source location entries. 433 if (I == SLocEntryLoaded.size()) 434 return; 435 436 // Remove everything from location I onward. 437 SLocEntryTable.resize(I); 438 SLocEntryLoaded.clear(); 439 ExternalSLocEntries = 0; 440 } 441 442 443 //===----------------------------------------------------------------------===// 444 // Methods to create new FileID's and instantiations. 445 //===----------------------------------------------------------------------===// 446 447 /// createFileID - Create a new FileID for the specified ContentCache and 448 /// include position. This works regardless of whether the ContentCache 449 /// corresponds to a file or some other input source. 450 FileID SourceManager::createFileID(const ContentCache *File, 451 SourceLocation IncludePos, 452 SrcMgr::CharacteristicKind FileCharacter, 453 unsigned PreallocatedID, 454 unsigned Offset) { 455 if (PreallocatedID) { 456 // If we're filling in a preallocated ID, just load in the file 457 // entry and return. 458 assert(PreallocatedID < SLocEntryLoaded.size() && 459 "Preallocate ID out-of-range"); 460 assert(!SLocEntryLoaded[PreallocatedID] && 461 "Source location entry already loaded"); 462 assert(Offset && "Preallocate source location cannot have zero offset"); 463 SLocEntryTable[PreallocatedID] 464 = SLocEntry::get(Offset, FileInfo::get(IncludePos, File, FileCharacter)); 465 SLocEntryLoaded[PreallocatedID] = true; 466 FileID FID = FileID::get(PreallocatedID); 467 return FID; 468 } 469 470 SLocEntryTable.push_back(SLocEntry::get(NextOffset, 471 FileInfo::get(IncludePos, File, 472 FileCharacter))); 473 unsigned FileSize = File->getSize(); 474 assert(NextOffset+FileSize+1 > NextOffset && "Ran out of source locations!"); 475 NextOffset += FileSize+1; 476 477 // Set LastFileIDLookup to the newly created file. The next getFileID call is 478 // almost guaranteed to be from that file. 479 FileID FID = FileID::get(SLocEntryTable.size()-1); 480 return LastFileIDLookup = FID; 481 } 482 483 /// createInstantiationLoc - Return a new SourceLocation that encodes the fact 484 /// that a token from SpellingLoc should actually be referenced from 485 /// InstantiationLoc. 486 SourceLocation SourceManager::createInstantiationLoc(SourceLocation SpellingLoc, 487 SourceLocation ILocStart, 488 SourceLocation ILocEnd, 489 unsigned TokLength, 490 unsigned PreallocatedID, 491 unsigned Offset) { 492 InstantiationInfo II = InstantiationInfo::get(ILocStart,ILocEnd, SpellingLoc); 493 if (PreallocatedID) { 494 // If we're filling in a preallocated ID, just load in the 495 // instantiation entry and return. 496 assert(PreallocatedID < SLocEntryLoaded.size() && 497 "Preallocate ID out-of-range"); 498 assert(!SLocEntryLoaded[PreallocatedID] && 499 "Source location entry already loaded"); 500 assert(Offset && "Preallocate source location cannot have zero offset"); 501 SLocEntryTable[PreallocatedID] = SLocEntry::get(Offset, II); 502 SLocEntryLoaded[PreallocatedID] = true; 503 return SourceLocation::getMacroLoc(Offset); 504 } 505 SLocEntryTable.push_back(SLocEntry::get(NextOffset, II)); 506 assert(NextOffset+TokLength+1 > NextOffset && "Ran out of source locations!"); 507 NextOffset += TokLength+1; 508 return SourceLocation::getMacroLoc(NextOffset-(TokLength+1)); 509 } 510 511 const llvm::MemoryBuffer * 512 SourceManager::getMemoryBufferForFile(const FileEntry *File, 513 bool *Invalid) { 514 const SrcMgr::ContentCache *IR = getOrCreateContentCache(File); 515 assert(IR && "getOrCreateContentCache() cannot return NULL"); 516 return IR->getBuffer(Diag, *this, SourceLocation(), Invalid); 517 } 518 519 void SourceManager::overrideFileContents(const FileEntry *SourceFile, 520 const llvm::MemoryBuffer *Buffer, 521 bool DoNotFree) { 522 const SrcMgr::ContentCache *IR = getOrCreateContentCache(SourceFile); 523 assert(IR && "getOrCreateContentCache() cannot return NULL"); 524 525 const_cast<SrcMgr::ContentCache *>(IR)->replaceBuffer(Buffer, DoNotFree); 526 } 527 528 llvm::StringRef SourceManager::getBufferData(FileID FID, bool *Invalid) const { 529 bool MyInvalid = false; 530 const llvm::MemoryBuffer *Buf = getBuffer(FID, &MyInvalid); 531 if (Invalid) 532 *Invalid = MyInvalid; 533 534 if (MyInvalid) 535 return ""; 536 537 return Buf->getBuffer(); 538 } 539 540 //===----------------------------------------------------------------------===// 541 // SourceLocation manipulation methods. 542 //===----------------------------------------------------------------------===// 543 544 /// getFileIDSlow - Return the FileID for a SourceLocation. This is a very hot 545 /// method that is used for all SourceManager queries that start with a 546 /// SourceLocation object. It is responsible for finding the entry in 547 /// SLocEntryTable which contains the specified location. 548 /// 549 FileID SourceManager::getFileIDSlow(unsigned SLocOffset) const { 550 assert(SLocOffset && "Invalid FileID"); 551 552 // After the first and second level caches, I see two common sorts of 553 // behavior: 1) a lot of searched FileID's are "near" the cached file location 554 // or are "near" the cached instantiation location. 2) others are just 555 // completely random and may be a very long way away. 556 // 557 // To handle this, we do a linear search for up to 8 steps to catch #1 quickly 558 // then we fall back to a less cache efficient, but more scalable, binary 559 // search to find the location. 560 561 // See if this is near the file point - worst case we start scanning from the 562 // most newly created FileID. 563 std::vector<SrcMgr::SLocEntry>::const_iterator I; 564 565 if (SLocEntryTable[LastFileIDLookup.ID].getOffset() < SLocOffset) { 566 // Neither loc prunes our search. 567 I = SLocEntryTable.end(); 568 } else { 569 // Perhaps it is near the file point. 570 I = SLocEntryTable.begin()+LastFileIDLookup.ID; 571 } 572 573 // Find the FileID that contains this. "I" is an iterator that points to a 574 // FileID whose offset is known to be larger than SLocOffset. 575 unsigned NumProbes = 0; 576 while (1) { 577 --I; 578 if (ExternalSLocEntries) 579 getSLocEntry(FileID::get(I - SLocEntryTable.begin())); 580 if (I->getOffset() <= SLocOffset) { 581 #if 0 582 printf("lin %d -> %d [%s] %d %d\n", SLocOffset, 583 I-SLocEntryTable.begin(), 584 I->isInstantiation() ? "inst" : "file", 585 LastFileIDLookup.ID, int(SLocEntryTable.end()-I)); 586 #endif 587 FileID Res = FileID::get(I-SLocEntryTable.begin()); 588 589 // If this isn't an instantiation, remember it. We have good locality 590 // across FileID lookups. 591 if (!I->isInstantiation()) 592 LastFileIDLookup = Res; 593 NumLinearScans += NumProbes+1; 594 return Res; 595 } 596 if (++NumProbes == 8) 597 break; 598 } 599 600 // Convert "I" back into an index. We know that it is an entry whose index is 601 // larger than the offset we are looking for. 602 unsigned GreaterIndex = I-SLocEntryTable.begin(); 603 // LessIndex - This is the lower bound of the range that we're searching. 604 // We know that the offset corresponding to the FileID is is less than 605 // SLocOffset. 606 unsigned LessIndex = 0; 607 NumProbes = 0; 608 while (1) { 609 unsigned MiddleIndex = (GreaterIndex-LessIndex)/2+LessIndex; 610 unsigned MidOffset = getSLocEntry(FileID::get(MiddleIndex)).getOffset(); 611 612 ++NumProbes; 613 614 // If the offset of the midpoint is too large, chop the high side of the 615 // range to the midpoint. 616 if (MidOffset > SLocOffset) { 617 GreaterIndex = MiddleIndex; 618 continue; 619 } 620 621 // If the middle index contains the value, succeed and return. 622 if (isOffsetInFileID(FileID::get(MiddleIndex), SLocOffset)) { 623 #if 0 624 printf("bin %d -> %d [%s] %d %d\n", SLocOffset, 625 I-SLocEntryTable.begin(), 626 I->isInstantiation() ? "inst" : "file", 627 LastFileIDLookup.ID, int(SLocEntryTable.end()-I)); 628 #endif 629 FileID Res = FileID::get(MiddleIndex); 630 631 // If this isn't an instantiation, remember it. We have good locality 632 // across FileID lookups. 633 if (!I->isInstantiation()) 634 LastFileIDLookup = Res; 635 NumBinaryProbes += NumProbes; 636 return Res; 637 } 638 639 // Otherwise, move the low-side up to the middle index. 640 LessIndex = MiddleIndex; 641 } 642 } 643 644 SourceLocation SourceManager:: 645 getInstantiationLocSlowCase(SourceLocation Loc) const { 646 do { 647 // Note: If Loc indicates an offset into a token that came from a macro 648 // expansion (e.g. the 5th character of the token) we do not want to add 649 // this offset when going to the instantiation location. The instatiation 650 // location is the macro invocation, which the offset has nothing to do 651 // with. This is unlike when we get the spelling loc, because the offset 652 // directly correspond to the token whose spelling we're inspecting. 653 Loc = getSLocEntry(getFileID(Loc)).getInstantiation() 654 .getInstantiationLocStart(); 655 } while (!Loc.isFileID()); 656 657 return Loc; 658 } 659 660 SourceLocation SourceManager::getSpellingLocSlowCase(SourceLocation Loc) const { 661 do { 662 std::pair<FileID, unsigned> LocInfo = getDecomposedLoc(Loc); 663 Loc = getSLocEntry(LocInfo.first).getInstantiation().getSpellingLoc(); 664 Loc = Loc.getFileLocWithOffset(LocInfo.second); 665 } while (!Loc.isFileID()); 666 return Loc; 667 } 668 669 670 std::pair<FileID, unsigned> 671 SourceManager::getDecomposedInstantiationLocSlowCase(const SrcMgr::SLocEntry *E, 672 unsigned Offset) const { 673 // If this is an instantiation record, walk through all the instantiation 674 // points. 675 FileID FID; 676 SourceLocation Loc; 677 do { 678 Loc = E->getInstantiation().getInstantiationLocStart(); 679 680 FID = getFileID(Loc); 681 E = &getSLocEntry(FID); 682 Offset += Loc.getOffset()-E->getOffset(); 683 } while (!Loc.isFileID()); 684 685 return std::make_pair(FID, Offset); 686 } 687 688 std::pair<FileID, unsigned> 689 SourceManager::getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, 690 unsigned Offset) const { 691 // If this is an instantiation record, walk through all the instantiation 692 // points. 693 FileID FID; 694 SourceLocation Loc; 695 do { 696 Loc = E->getInstantiation().getSpellingLoc(); 697 698 FID = getFileID(Loc); 699 E = &getSLocEntry(FID); 700 Offset += Loc.getOffset()-E->getOffset(); 701 } while (!Loc.isFileID()); 702 703 return std::make_pair(FID, Offset); 704 } 705 706 /// getImmediateSpellingLoc - Given a SourceLocation object, return the 707 /// spelling location referenced by the ID. This is the first level down 708 /// towards the place where the characters that make up the lexed token can be 709 /// found. This should not generally be used by clients. 710 SourceLocation SourceManager::getImmediateSpellingLoc(SourceLocation Loc) const{ 711 if (Loc.isFileID()) return Loc; 712 std::pair<FileID, unsigned> LocInfo = getDecomposedLoc(Loc); 713 Loc = getSLocEntry(LocInfo.first).getInstantiation().getSpellingLoc(); 714 return Loc.getFileLocWithOffset(LocInfo.second); 715 } 716 717 718 /// getImmediateInstantiationRange - Loc is required to be an instantiation 719 /// location. Return the start/end of the instantiation information. 720 std::pair<SourceLocation,SourceLocation> 721 SourceManager::getImmediateInstantiationRange(SourceLocation Loc) const { 722 assert(Loc.isMacroID() && "Not an instantiation loc!"); 723 const InstantiationInfo &II = getSLocEntry(getFileID(Loc)).getInstantiation(); 724 return II.getInstantiationLocRange(); 725 } 726 727 /// getInstantiationRange - Given a SourceLocation object, return the 728 /// range of tokens covered by the instantiation in the ultimate file. 729 std::pair<SourceLocation,SourceLocation> 730 SourceManager::getInstantiationRange(SourceLocation Loc) const { 731 if (Loc.isFileID()) return std::make_pair(Loc, Loc); 732 733 std::pair<SourceLocation,SourceLocation> Res = 734 getImmediateInstantiationRange(Loc); 735 736 // Fully resolve the start and end locations to their ultimate instantiation 737 // points. 738 while (!Res.first.isFileID()) 739 Res.first = getImmediateInstantiationRange(Res.first).first; 740 while (!Res.second.isFileID()) 741 Res.second = getImmediateInstantiationRange(Res.second).second; 742 return Res; 743 } 744 745 746 747 //===----------------------------------------------------------------------===// 748 // Queries about the code at a SourceLocation. 749 //===----------------------------------------------------------------------===// 750 751 /// getCharacterData - Return a pointer to the start of the specified location 752 /// in the appropriate MemoryBuffer. 753 const char *SourceManager::getCharacterData(SourceLocation SL, 754 bool *Invalid) const { 755 // Note that this is a hot function in the getSpelling() path, which is 756 // heavily used by -E mode. 757 std::pair<FileID, unsigned> LocInfo = getDecomposedSpellingLoc(SL); 758 759 // Note that calling 'getBuffer()' may lazily page in a source file. 760 bool CharDataInvalid = false; 761 const llvm::MemoryBuffer *Buffer 762 = getSLocEntry(LocInfo.first).getFile().getContentCache() 763 ->getBuffer(Diag, *this, SourceLocation(), &CharDataInvalid); 764 if (Invalid) 765 *Invalid = CharDataInvalid; 766 return Buffer->getBufferStart() + (CharDataInvalid? 0 : LocInfo.second); 767 } 768 769 770 /// getColumnNumber - Return the column # for the specified file position. 771 /// this is significantly cheaper to compute than the line number. 772 unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos, 773 bool *Invalid) const { 774 bool MyInvalid = false; 775 const char *Buf = getBuffer(FID, &MyInvalid)->getBufferStart(); 776 if (Invalid) 777 *Invalid = MyInvalid; 778 779 if (MyInvalid) 780 return 1; 781 782 unsigned LineStart = FilePos; 783 while (LineStart && Buf[LineStart-1] != '\n' && Buf[LineStart-1] != '\r') 784 --LineStart; 785 return FilePos-LineStart+1; 786 } 787 788 // isInvalid - Return the result of calling loc.isInvalid(), and 789 // if Invalid is not null, set its value to same. 790 static bool isInvalid(SourceLocation Loc, bool *Invalid) { 791 bool MyInvalid = Loc.isInvalid(); 792 if (Invalid) 793 *Invalid = MyInvalid; 794 return MyInvalid; 795 } 796 797 unsigned SourceManager::getSpellingColumnNumber(SourceLocation Loc, 798 bool *Invalid) const { 799 if (isInvalid(Loc, Invalid)) return 0; 800 std::pair<FileID, unsigned> LocInfo = getDecomposedSpellingLoc(Loc); 801 return getColumnNumber(LocInfo.first, LocInfo.second, Invalid); 802 } 803 804 unsigned SourceManager::getInstantiationColumnNumber(SourceLocation Loc, 805 bool *Invalid) const { 806 if (isInvalid(Loc, Invalid)) return 0; 807 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 808 return getColumnNumber(LocInfo.first, LocInfo.second, Invalid); 809 } 810 811 static LLVM_ATTRIBUTE_NOINLINE void 812 ComputeLineNumbers(Diagnostic &Diag, ContentCache *FI, 813 llvm::BumpPtrAllocator &Alloc, 814 const SourceManager &SM, bool &Invalid); 815 static void ComputeLineNumbers(Diagnostic &Diag, ContentCache *FI, 816 llvm::BumpPtrAllocator &Alloc, 817 const SourceManager &SM, bool &Invalid) { 818 // Note that calling 'getBuffer()' may lazily page in the file. 819 const MemoryBuffer *Buffer = FI->getBuffer(Diag, SM, SourceLocation(), 820 &Invalid); 821 if (Invalid) 822 return; 823 824 // Find the file offsets of all of the *physical* source lines. This does 825 // not look at trigraphs, escaped newlines, or anything else tricky. 826 std::vector<unsigned> LineOffsets; 827 828 // Line #1 starts at char 0. 829 LineOffsets.push_back(0); 830 831 const unsigned char *Buf = (const unsigned char *)Buffer->getBufferStart(); 832 const unsigned char *End = (const unsigned char *)Buffer->getBufferEnd(); 833 unsigned Offs = 0; 834 while (1) { 835 // Skip over the contents of the line. 836 // TODO: Vectorize this? This is very performance sensitive for programs 837 // with lots of diagnostics and in -E mode. 838 const unsigned char *NextBuf = (const unsigned char *)Buf; 839 while (*NextBuf != '\n' && *NextBuf != '\r' && *NextBuf != '\0') 840 ++NextBuf; 841 Offs += NextBuf-Buf; 842 Buf = NextBuf; 843 844 if (Buf[0] == '\n' || Buf[0] == '\r') { 845 // If this is \n\r or \r\n, skip both characters. 846 if ((Buf[1] == '\n' || Buf[1] == '\r') && Buf[0] != Buf[1]) 847 ++Offs, ++Buf; 848 ++Offs, ++Buf; 849 LineOffsets.push_back(Offs); 850 } else { 851 // Otherwise, this is a null. If end of file, exit. 852 if (Buf == End) break; 853 // Otherwise, skip the null. 854 ++Offs, ++Buf; 855 } 856 } 857 858 // Copy the offsets into the FileInfo structure. 859 FI->NumLines = LineOffsets.size(); 860 FI->SourceLineCache = Alloc.Allocate<unsigned>(LineOffsets.size()); 861 std::copy(LineOffsets.begin(), LineOffsets.end(), FI->SourceLineCache); 862 } 863 864 /// getLineNumber - Given a SourceLocation, return the spelling line number 865 /// for the position indicated. This requires building and caching a table of 866 /// line offsets for the MemoryBuffer, so this is not cheap: use only when 867 /// about to emit a diagnostic. 868 unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos, 869 bool *Invalid) const { 870 ContentCache *Content; 871 if (LastLineNoFileIDQuery == FID) 872 Content = LastLineNoContentCache; 873 else 874 Content = const_cast<ContentCache*>(getSLocEntry(FID) 875 .getFile().getContentCache()); 876 877 // If this is the first use of line information for this buffer, compute the 878 /// SourceLineCache for it on demand. 879 if (Content->SourceLineCache == 0) { 880 bool MyInvalid = false; 881 ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid); 882 if (Invalid) 883 *Invalid = MyInvalid; 884 if (MyInvalid) 885 return 1; 886 } else if (Invalid) 887 *Invalid = false; 888 889 // Okay, we know we have a line number table. Do a binary search to find the 890 // line number that this character position lands on. 891 unsigned *SourceLineCache = Content->SourceLineCache; 892 unsigned *SourceLineCacheStart = SourceLineCache; 893 unsigned *SourceLineCacheEnd = SourceLineCache + Content->NumLines; 894 895 unsigned QueriedFilePos = FilePos+1; 896 897 // FIXME: I would like to be convinced that this code is worth being as 898 // complicated as it is, binary search isn't that slow. 899 // 900 // If it is worth being optimized, then in my opinion it could be more 901 // performant, simpler, and more obviously correct by just "galloping" outward 902 // from the queried file position. In fact, this could be incorporated into a 903 // generic algorithm such as lower_bound_with_hint. 904 // 905 // If someone gives me a test case where this matters, and I will do it! - DWD 906 907 // If the previous query was to the same file, we know both the file pos from 908 // that query and the line number returned. This allows us to narrow the 909 // search space from the entire file to something near the match. 910 if (LastLineNoFileIDQuery == FID) { 911 if (QueriedFilePos >= LastLineNoFilePos) { 912 // FIXME: Potential overflow? 913 SourceLineCache = SourceLineCache+LastLineNoResult-1; 914 915 // The query is likely to be nearby the previous one. Here we check to 916 // see if it is within 5, 10 or 20 lines. It can be far away in cases 917 // where big comment blocks and vertical whitespace eat up lines but 918 // contribute no tokens. 919 if (SourceLineCache+5 < SourceLineCacheEnd) { 920 if (SourceLineCache[5] > QueriedFilePos) 921 SourceLineCacheEnd = SourceLineCache+5; 922 else if (SourceLineCache+10 < SourceLineCacheEnd) { 923 if (SourceLineCache[10] > QueriedFilePos) 924 SourceLineCacheEnd = SourceLineCache+10; 925 else if (SourceLineCache+20 < SourceLineCacheEnd) { 926 if (SourceLineCache[20] > QueriedFilePos) 927 SourceLineCacheEnd = SourceLineCache+20; 928 } 929 } 930 } 931 } else { 932 if (LastLineNoResult < Content->NumLines) 933 SourceLineCacheEnd = SourceLineCache+LastLineNoResult+1; 934 } 935 } 936 937 // If the spread is large, do a "radix" test as our initial guess, based on 938 // the assumption that lines average to approximately the same length. 939 // NOTE: This is currently disabled, as it does not appear to be profitable in 940 // initial measurements. 941 if (0 && SourceLineCacheEnd-SourceLineCache > 20) { 942 unsigned FileLen = Content->SourceLineCache[Content->NumLines-1]; 943 944 // Take a stab at guessing where it is. 945 unsigned ApproxPos = Content->NumLines*QueriedFilePos / FileLen; 946 947 // Check for -10 and +10 lines. 948 unsigned LowerBound = std::max(int(ApproxPos-10), 0); 949 unsigned UpperBound = std::min(ApproxPos+10, FileLen); 950 951 // If the computed lower bound is less than the query location, move it in. 952 if (SourceLineCache < SourceLineCacheStart+LowerBound && 953 SourceLineCacheStart[LowerBound] < QueriedFilePos) 954 SourceLineCache = SourceLineCacheStart+LowerBound; 955 956 // If the computed upper bound is greater than the query location, move it. 957 if (SourceLineCacheEnd > SourceLineCacheStart+UpperBound && 958 SourceLineCacheStart[UpperBound] >= QueriedFilePos) 959 SourceLineCacheEnd = SourceLineCacheStart+UpperBound; 960 } 961 962 unsigned *Pos 963 = std::lower_bound(SourceLineCache, SourceLineCacheEnd, QueriedFilePos); 964 unsigned LineNo = Pos-SourceLineCacheStart; 965 966 LastLineNoFileIDQuery = FID; 967 LastLineNoContentCache = Content; 968 LastLineNoFilePos = QueriedFilePos; 969 LastLineNoResult = LineNo; 970 return LineNo; 971 } 972 973 unsigned SourceManager::getInstantiationLineNumber(SourceLocation Loc, 974 bool *Invalid) const { 975 if (isInvalid(Loc, Invalid)) return 0; 976 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 977 return getLineNumber(LocInfo.first, LocInfo.second); 978 } 979 unsigned SourceManager::getSpellingLineNumber(SourceLocation Loc, 980 bool *Invalid) const { 981 if (isInvalid(Loc, Invalid)) return 0; 982 std::pair<FileID, unsigned> LocInfo = getDecomposedSpellingLoc(Loc); 983 return getLineNumber(LocInfo.first, LocInfo.second); 984 } 985 986 /// getFileCharacteristic - return the file characteristic of the specified 987 /// source location, indicating whether this is a normal file, a system 988 /// header, or an "implicit extern C" system header. 989 /// 990 /// This state can be modified with flags on GNU linemarker directives like: 991 /// # 4 "foo.h" 3 992 /// which changes all source locations in the current file after that to be 993 /// considered to be from a system header. 994 SrcMgr::CharacteristicKind 995 SourceManager::getFileCharacteristic(SourceLocation Loc) const { 996 assert(!Loc.isInvalid() && "Can't get file characteristic of invalid loc!"); 997 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 998 const SrcMgr::FileInfo &FI = getSLocEntry(LocInfo.first).getFile(); 999 1000 // If there are no #line directives in this file, just return the whole-file 1001 // state. 1002 if (!FI.hasLineDirectives()) 1003 return FI.getFileCharacteristic(); 1004 1005 assert(LineTable && "Can't have linetable entries without a LineTable!"); 1006 // See if there is a #line directive before the location. 1007 const LineEntry *Entry = 1008 LineTable->FindNearestLineEntry(LocInfo.first.ID, LocInfo.second); 1009 1010 // If this is before the first line marker, use the file characteristic. 1011 if (!Entry) 1012 return FI.getFileCharacteristic(); 1013 1014 return Entry->FileKind; 1015 } 1016 1017 /// Return the filename or buffer identifier of the buffer the location is in. 1018 /// Note that this name does not respect #line directives. Use getPresumedLoc 1019 /// for normal clients. 1020 const char *SourceManager::getBufferName(SourceLocation Loc, 1021 bool *Invalid) const { 1022 if (isInvalid(Loc, Invalid)) return "<invalid loc>"; 1023 1024 return getBuffer(getFileID(Loc), Invalid)->getBufferIdentifier(); 1025 } 1026 1027 1028 /// getPresumedLoc - This method returns the "presumed" location of a 1029 /// SourceLocation specifies. A "presumed location" can be modified by #line 1030 /// or GNU line marker directives. This provides a view on the data that a 1031 /// user should see in diagnostics, for example. 1032 /// 1033 /// Note that a presumed location is always given as the instantiation point 1034 /// of an instantiation location, not at the spelling location. 1035 PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc) const { 1036 if (Loc.isInvalid()) return PresumedLoc(); 1037 1038 // Presumed locations are always for instantiation points. 1039 std::pair<FileID, unsigned> LocInfo = getDecomposedInstantiationLoc(Loc); 1040 1041 const SrcMgr::FileInfo &FI = getSLocEntry(LocInfo.first).getFile(); 1042 const SrcMgr::ContentCache *C = FI.getContentCache(); 1043 1044 // To get the source name, first consult the FileEntry (if one exists) 1045 // before the MemBuffer as this will avoid unnecessarily paging in the 1046 // MemBuffer. 1047 const char *Filename; 1048 if (C->Entry) 1049 Filename = C->Entry->getName(); 1050 else 1051 Filename = C->getBuffer(Diag, *this)->getBufferIdentifier(); 1052 bool Invalid = false; 1053 unsigned LineNo = getLineNumber(LocInfo.first, LocInfo.second, &Invalid); 1054 if (Invalid) 1055 return PresumedLoc(); 1056 unsigned ColNo = getColumnNumber(LocInfo.first, LocInfo.second, &Invalid); 1057 if (Invalid) 1058 return PresumedLoc(); 1059 1060 SourceLocation IncludeLoc = FI.getIncludeLoc(); 1061 1062 // If we have #line directives in this file, update and overwrite the physical 1063 // location info if appropriate. 1064 if (FI.hasLineDirectives()) { 1065 assert(LineTable && "Can't have linetable entries without a LineTable!"); 1066 // See if there is a #line directive before this. If so, get it. 1067 if (const LineEntry *Entry = 1068 LineTable->FindNearestLineEntry(LocInfo.first.ID, LocInfo.second)) { 1069 // If the LineEntry indicates a filename, use it. 1070 if (Entry->FilenameID != -1) 1071 Filename = LineTable->getFilename(Entry->FilenameID); 1072 1073 // Use the line number specified by the LineEntry. This line number may 1074 // be multiple lines down from the line entry. Add the difference in 1075 // physical line numbers from the query point and the line marker to the 1076 // total. 1077 unsigned MarkerLineNo = getLineNumber(LocInfo.first, Entry->FileOffset); 1078 LineNo = Entry->LineNo + (LineNo-MarkerLineNo-1); 1079 1080 // Note that column numbers are not molested by line markers. 1081 1082 // Handle virtual #include manipulation. 1083 if (Entry->IncludeOffset) { 1084 IncludeLoc = getLocForStartOfFile(LocInfo.first); 1085 IncludeLoc = IncludeLoc.getFileLocWithOffset(Entry->IncludeOffset); 1086 } 1087 } 1088 } 1089 1090 return PresumedLoc(Filename, LineNo, ColNo, IncludeLoc); 1091 } 1092 1093 //===----------------------------------------------------------------------===// 1094 // Other miscellaneous methods. 1095 //===----------------------------------------------------------------------===// 1096 1097 /// \brief Get the source location for the given file:line:col triplet. 1098 /// 1099 /// If the source file is included multiple times, the source location will 1100 /// be based upon the first inclusion. 1101 SourceLocation SourceManager::getLocation(const FileEntry *SourceFile, 1102 unsigned Line, unsigned Col) const { 1103 assert(SourceFile && "Null source file!"); 1104 assert(Line && Col && "Line and column should start from 1!"); 1105 1106 fileinfo_iterator FI = FileInfos.find(SourceFile); 1107 if (FI == FileInfos.end()) 1108 return SourceLocation(); 1109 ContentCache *Content = FI->second; 1110 1111 // If this is the first use of line information for this buffer, compute the 1112 /// SourceLineCache for it on demand. 1113 if (Content->SourceLineCache == 0) { 1114 bool MyInvalid = false; 1115 ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid); 1116 if (MyInvalid) 1117 return SourceLocation(); 1118 } 1119 1120 // Find the first file ID that corresponds to the given file. 1121 FileID FirstFID; 1122 1123 // First, check the main file ID, since it is common to look for a 1124 // location in the main file. 1125 if (!MainFileID.isInvalid()) { 1126 const SLocEntry &MainSLoc = getSLocEntry(MainFileID); 1127 if (MainSLoc.isFile() && MainSLoc.getFile().getContentCache() == Content) 1128 FirstFID = MainFileID; 1129 } 1130 1131 if (FirstFID.isInvalid()) { 1132 // The location we're looking for isn't in the main file; look 1133 // through all of the source locations. 1134 for (unsigned I = 0, N = sloc_entry_size(); I != N; ++I) { 1135 const SLocEntry &SLoc = getSLocEntry(I); 1136 if (SLoc.isFile() && SLoc.getFile().getContentCache() == Content) { 1137 FirstFID = FileID::get(I); 1138 break; 1139 } 1140 } 1141 } 1142 1143 if (FirstFID.isInvalid()) 1144 return SourceLocation(); 1145 1146 if (Line > Content->NumLines) { 1147 unsigned Size = Content->getBuffer(Diag, *this)->getBufferSize(); 1148 if (Size > 0) 1149 --Size; 1150 return getLocForStartOfFile(FirstFID).getFileLocWithOffset(Size); 1151 } 1152 1153 unsigned FilePos = Content->SourceLineCache[Line - 1]; 1154 const char *Buf = Content->getBuffer(Diag, *this)->getBufferStart() + FilePos; 1155 unsigned BufLength = Content->getBuffer(Diag, *this)->getBufferEnd() - Buf; 1156 unsigned i = 0; 1157 1158 // Check that the given column is valid. 1159 while (i < BufLength-1 && i < Col-1 && Buf[i] != '\n' && Buf[i] != '\r') 1160 ++i; 1161 if (i < Col-1) 1162 return getLocForStartOfFile(FirstFID).getFileLocWithOffset(FilePos + i); 1163 1164 return getLocForStartOfFile(FirstFID).getFileLocWithOffset(FilePos + Col - 1); 1165 } 1166 1167 /// Given a decomposed source location, move it up the include/instantiation 1168 /// stack to the parent source location. If this is possible, return the 1169 /// decomposed version of the parent in Loc and return false. If Loc is the 1170 /// top-level entry, return true and don't modify it. 1171 static bool MoveUpIncludeHierarchy(std::pair<FileID, unsigned> &Loc, 1172 const SourceManager &SM) { 1173 SourceLocation UpperLoc; 1174 const SrcMgr::SLocEntry &Entry = SM.getSLocEntry(Loc.first); 1175 if (Entry.isInstantiation()) 1176 UpperLoc = Entry.getInstantiation().getInstantiationLocStart(); 1177 else 1178 UpperLoc = Entry.getFile().getIncludeLoc(); 1179 1180 if (UpperLoc.isInvalid()) 1181 return true; // We reached the top. 1182 1183 Loc = SM.getDecomposedLoc(UpperLoc); 1184 return false; 1185 } 1186 1187 1188 /// \brief Determines the order of 2 source locations in the translation unit. 1189 /// 1190 /// \returns true if LHS source location comes before RHS, false otherwise. 1191 bool SourceManager::isBeforeInTranslationUnit(SourceLocation LHS, 1192 SourceLocation RHS) const { 1193 assert(LHS.isValid() && RHS.isValid() && "Passed invalid source location!"); 1194 if (LHS == RHS) 1195 return false; 1196 1197 std::pair<FileID, unsigned> LOffs = getDecomposedLoc(LHS); 1198 std::pair<FileID, unsigned> ROffs = getDecomposedLoc(RHS); 1199 1200 // If the source locations are in the same file, just compare offsets. 1201 if (LOffs.first == ROffs.first) 1202 return LOffs.second < ROffs.second; 1203 1204 // If we are comparing a source location with multiple locations in the same 1205 // file, we get a big win by caching the result. 1206 if (IsBeforeInTUCache.isCacheValid(LOffs.first, ROffs.first)) 1207 return IsBeforeInTUCache.getCachedResult(LOffs.second, ROffs.second); 1208 1209 // Okay, we missed in the cache, start updating the cache for this query. 1210 IsBeforeInTUCache.setQueryFIDs(LOffs.first, ROffs.first); 1211 1212 // "Traverse" the include/instantiation stacks of both locations and try to 1213 // find a common "ancestor". FileIDs build a tree-like structure that 1214 // reflects the #include hierarchy, and this algorithm needs to find the 1215 // nearest common ancestor between the two locations. For example, if you 1216 // have a.c that includes b.h and c.h, and are comparing a location in b.h to 1217 // a location in c.h, we need to find that their nearest common ancestor is 1218 // a.c, and compare the locations of the two #includes to find their relative 1219 // ordering. 1220 // 1221 // SourceManager assigns FileIDs in order of parsing. This means that an 1222 // includee always has a larger FileID than an includer. While you might 1223 // think that we could just compare the FileID's here, that doesn't work to 1224 // compare a point at the end of a.c with a point within c.h. Though c.h has 1225 // a larger FileID, we have to compare the include point of c.h to the 1226 // location in a.c. 1227 // 1228 // Despite not being able to directly compare FileID's, we can tell that a 1229 // larger FileID is necessarily more deeply nested than a lower one and use 1230 // this information to walk up the tree to the nearest common ancestor. 1231 do { 1232 // If LOffs is larger than ROffs, then LOffs must be more deeply nested than 1233 // ROffs, walk up the #include chain. 1234 if (LOffs.first.ID > ROffs.first.ID) { 1235 if (MoveUpIncludeHierarchy(LOffs, *this)) 1236 break; // We reached the top. 1237 1238 } else { 1239 // Otherwise, ROffs is larger than LOffs, so ROffs must be more deeply 1240 // nested than LOffs, walk up the #include chain. 1241 if (MoveUpIncludeHierarchy(ROffs, *this)) 1242 break; // We reached the top. 1243 } 1244 } while (LOffs.first != ROffs.first); 1245 1246 // If we exited because we found a nearest common ancestor, compare the 1247 // locations within the common file and cache them. 1248 if (LOffs.first == ROffs.first) { 1249 IsBeforeInTUCache.setCommonLoc(LOffs.first, LOffs.second, ROffs.second); 1250 return IsBeforeInTUCache.getCachedResult(LOffs.second, ROffs.second); 1251 } 1252 1253 // There is no common ancestor, most probably because one location is in the 1254 // predefines buffer or an AST file. 1255 // FIXME: We should rearrange the external interface so this simply never 1256 // happens; it can't conceptually happen. Also see PR5662. 1257 IsBeforeInTUCache.setQueryFIDs(FileID(), FileID()); // Don't try caching. 1258 1259 // Zip both entries up to the top level record. 1260 while (!MoveUpIncludeHierarchy(LOffs, *this)) /*empty*/; 1261 while (!MoveUpIncludeHierarchy(ROffs, *this)) /*empty*/; 1262 1263 // If exactly one location is a memory buffer, assume it preceeds the other. 1264 1265 // Strip off macro instantation locations, going up to the top-level File 1266 // SLocEntry. 1267 bool LIsMB = getFileEntryForID(LOffs.first) == 0; 1268 bool RIsMB = getFileEntryForID(ROffs.first) == 0; 1269 if (LIsMB != RIsMB) 1270 return LIsMB; 1271 1272 // Otherwise, just assume FileIDs were created in order. 1273 return LOffs.first < ROffs.first; 1274 } 1275 1276 /// PrintStats - Print statistics to stderr. 1277 /// 1278 void SourceManager::PrintStats() const { 1279 llvm::errs() << "\n*** Source Manager Stats:\n"; 1280 llvm::errs() << FileInfos.size() << " files mapped, " << MemBufferInfos.size() 1281 << " mem buffers mapped.\n"; 1282 llvm::errs() << SLocEntryTable.size() << " SLocEntry's allocated, " 1283 << NextOffset << "B of Sloc address space used.\n"; 1284 1285 unsigned NumLineNumsComputed = 0; 1286 unsigned NumFileBytesMapped = 0; 1287 for (fileinfo_iterator I = fileinfo_begin(), E = fileinfo_end(); I != E; ++I){ 1288 NumLineNumsComputed += I->second->SourceLineCache != 0; 1289 NumFileBytesMapped += I->second->getSizeBytesMapped(); 1290 } 1291 1292 llvm::errs() << NumFileBytesMapped << " bytes of files mapped, " 1293 << NumLineNumsComputed << " files with line #'s computed.\n"; 1294 llvm::errs() << "FileID scans: " << NumLinearScans << " linear, " 1295 << NumBinaryProbes << " binary.\n"; 1296 } 1297 1298 ExternalSLocEntrySource::~ExternalSLocEntrySource() { } 1299