使用GCC和&amp ;;生成一个全面的调用图埃及

时间:2012-04-17 02:17:32

标签: linux gcc static-libraries call-graph

我正在尝试生成一个全面的调用图(完成对Linux,运行时,批次的低级调用)。

我已经使用“-fdump-rtl-expand”静态编译了我的源文件并创建了RTL文件,我将其传递给名为Egypt的PERL脚本(我相信是Graphviz / Dot)并生成了调用图的PDF文件。这完美无缺,完全没问题。

除此之外,还有一些调用显示为内置的库。我正在寻找是否有一种方法可以将调用图打印为不相同而是将实际调用写入库中?

如果问题不清楚,请告诉我。

http://i.imgur.com/sp58v.jpg

基本上,我试图避免调用图生成<内置>

有办法吗?

-------- CODE ---------

#include <cilk/cilk.h>
#include <stdio.h>
#include <stdlib.h>

unsigned long int t0, t5;
unsigned int NOSPAWN_THRESHOLD = 32;

int fib_nospawn(int n)
{
  if (n < 2) 
    return n;
  else 
    {
      int x = fib_nospawn(n-1);
      int y = fib_nospawn(n-2);
      return x + y;
    }
}

// spawning fibonacci function
int fib(long int n)
{
  long int x, y;
  if (n < 2) 
    return n;
  else if (n <= NOSPAWN_THRESHOLD)
    {
      x = fib_nospawn(n-1);
      y = fib_nospawn(n-2);
      return x + y;
    }
  else 
    {
      x = cilk_spawn fib(n-1);
      y = cilk_spawn fib(n-2);
      cilk_sync;
      return x + y;
    }
}

int main(int argc, char *argv[])
{
  int n;
  long int result;
  long int exec_time;

  n = atoi(argv[1]);
  NOSPAWN_THRESHOLD = atoi(argv[2]);
  result = fib(n);

  printf("%ld\n", result);
  return 0;
}

我从源代码编译了Cilk库。

2 个答案:

答案 0 :(得分:4)

我可能已经找到问题的部分解决方案

您需要将以下选项传递给埃及

--include-external

这产生了一个稍微全面的调用图,尽管仍有“可见

http://i.imgur.com/GWPJO.jpg?1

如果我在调用图中获得更多深度,有人可以建议吗?

答案 1 :(得分:0)

您可以使用GCC VCG Plugin:一个gcc插件,可以在调试gcc时加载,以图形方式显示内部结构。

gcc -fplugin=/path/to/vcg_plugin.so -fplugin-arg-vcg_plugin-cgraph foo.c

调用图是存储所需数据的地方 进行程序间优化。所有数据结构 分为三个部分: 分析时产生的local_info 作为结果的函数global_info 最后的呼叫图的全局行走 编译和RTL使用的rtl_info 后端传播已编译的数据 对他们的来电者起作用。