使用Clang进行基本的源到源转换

时间:2012-06-18 06:39:25

标签: gcc llvm clang llvm-gcc llvm-clang

我已成功构建sample code

现在我的要求是,如果我有以下示例代码:

int inc(int& p)
{
        p++;
        printf("In inc [%d]\n", p);
        return p;
}
int main()
{
        int i = 0;
        int y,z;
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
        }
        printf("y = [%d] z = [%d]\n", y , z);
        return 0;
}

代码应转换为

int inc(int& p)
{
        p++;
        printf("%s %d", __FILE__, __LINE__);
        printf("In inc [%d]\n", p);
        printf("%s %d", __FILE__, __LINE__);
        return p;
}

int main()
{
        int i = 0;
        printf("%s %d", __FILE__, __LINE__);
        int y,z;
        printf("%s %d", __FILE__, __LINE__);
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
                printf("%s %d", __FILE__, __LINE__);
        }
        printf("y = [%d] z = [%d]\n", y , z);
        printf("%s %d", __FILE__, __LINE__);
        return 0;
}

我尝试了以下代码更改:

bool VisitStmt(Stmt *s) {
    // Only care about If statements.
    if (isa<CompoundStmt>(s)) {
        CompoundStmt *Statement = cast<CompoundStmt>(s);
        TheRewriter.InsertText(Statement->getLocStart(),
                               "printf(\"%s %d\", __FILE__, __LINE__);\n",
                               true, true);
    }

但输出如下:

// Begin function inc returning int
int inc(int& p)
printf("%s %d", __FILE__, __LINE__);
{
        p++;
        printf("In inc [%d]\n", p);
        return p;
}
// End function inc

// Begin function main returning int
int main()
printf("%s %d", __FILE__, __LINE__);
{
        int i = 0;
        int y,z;
        if(y == 0)
                print(inc(i) , inc(i));
        else
        {
                print(inc(i) , inc(i));
        }
        printf("y = [%d] z = [%d]\n", y , z);
        return 0;
}
// End function main

请告诉我如何实现目标?

我也得到如下输出:

test.cpp:4:26: error: use of undeclared identifier 'p'
        printf("In inc [%d]\n", p);
                                ^
test.cpp:5:9: error: use of undeclared identifier 'p'
        return p;

如何停止代码呈现相同?只是复合块中的语句应该添加额外的语句。

2 个答案:

答案 0 :(得分:1)

如果你看一下生成的代码,这是一个非法的混乱。奇怪的是,编译器不会尖叫你的耳朵; - )

显然,LLVM(使用您的VisitStmt)只将“{...}”视为“复合语句”,输出发生在语句本身之前。仔细检查这些穿插动作何时完成(我怀疑是在之前或之后,而不是在中间)。

答案 1 :(得分:0)

如果我理解正确,并且要添加到@vonbrand,则不应使用Compound语句的开头和结尾,因为它们代表语句块。 相反,您应该在通用的VisitStmt主体中插入文本(Print语句)来替换上面的内容。请注意,我不清楚您要完成什么,因为您在if / else语句之后没有紧跟Print语句。 我认为如果您只列出要处理的语句,然后在访问者实现中使用“isa”条件处理每个案例,那将会有所帮助。这样,您实际上正确使用了访问者模式。 希望有所帮助!