【问题标题】:Given a GIMPLE Call statment which has two arguments, I want to add a third one, how?给定一个有两个参数的 GIMPLE Call 语句,我想添加第三个参数,如何?
【发布时间】:2019-09-24 04:12:33
【问题描述】:

我必须做一些 GIMPLE_CALL 语句操作。这个 GIMPLE_CALL 将有两个参数,例如:foo(a,b)。我的目标是将此方法更改为具有三个参数的不同方法,例如动物园(a,b,c)

在我目前的方法中,GCC 在编译示例源程序时崩溃。

当我所做的只是替换方法名称(即不更改参数编号)时,我的代码就可以工作。

另外,我找不到任何专用于为 GIMPLE_CALL 添加/删除参数编号的方法。这让我相信这可能不是正确的方法。

代码:

   //Getting the current number of  Call Arguments from target GIMPLE               
   //statememt
   unsigned num_of_ops = gimple_call_num_args(stmt);

   //Replace the method name to a new Method   
   gimple_call_set_fndecl(stmt, new_method);


   //We need to increment total number of call arguments by 1
   //Total numer of arguments are, Number of CALL Arguments + 3
   //You can confirm this in definitions of gimple_call_num_args() and 
   //gimple_call_set_arg()
   gimple_set_num_ops(stmt,num_of_ops+3+1);


   //Add the new argument
   gimple_call_set_arg(stmt, num_of_ops, third_argument);
   update_stmt (stmt);

【问题讨论】:

    标签: c gcc gimple


    【解决方案1】:

    看来,您只能使用这种方法将num_ops 调整为较小的值。

    gimple_set_num_ops 是一个简单的 setter,它不分配存储空间:

    static inline void
    gimple_set_num_ops (gimple *gs, unsigned num_ops)
    {
      gs->num_ops = num_ops;
    }
    

    您必须创建另一个 GIMPLE 语句。

    我认为,GCC 代码库中的这种用法解决了您遇到的完全相同的问题(来自gcc/gimple.c):

    /* Set the RHS of assignment statement pointed-to by GSI to CODE with
       operands OP1, OP2 and OP3.
    
       NOTE: The statement pointed-to by GSI may be reallocated if it
       did not have enough operand slots.  */
    
    void
    gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
                    tree op1, tree op2, tree op3)
    {
      unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
      gimple *stmt = gsi_stmt (*gsi);
      gimple *old_stmt = stmt;
    
      /* If the new CODE needs more operands, allocate a new statement.  */
      if (gimple_num_ops (stmt) < new_rhs_ops + 1)
        {
          tree lhs = gimple_assign_lhs (old_stmt);
          stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
          memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
          gimple_init_singleton (stmt);
    
          /* The LHS needs to be reset as this also changes the SSA name
         on the LHS.  */
          gimple_assign_set_lhs (stmt, lhs);
        }
    
      gimple_set_num_ops (stmt, new_rhs_ops + 1);
      gimple_set_subcode (stmt, code);
      gimple_assign_set_rhs1 (stmt, op1);
      if (new_rhs_ops > 1)
        gimple_assign_set_rhs2 (stmt, op2);
      if (new_rhs_ops > 2)
        gimple_assign_set_rhs3 (stmt, op3);
      if (stmt != old_stmt)
        gsi_replace (gsi, stmt, false);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多