ROSE 在源文件的include语句之前插入语句

问题

今天,在使用ROSE自动生成CUDA代码时,遇到一个问题:程序中需要使用纹理存储器对GPU访存进行加速,相应地要生成texture变量声明的代码。由于texture初始化时使用到一个宏,该宏定义在文件头部,这就使得texture的初始化必须在宏定义之后。翻遍了手册,找不到把语句插入preprocessinfo 结点(include,#define )之后的方法,于是退一步打算找到当前scope中第一个语句,然后插到该语句之后。本打算调用firststatement的方法,报错,并且scope中的statement并不全是源码中的语句,会包含一些头文件中的结点。

解决方法

通过比较scope和scope中语句的名字,找到当前源文件中第一个SgStatement

1
2
3
4
5
6
7
8
9
10
11
12
13
 //find the first statement of current source file
  SgStatement* firststatement=NULL;
  SgStatementPtrList statelist=currentscope->generateStatementList();
  for(int i=0;i<statelist.size();i++)
  {
  SgStatement* tmp=statelist[i];
  if(tmp->get_file_info()->get_filenameString()==currentscope->get_file_info()->get_filenameString())
    {
    firststatement=tmp;
    break;
    }
   }
                                                                     }