From bcaec23c255bfca49179dd226d5e14e4f20b0f46 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 7 Apr 2019 10:16:46 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357858 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../X86/source-interleave-x86_64.ll | 7 ++-- tools/llvm-objdump/llvm-objdump.cpp | 36 +++++++++---------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll b/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll index bea7bf52143..78ce2e1ed10 100644 --- a/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll +++ b/test/tools/llvm-objdump/X86/source-interleave-x86_64.ll @@ -7,10 +7,8 @@ ; RUN: llvm-objdump -dS %t.o >%t3 ; RUN: cmp %t0 %t1 ; RUN: cmp %t2 %t3 -; RUN: FileCheck --input-file %t0 --check-prefix="LINES" %t.ll -; RUN: FileCheck --input-file %t1 --check-prefix="LINES" %t.ll -; RUN: FileCheck --input-file %t2 --check-prefix="SOURCE" %t.ll -; RUN: FileCheck --input-file %t3 --check-prefix="SOURCE" %t.ll +; RUN: FileCheck --check-prefix=LINES %t.ll < %t0 +; RUN: FileCheck --check-prefix=SOURCE --strict-whitespace %t.ll < %t2 ; ModuleID = 'source-interleave-x86_64.bc' source_filename = "source-interleave-x86_64.c" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -79,3 +77,4 @@ attributes #1 = { nounwind readnone } ; SOURCE: main: ; SOURCE-NEXT: ; int main() { +; SOURCE: ; int *b = &a; diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 78e2388596e..dc61acfbfeb 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -522,17 +522,17 @@ bool SourcePrinter::cacheSource(const DILineInfo &LineInfo) { Buffer = std::move(*BufferOrError); } // Chomp the file to get lines - size_t BufferSize = Buffer->getBufferSize(); - const char *BufferStart = Buffer->getBufferStart(); - for (const char *Start = BufferStart, *End = BufferStart; - End < BufferStart + BufferSize; End++) - if (*End == '\n' || End == BufferStart + BufferSize - 1 || - (*End == '\r' && *(End + 1) == '\n')) { - LineCache[LineInfo.FileName].push_back(StringRef(Start, End - Start)); - if (*End == '\r') - End++; - Start = End + 1; + const char *BufferStart = Buffer->getBufferStart(), + *BufferEnd = Buffer->getBufferEnd(); + std::vector &Lines = LineCache[LineInfo.FileName]; + const char *Start = BufferStart; + for (const char *I = BufferStart; I != BufferEnd; ++I) + if (*I == '\n') { + Lines.emplace_back(Start, I - Start - (BufferStart < I && I[-1] == '\r')); + Start = I + 1; } + if (Start < BufferEnd) + Lines.emplace_back(Start, BufferEnd - Start); SourceCache[LineInfo.FileName] = std::move(Buffer); return true; } @@ -560,16 +560,12 @@ void SourcePrinter::printSourceLine(raw_ostream &OS, if (SourceCache.find(LineInfo.FileName) == SourceCache.end()) if (!cacheSource(LineInfo)) return; - auto FileBuffer = SourceCache.find(LineInfo.FileName); - if (FileBuffer != SourceCache.end()) { - auto LineBuffer = LineCache.find(LineInfo.FileName); - if (LineBuffer != LineCache.end()) { - if (LineInfo.Line > LineBuffer->second.size()) - return; - // Vector begins at 0, line numbers are non-zero - OS << Delimiter << LineBuffer->second[LineInfo.Line - 1].ltrim() - << "\n"; - } + auto LineBuffer = LineCache.find(LineInfo.FileName); + if (LineBuffer != LineCache.end()) { + if (LineInfo.Line > LineBuffer->second.size()) + return; + // Vector begins at 0, line numbers are non-zero + OS << Delimiter << LineBuffer->second[LineInfo.Line - 1] << '\n'; } } OldLineInfo = LineInfo; -- 2.40.0