代码之家  ›  专栏  ›  技术社区  ›  LB40

是否向GCC添加通行证?

  •  8
  • LB40  · 技术社区  · 16 年前

    有人给GCC加了通行证吗?或者不是真正的传球,而是增加一个选择去做一些令人讨厌的事情…:-)…

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

    干杯。

    编辑 :向编译器添加传递意味着重新访问树以执行一些优化或分析。我想模拟_uucyg_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应该在返回和foo(argc)之间执行…

    这真的很像ucyg_profile_function_exit,但只是在某些情况下(而cyg_profile_function_exit中的问题是您无法轻松地看到和修改返回值)。

    6 回复  |  直到 16 年前
        1
  •  4
  •   Laurynas Biveinis    16 年前

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

        2
  •  3
  •   none    16 年前

    仅供将来参考:即将发布的GCC版本(4.4.0+)将为 plugins 专门用于诸如添加 optimization passes 到编译器,而不必引导整个编译器。

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

        3
  •  1
  •   JesperE    16 年前

    回答你的问题:GCC是一个非常流行的编译器平台,可以做编译器的研究,所以是的,我相信有人做过。

    不过,我不认为这是周末的事。钩住GCC的代码生成并不是你周末要做的事情。(我不知道你的范围是什么,你愿意投资多少时间。)如果你真的想让GCC做你想做的,你肯定想从GCC的一个讨论开始。 mailing lists .

    小贴士:不要以为别人读过你的其他问题。如果你想引用一个问题,请添加一个链接到它,如果你想让人们找到它。

        4
  •  1
  •   Zifre    16 年前

    你需要使用GCC吗? LLVM 看起来可以用。它是用C++编写的,很容易。 write a pass .

        5
  •  1
  •   veefu    16 年前

    这是一个有趣的问题。我将讨论围绕这个问题的概念,而不是直接回答这个问题,因为,嗯,我对GCC的内部不太了解。

    您可能已经研究了一些更高级的源代码操作,以实现您想要实现的目标;某种

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

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

    讨论了一些GCC扩展 here 听起来有点像你想要的。如果gcc有任何你想做的事情,它可能会被记录在C语言中。 extensions 文档的区域。我找不到任何听起来和你描述的完全一样的东西,但也许因为你最了解你要找的东西,你就会知道如何找到它。

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

    这让我想起了我最近遇到的一些动态链接器技巧。图书馆 interposing 无法在函数调用周围插入代码而不影响原始源。我遇到的例子是在Solaris上,但在其他平台上可能也有类似的例子。

    刚刚看到文档中的-fintrument函数选项 here

    -查找仪器功能

    为函数的入口和出口生成检测调用。就在功能之后 在函数退出之前,将调用以下分析函数 当前函数及其调用站点的地址。(在某些平台上, _内置的返回地址在当前函数之外不起作用,因此调用站点 否则,信息可能无法用于分析函数。)

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

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

        6
  •  0
  •   mctylr    16 年前

    gcc,GNU编译器集合,是一个大的套件,我认为破解它的源代码并不是您在单个应用程序中发现问题的答案。

    听起来您在寻找调试或分析工具,例如 gdb 及其各种前端(XGDB、DDD)和 gprof . 内存/边界检查工具,如电子围栏、glibc's memcheck 瓦尔格林德 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;
    }