2

我正在用类似 C 的语言编写代码,并且正在使用一个inline实际上倾向于内联的函数。但是,根据编译器添加的调试信息(例如,GCC 添加的 DWARF),内联会维护该函数源中的位置。

是否可以让编译器内联函数的代码,同时将指令归因于内联函数的行?

为了讨论起见,假设我正在编写 C++ 并在 Linux 上使用 GCC 进行编译(尽管更一般的答案值得赞赏。)

(动机与分析有关,您只对您所在的函数进行采样,但不对整个堆栈进行采样。)

4

1 回答 1

0

artificialfunction 属性执行以下操作:

artificial

此属性对于小型内联包装器很有用,如果可能的话,它们应该在调试期间作为一个单元出现。根据调试信息格式,它要么意味着将函数标记为人工,要么将调用者位置用于内联体内的所有指令。

指令的放置__attribute__有点棘手。这是推荐的地方:

inline void __attribute__ ((artificial))
increment (int &i)
{
  ++i;
}

这与 C++ 语法中的地方不同:

[[gnu::artificial]]
inline void
increment (int &i)
{
  ++i;
}

artificial属性被 Clang 和从它派生的编译器识别。

于 2020-12-30T15:41:33.293 回答