diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-12-13 02:59:15 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-12-13 02:59:15 +0000 |
commit | 663601cca6802db04fb161ae3d724673748fee8f (patch) | |
tree | e7fcbb09ace6d037b4c180e573bdbf68fd944b9f /lib/Debugger/SourceFile.cpp | |
parent | 5af46883f27eb66ada1ca01e011e80bfb838f08e (diff) |
For PR351: \
* Get file information from a MappedFile instance \
* Convert file type tests to sys::Path form
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18854 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Debugger/SourceFile.cpp')
-rw-r--r-- | lib/Debugger/SourceFile.cpp | 55 |
1 files changed, 9 insertions, 46 deletions
diff --git a/lib/Debugger/SourceFile.cpp b/lib/Debugger/SourceFile.cpp index f0bd0d8a22..9dc0a9616f 100644 --- a/lib/Debugger/SourceFile.cpp +++ b/lib/Debugger/SourceFile.cpp @@ -20,56 +20,19 @@ #include <unistd.h> using namespace llvm; -/// readFile - Load Filename into FileStart and FileEnd. +/// readFile - Load Filename /// void SourceFile::readFile() { - ssize_t FileSize = getFileSize(Filename); - if (FileSize != -1) { - FDHandle FD(open(Filename.c_str(), O_RDONLY)); - if (FD != -1) { - char *FilePos = new char[FileSize]; - FileStart = FilePos; - - // If this takes a long time, inform the user what we are doing. - SlowOperationInformer SOI("loading source file '" + Filename + "'"); - - try { - // Read in the whole buffer. - unsigned Amount = FileSize; - while (Amount) { - unsigned AmountToRead = 512*1024; - if (Amount < AmountToRead) AmountToRead = Amount; - ssize_t ReadAmount = read(FD, FilePos, AmountToRead); - if (ReadAmount < 0 && errno == EINTR) - continue; - else if (ReadAmount <= 0) { - // Couldn't read whole file just free memory and continue. - throw "Error reading file '" + Filename + "'!"; - } - Amount -= ReadAmount; - FilePos += ReadAmount; - - SOI.progress(FileSize-Amount, FileSize); - } - - } catch (const std::string &Msg) { - std::cout << Msg << "\n"; - // If the user cancels the operation, clean up after ourselves. - delete [] FileStart; - FileStart = 0; - return; - } - - FileEnd = FileStart+FileSize; - } - } + File.map(); } /// calculateLineOffsets - Compute the LineOffset vector for the current file. /// void SourceFile::calculateLineOffsets() const { assert(LineOffset.empty() && "Line offsets already computed!"); - const char *BufPtr = FileStart; + const char *BufPtr = File.charBase(); + const char *FileStart = BufPtr; + const char *FileEnd = FileStart + File.size(); do { LineOffset.push_back(BufPtr-FileStart); @@ -93,19 +56,19 @@ void SourceFile::calculateLineOffsets() const { void SourceFile::getSourceLine(unsigned LineNo, const char *&LineStart, const char *&LineEnd) const { LineStart = LineEnd = 0; - if (FileStart == 0) return; // Couldn't load file, return null pointers + if (!File.isMapped()) return; // Couldn't load file, return null pointers if (LineOffset.empty()) calculateLineOffsets(); // Asking for an out-of-range line number? if (LineNo >= LineOffset.size()) return; // Otherwise, they are asking for a valid line, which we can fulfill. - LineStart = FileStart+LineOffset[LineNo]; + LineStart = File.charBase()+LineOffset[LineNo]; if (LineNo+1 < LineOffset.size()) - LineEnd = FileStart+LineOffset[LineNo+1]; + LineEnd = File.charBase()+LineOffset[LineNo+1]; else - LineEnd = FileEnd; + LineEnd = File.charBase() + File.size(); // If the line ended with a newline, strip it off. while (LineEnd != LineStart && (LineEnd[-1] == '\n' || LineEnd[-1] == '\r')) |