我已成功构建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;
如何停止代码呈现相同?只是复合块中的语句应该添加额外的语句。
答案 0 :(得分:1)
如果你看一下生成的代码,这是一个非法的混乱。奇怪的是,编译器不会尖叫你的耳朵; - )
显然,LLVM(使用您的VisitStmt)只将“{...}”视为“复合语句”,输出发生在语句本身之前。仔细检查这些穿插动作何时完成(我怀疑是在之前或之后,而不是在中间)。
答案 1 :(得分:0)
如果我理解正确,并且要添加到@vonbrand,则不应使用Compound语句的开头和结尾,因为它们代表语句块。 相反,您应该在通用的VisitStmt主体中插入文本(Print语句)来替换上面的内容。请注意,我不清楚您要完成什么,因为您在if / else语句之后没有紧跟Print语句。 我认为如果您只列出要处理的语句,然后在访问者实现中使用“isa”条件处理每个案例,那将会有所帮助。这样,您实际上正确使用了访问者模式。 希望有所帮助!