opt生成的点调用图中的外部节点和无名节点是什么?

时间:2019-02-14 19:00:17

标签: llvm call-graph

当我用opt -analyze -dot-callgraph生成一个点调用图时,会生成两个“特殊”节点,一个带有名称/标签external node,一个没有分配标签。

这些代表什么?

编辑:在这个愚蠢的示例中:

#include <cstdio>

class Animal
{
public:
    virtual void speak() = 0;
};

class Dog : public Animal
{
public:
    void speak() override { printf("Woof!\n"); }
};

class Cat : public Animal
{
public:
    void speak() override { printf("Meow!\n"); }
};

class Programmer : public Animal
{
public:
    void speak() override { printf("Hello, world!\n"); }
};


int main()
{
    Animal *dog = new Dog;
    Animal *cat = new Cat;
    Animal *guy = new Programmer;

    dog->speak();
    cat->speak();
    guy->speak();

    delete dog;
    delete cat;
    delete guy;
}

当生成一个调用图时,我们会遇到external node调用所有speak实现的情况。为什么呢?只有main呼叫他们;外面的东西怎么能叫他们?

我们还看到main调用了“无名”节点。这是什么意思?

如果我们将speak中纯净的Animal替换为:

virtual void speak() { printf("Generic animal sound!\n"); }

然后,调用图不再显示main调用任何speak函数,但显然会调用它们。

0 个答案:

没有答案