添加传递给gcc?

时间:2009-04-08 20:17:28

标签: c gcc compiler-construction

有没有人给gcc添加传球?或者不是真正的通行证,但添加一个选项来做一些讨厌的事情... :-) ...

在从另一个函数返回之前调用函数仍然存在同样的问题...所以我想通过在gcc中实现一些东西来研究它...

干杯。

编辑:向编译器添加传递意味着重新访问树以执行某些优化或某些分析。我想模仿__cyg_profile_func_exit的行为,但仅限于某些函数,并且能够访问原始返回值。

所以我打算尝试增强我的问题。我想模仿真正基本的AOSD行为。 AOSD或面向方面的编程可以增加横切关注点(调试是一个贯穿各领域的问题)。

int main(int argc, char ** argv) {
  return foo(argc);
}

int foo(int arg_num) { 
   int result = arg_num > 3 ? arg_num : 42;
   return result;
}

int dbg(int returned) {
   printf("Return %d", returned);
}

我想能够说,我想在执行foo函数后触发dbg函数。问题是如何告诉编译器修改控制流并执行dbg。 dbg应该在return和foo之间执行(argc)...

这与__cyg_profile_function_exit非常相似,但仅在某些情况下(__ cyg_profile_function_exit中的问题是您无法轻易查看和修改返回的值)。

6 个答案:

答案 0 :(得分:4)

如果您仍然有兴趣添加GCC通行证,您可以开始阅读GCC Wiki材料:

答案 1 :(得分:3)

仅供将来参考:即将推出的gcc版本(4.4.0+)将提供对plugins的支持,专门针对用例,例如将optimization passes添加到编译器而无需引导整个编译器

  

2009年5月6日:GCC现在可以在支持动态可加载对象的主机平台上使用通用插件框架进行扩展。   (见gcc.gnu.org

答案 2 :(得分:1)

回答你的问题:gcc是一个非常受欢迎的编译器平台,可用于编译器研究,所以是的,我确信有人已经完成了它。

但是,我不认为这是在周末完成的事情。加入gcc的代码生成并不是你周末要做的事情。 (我不确定你的范围是什么以及你愿意投入多少时间。)如果你真的想破解gcc去做你想做的事情,那么你肯定想从一个gcc开始讨论它。 mailing lists

提示:不要认为人们已经阅读了您的其他问题。如果您想引用一个问题,请在需要的时候添加一个链接。

答案 3 :(得分:1)

这是一个有趣的问题。我将解决围绕这个问题的概念,而不是直接回答这个问题,因为,我对gcc内部结构的了解不多。

您可能已经探索过一些更高级别的源代码操作来实现您想要实现的目标;某种

int main(int argc, char ** argv) {
    return dbg(foo(argc));
}

可能在函数“foo”上插入了一个宏。但是,如果您正在寻找编译器hack,那么您可能不想修改源代码。

有一些gcc扩展讨论here听起来有点像你想要的。如果gcc有任何你想要的东西,它可能会记录在文档的C语言extensions区域。我无法找到任何东西,听起来完全像你所描述的东西,但也许是因为你最了解你在寻找什么,你就会知道如何更好地找到它。

gdb脚本可以很好地输出调试,但听起来你的计划比简单地做printf更大。在代码中插入重要的逻辑似乎就是你所追求的。

这让我想起了我最近遇到的一些动态链接技巧。库interposing可以在函数调用周围插入代码,而不会影响原始源。我遇到的例子是在Solaris上,但在其他平台上可能有模拟。

刚刚遇到记录为here

的-finstrument-functions选项

<强> -finstrument函数

生成用于进入和退出函数的检测调用。就在功能之后   在函数退出之前,将调用以下分析函数   使用当前函数的地址及其调用站点。 (在某些平台上,   __builtin_return_address不能超出当前函数,因此调用站点   否则,信息可能无法用于分析功能。)

          void __cyg_profile_func_enter (void *this_fn,
                                         void *call_site);
          void __cyg_profile_func_exit  (void *this_fn,
                                         void *call_site);

但我想这不起作用,因为你无法修改分析函数的返回值。

答案 4 :(得分:1)

您需要使用GCC吗? LLVM看起来会起作用。它是用C ++编写的,write a pass非常容易。

答案 5 :(得分:0)

GCC,即GNU编译器集合,是一个大型套件,我不认为破解其源代码是您在单个应用程序中查找问题的答案。

听起来你看起来更像是调试或分析工具,例如gdb及其各种前端(xgdb,ddd)和gprof。如果这是一个内存或指针问题,内存/边界检查工具,如电围栏,glibc的memcheck,valgrind和mudflap可能会有所帮助。为警告和较新的C标准启用编译器标志可能很有用-std=c99 -Wall -pedantic

我无法理解你的意思

  

我仍然有同样的问题   刚刚调用函数   从另一个回来。

所以我不确定你在寻找什么。你能给出一个简单或伪代码的例子吗?

即。

#include <stdio.h>
void a(void) {
   b();
}
void b(void) {
   printf("Hello World\n");
}
int main(int ac, char *av[]) {
   a();
   return 0;
}