diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -867,8 +867,11 @@ Row.Address = Address; RowIter FirstRow = Rows.begin() + Seq.FirstRowIndex; RowIter LastRow = Rows.begin() + Seq.LastRowIndex; - LineTable::RowIter RowPos = std::lower_bound( + // In some cases, e.g. first instruction in a function, the compiler generates + // two entries, both with the same address. We want the last one. + LineTable::RowIter RowPos = std::upper_bound( FirstRow, LastRow, Row, DWARFDebugLine::Row::orderByAddress); + --RowPos; if (RowPos == LastRow) { return Seq.LastRowIndex - 1; } diff --git a/llvm/test/tools/llvm-symbolizer/fission-ranges.test b/llvm/test/tools/llvm-symbolizer/fission-ranges.test --- a/llvm/test/tools/llvm-symbolizer/fission-ranges.test +++ b/llvm/test/tools/llvm-symbolizer/fission-ranges.test @@ -1,4 +1,4 @@ RUN: llvm-symbolizer --obj=%p/Inputs/fission-ranges.elf-x86_64 0x720 | FileCheck %s CHECK: main -CHECK-NEXT: {{.*}}fission-ranges.cc:6 +CHECK-NEXT: {{.*}}fission-ranges.cc:2 diff --git a/llvm/test/tools/llvm-symbolizer/sym-verbose.test b/llvm/test/tools/llvm-symbolizer/sym-verbose.test --- a/llvm/test/tools/llvm-symbolizer/sym-verbose.test +++ b/llvm/test/tools/llvm-symbolizer/sym-verbose.test @@ -19,8 +19,8 @@ #CHECK-NEXT: foo #CHECK-NEXT: Filename: /tmp{{[\\/]}}discrim.c #CHECK-NEXT: Function start line: 4 -#CHECK-NEXT: Line: 9 -#CHECK-NEXT: Column: 0 +#CHECK-NEXT: Line: 5 +#CHECK-NEXT: Column: 7 #CHECK-NEXT: main #CHECK-NEXT: Filename: /tmp{{[\\/]}}discrim.c #CHECK-NEXT: Function start line: 9