加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在AssignOp之后在ROSE编译器中分配插入

发布时间:2020-12-16 07:12:33 所属栏目:百科 来源:网络整理
导读:最近我一直在使用ROSE编译器,我能够将一些代码插入C源并获得成功的输出.但是,在访问SgAssignOps时,我无法插入赋值语句.这是我的代码的简化版本,以显示问题: #include "rose.h"#include iostream#include transformationSupport.husing namespace SageInterf
最近我一直在使用ROSE编译器,我能够将一些代码插入C源并获得成功的输出.但是,在访问SgAssignOps时,我无法插入赋值语句.这是我的代码的简化版本,以显示问题:

#include "rose.h"
#include <iostream>
#include <transformationSupport.h>
using namespace SageInterface;
using namespace SageBuilder;
using namespace std;

int main (int argc,char *argv[])
{
    SgProject *project = frontend (argc,argv);

    // Find all Assignment operations
    std::vector<SgNode* > assignOpList = NodeQuery::querySubTree (project,V_SgAssignOp);

    std::vector<SgNode*>::iterator iter;

    for (iter = assignOpList.begin(); iter!= assignOpList.end(); iter++) { 

        SgNode * node = (*iter);

        SgStatement * asmStmt = TransformationSupport::getStatement(node);

        //ADD PRAGMA STATEMENT BEFORE       
        ostringstream osPragma;
        osPragma << "example statement";
        SgPragmaDeclaration* pragmaDecl = buildPragmaDeclaration(osPragma.str());
        insertStatementBefore(asmStmt,pragmaDecl);

        //ADD ASSIGNMENT STATEMENT AFTER
        SgExprStatement* newAsmt = buildAssignStatement(buildVarRefExp("a"),buildIntVal(9));
        insertStatementAfter(asmStmt,newAsmt);
    }

    AstTests::runAllTests(project); 
    // Translation only
    project->unparse();
}

一个简单的输入代码:

int main(int argc,char* argv[])
{
    int a;

    a = 3;

    return a;

}

代码编译.然而..

当应用于输入代码时,我得到分段错误,没有错误消息.

如果我删除赋值语句插入,则pragma插入有效.

如果我删除对runAllTests()的调用,我在解析时会收到以下错误消息:

test: /mnt/DATA/rose/src/backend/unparser/nameQualificationSupport.C:4986: virtual NameQualificationInheritedAttribute NameQualificationTraversal::evaluateInheritedAttribute(SgNode*,NameQualificationInheritedAttribute): Assertion `initializedName->get_parent() != __null' failed.
Aborted (core dumped)

请注意,我在此示例和输入代码中使用“a”,因此已经声明了变量.

什么是这样的分配插入的正确方法?

本教程中提供的示例使用主函数体上的作用域并在最后插入它,我需要在另一个作业之后发生.我是否需要将节点上的Scope推送到ScopeStack?如果是这样,那将如何表达?我对推送和弹出范围堆栈方法不是很熟悉.

解决方法

这是旧的,但将来会回答有这个问题的人.

该错误实际上来自于调用buildVarRefExp和buildPragmaDeclaration时的错误.从doxygen可以看出,它们为SgScopeStatement提供了一个可选参数.此范围语句是SageBuilder找到引用的变量(github source)的位置.如果没有给出,则从ScopeStack获取它.但是,如果没有将任何内容推送到ScopeStack并在没有可选参数的情况下调用这些函数,则它不知道在哪里查找.

那么,你的两个解决方案是:

>使用ScopeStack存储SgScopeStatement(例如pushScopeStack)
>将SgScopeStatement作为参数传递给buildVarRefExp和buildPragmaDeclaration.

在具体情况下,您可以这样做:

SgScopeStatement scope = TransformationSupport::getFunctionDeclaration(node)->get_scope();

并用以下内容替换您的SageBuilder语句:

buildPragmaDeclaration(osPragma.str(),scope);
buildVarRefExp("a",scope);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读