Как LLDB находит встроенные функции? - PullRequest
1 голос
/ 20 апреля 2020

При установке точки останова путем указания имени символа lldb не только разрешает этот символ, но и находит, где функция использовалась встроенной. Как это возможно?

1: name = 'my_func', locations = 4, resolved = 1, hit count = 1
  1.1: where = kernel.development`my_func + 6 at task.c:17, address = 0xxxx, resolved, hit count = 0 
  1.2: where = kernel.development`func_foo + 119 [inlined] my_func at task.c:22, address = 0xxxx, unresolved, hit count = 0  Options: disabled 
  1.3: where = kernel.development`func_bar + 95 [inlined] my_func at task.c:65, address = 0xxxx, unresolved, hit count = 1  Options: disabled 

Глядя на источник LLDB, я мог только найти, где он проверял, встроен ли определенный блок: //source/API/SBBlock.cpp

bool SBBlock::IsInlined() const {
  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsInlined);

  if (m_opaque_ptr)
    return m_opaque_ptr->GetInlinedFunctionInfo() != nullptr;
  return false;
}

1 Ответ

0 голосов
/ 21 апреля 2020

Тестовый случай LLDB в split-dwarf-inlining.cpp подтверждает, что DWARF отладочная информация используется для поиска встроенных функций.

// RUN: %clangxx -target x86_64-pc-linux -gsplit-dwarf -fsplit-dwarf-inlining \
// RUN:   -c %s -o %t
// RUN: %lldb %t -o "breakpoint set -n foo" -b | FileCheck %s

// CHECK: Breakpoint 1: 2 locations

__attribute__((always_inline)) int foo(int x) { return x; }
int bar(int x) { return foo(x); }
...