我正在尝试获取函数体的整个代码。
我有以下代码
bool VisitFunctionDecl(FunctionDecl *f) {
Stmt *FuncBody = f->getBody();
stringstream SSAfter;
SSAfter << f->getBody();
SourceLocation ST = f->getSourceRange().getBegin();
ST = FuncBody->getLocEnd().getLocWithOffset(1);
TheRewriter.InsertText(ST, SSAfter.str(), true, true);
}
我有以下代码示例
int multiplyOrSum (int a, int b, bool t)
{
int c=0;
if (a<=0){
return 0;
}
if (t){
c= a*b;
}
else {
c = a+b;
}
__asm
{
jz _P01
jnz _P01
// _emit 0e9h
_P01:
}
return (c + multiplyOrSum(a-1, b, t)+ loopOne (-1));
}
用我提供的代码解析后。结果是
int multiplyOrSum (int a, int b, bool t)
{
int c=0;
if (a<=0){
return 0;
}
if (t){
c= a*b;
}
else {
c = a+b;
}
__asm
{
jz _P01
jnz _P01
// _emit 0e9h
_P01:
}
return (c + multiplyOrSum(a-1, b, t)+ loopOne (-1));
}
02053B28
我想要实现的是
int multiplyOrSum (int a, int b, bool t)
{
int c=0;
if (a<=0){
return 0;
}
if (t){
c= a*b;
}
else {
c = a+b;
}
__asm
{
jz _P01
jnz _P01
// _emit 0e9h
_P01:
}
return (c + multiplyOrSum(a-1, b, t)+ loopOne (-1));
}
{
int c=0;
if (a<=0){
return 0;
}
if (t){
c= a*b;
}
else {
c = a+b;
}
__asm
{
jz _P01
jnz _P01
// _emit 0e9h
_P01:
}
return (c + multiplyOrSum(a-1, b, t)+ loopOne (-1));
}
请指教。非常感谢
编辑:基本上我想做的是复制函数体。
编辑 2:
我已经尝试了以下代码,并对我的原始代码进行了一些编辑
bool VisitFunctionDecl(FunctionDecl *f) {
Stmt *FuncBody = f->getBody();
stringstream SSAfter;
SSAfter << f->getBody();
LangOptions LangOpts;
LangOpts.CPlusPlus = true;
PrintingPolicy Policy(LangOpts);
std::string s;
llvm::raw_string_ostream as(s);
FuncBody->printPretty(as, 0, Policy);
SSAfter << as.str() << "\n";
SourceLocation ST = f->getSourceRange().getBegin();
ST = FuncBody->getLocEnd().getLocWithOffset(1);
TheRewriter.InsertText(ST, SSAfter.str(), true, true);
}
我现在的输出是
int multiplyOrSum (int a, int b, bool t)
{
int c=0;
if (a<=0){
return 0;
}
if (t){
c= a*b;
}
else {
c = a+b;
}
__asm
{
jz _P01
jnz _P01
// _emit 0e9h
_P01:
}
return (c + multiplyOrSum(a-1, b, t)+ loopOne (-1));
}
{
int c = 0;
if (a <= 0) {
return 0;
}
}
我将如何获得整个功能?我现在已经拿到了第一部分。但是其余的呢?