gpt4 book ai didi

gcc - 创建自定义 gcc 属性以检测特定函数 : whitelisting, 未列入黑名单

转载 作者:行者123 更新时间:2023-12-04 14:18:50 24 4
gpt4 key购买 nike

我正在使用 gcc 的 -finstrument-functions 选项。为了尽量减少开销,我只想检测几个函数。但是,gcc 只允许您将函数列入黑名单(使用 no_instrument_function 属性,或通过提供路径列表)。它不允许您白名单函数。

所以我写了一个小的 gcc 插件,添加了一个 instrument_function 属性。这让我可以为特定函数设置检测“标志”(或者更确切地说,清除无检测标志):

tree handle_instrument_function_attribute(
tree * node,
tree name,
tree args,
int flags,
bool * no_add_attrs)
{
tree decl = *node;
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(decl) = 0;
return NULL_TREE;
}

但是,根据我的理解,这是行不通的。查看 gcc 源代码,要使此标志真正发挥作用,您还需要使用 -finstrument-functions。参见 gcc/gimplify.c:14436 :

...
/* If we're instrumenting function entry/exit, then prepend the call to
the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
catch the exit hook. */
/* ??? Add some way to ignore exceptions for this TFE. */
if (flag_instrument_function_entry_exit
&& !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
/* Do not instrument extern inline functions. */
&& !(DECL_DECLARED_INLINE_P (fndecl)
&& DECL_EXTERNAL (fndecl)
&& DECL_DISREGARD_INLINE_LIMITS (fndecl))
&& !flag_instrument_functions_exclude_p (fndecl))
...

它首先检查全局 -finstrument-functions 标志是否启用。然后它检查特定功能的标志,据我所知,默认情况下启用该标志。因此,所有其他没有我的 instrument_function 属性的函数仍将被检测。

有没有一种方法可以先为所有函数清除此标志,然后处理我的 instrument_function 属性以仅为这些函数设置标志?

最佳答案

诀窍只是定义属性,但实际上并没有使用任何处理函数,而是在其他地方进行处理。

我们仍然使用 -finstrument-functions 首先为所有函数启用检测。我们可以为 PLUGIN_FINISH_PARSE_FUNCTION 注册一个回调,它会检查所有内容。对于每个函数声明,它都会检查其属性。如果它有 instrument_function 属性,它会像往常一样设置仪器的标志,以便稍后添加。如果函数没有该属性,它会清除标志。

#include <stdio.h>

#include "gcc-plugin.h"
#include "plugin-version.h"
#include "tree.h"

int plugin_is_GPL_compatible;

static struct plugin_info info = {
"0.0.1",
"This plugin provides the instrument_function attribute.",
};

static struct attribute_spec instrument_function_attr =
{
"instrument_function",
0,
-1,
false,
false,
false,
NULL, // No need for a handling function
};

static void register_attributes(void * event_data, void * data)
{
register_attribute(&instrument_function_attr);
}

void handle(void * event_data, void * data)
{
tree fndecl = (tree) event_data;
// Make sure it's a function
if (TREE_CODE(fndecl) == FUNCTION_DECL)
{
// If the function has our attribute, enable instrumentation,
// otherwise explicitly disable it
if (lookup_attribute("instrument_function", DECL_ATTRIBUTES(fndecl)) != NULL_TREE)
{
printf("instrument_function: (%s:%d) %s\n",
DECL_SOURCE_FILE(fndecl),
DECL_SOURCE_LINE(fndecl),
get_name(fndecl));
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(fndecl) = 0;
}
else
{
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(fndecl) = 1;
}
}
}

int plugin_init(
struct plugin_name_args * plugin_info,
struct plugin_gcc_version * version)
{
register_callback(
plugin_info->base_name,
PLUGIN_INFO,
NULL,
&info);

register_callback(
plugin_info->base_name,
PLUGIN_FINISH_PARSE_FUNCTION,
handle,
NULL);

register_callback(
plugin_info->base_name,
PLUGIN_ATTRIBUTES,
register_attributes,
NULL);
return 0;
}

关于gcc - 创建自定义 gcc 属性以检测特定函数 : whitelisting, 未列入黑名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57239704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com