Skip to content

Commit 47a7662

Browse files
committed
[llvm-objdump] Fix split of source lines; don't ltrim source lines
If the file does not end with a newline, it may be dropped. Fix the splitting algorithm. Also delete an unnecessary SourceCache lookup. llvm-svn: 357858
1 parent af7314b commit 47a7662

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

llvm/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77
; RUN: llvm-objdump -dS %t.o >%t3
88
; RUN: cmp %t0 %t1
99
; RUN: cmp %t2 %t3
10-
; RUN: FileCheck --input-file %t0 --check-prefix="LINES" %t.ll
11-
; RUN: FileCheck --input-file %t1 --check-prefix="LINES" %t.ll
12-
; RUN: FileCheck --input-file %t2 --check-prefix="SOURCE" %t.ll
13-
; RUN: FileCheck --input-file %t3 --check-prefix="SOURCE" %t.ll
10+
; RUN: FileCheck --check-prefix=LINES %t.ll < %t0
11+
; RUN: FileCheck --check-prefix=SOURCE --strict-whitespace %t.ll < %t2
1412
; ModuleID = 'source-interleave-x86_64.bc'
1513
source_filename = "source-interleave-x86_64.c"
1614
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
@@ -79,3 +77,4 @@ attributes #1 = { nounwind readnone }
7977

8078
; SOURCE: main:
8179
; SOURCE-NEXT: ; int main() {
80+
; SOURCE: ; int *b = &a;

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -522,17 +522,17 @@ bool SourcePrinter::cacheSource(const DILineInfo &LineInfo) {
522522
Buffer = std::move(*BufferOrError);
523523
}
524524
// Chomp the file to get lines
525-
size_t BufferSize = Buffer->getBufferSize();
526-
const char *BufferStart = Buffer->getBufferStart();
527-
for (const char *Start = BufferStart, *End = BufferStart;
528-
End < BufferStart + BufferSize; End++)
529-
if (*End == '\n' || End == BufferStart + BufferSize - 1 ||
530-
(*End == '\r' && *(End + 1) == '\n')) {
531-
LineCache[LineInfo.FileName].push_back(StringRef(Start, End - Start));
532-
if (*End == '\r')
533-
End++;
534-
Start = End + 1;
525+
const char *BufferStart = Buffer->getBufferStart(),
526+
*BufferEnd = Buffer->getBufferEnd();
527+
std::vector<StringRef> &Lines = LineCache[LineInfo.FileName];
528+
const char *Start = BufferStart;
529+
for (const char *I = BufferStart; I != BufferEnd; ++I)
530+
if (*I == '\n') {
531+
Lines.emplace_back(Start, I - Start - (BufferStart < I && I[-1] == '\r'));
532+
Start = I + 1;
535533
}
534+
if (Start < BufferEnd)
535+
Lines.emplace_back(Start, BufferEnd - Start);
536536
SourceCache[LineInfo.FileName] = std::move(Buffer);
537537
return true;
538538
}
@@ -560,16 +560,12 @@ void SourcePrinter::printSourceLine(raw_ostream &OS,
560560
if (SourceCache.find(LineInfo.FileName) == SourceCache.end())
561561
if (!cacheSource(LineInfo))
562562
return;
563-
auto FileBuffer = SourceCache.find(LineInfo.FileName);
564-
if (FileBuffer != SourceCache.end()) {
565-
auto LineBuffer = LineCache.find(LineInfo.FileName);
566-
if (LineBuffer != LineCache.end()) {
567-
if (LineInfo.Line > LineBuffer->second.size())
568-
return;
569-
// Vector begins at 0, line numbers are non-zero
570-
OS << Delimiter << LineBuffer->second[LineInfo.Line - 1].ltrim()
571-
<< "\n";
572-
}
563+
auto LineBuffer = LineCache.find(LineInfo.FileName);
564+
if (LineBuffer != LineCache.end()) {
565+
if (LineInfo.Line > LineBuffer->second.size())
566+
return;
567+
// Vector begins at 0, line numbers are non-zero
568+
OS << Delimiter << LineBuffer->second[LineInfo.Line - 1] << '\n';
573569
}
574570
}
575571
OldLineInfo = LineInfo;

0 commit comments

Comments
 (0)