foreach (SgBasicBlock *caseBody, newBlocks) {
    SgStatementPtrList &stmts = caseBody->get_statements();
    SgStatement *lastStmt = 0;
    if (!stmts.empty()) {
#if 0
      lastStmt = stmts.back();
#else
      // Skip NullStatements.
      for (int idx = stmts.size() - 1; idx >= 0; idx--) {
        if (!isSgNullStatement(stmts[idx])) {
          lastStmt = stmts[idx];
          break;
        }
      }
#endif
    }

    // Insert HtContinue for a fall-through.
    bool fallsThrough = (lastStmt == 0 || !isSgGotoStatement(lastStmt));
    if (fallsThrough) {
      if (!isSgSwitchStatement(lastStmt) && !isHtThreadControlStmt(lastStmt)) {
        int target = (casenum == newBlocks.size()) ? -1 : casenum + 1;
        callStmt = SageBuilder::buildFunctionCallStmt(
            "HtContinue", SageBuilder::buildVoidType(),
            SageBuilder::buildExprListExp(SageBuilder::buildEnumVal_nfi(target,
            enumDecl, stateToName[target])), funcBody);
        SageInterface::appendStatement(callStmt, caseBody);
      }
      SgStatement *brkStmt = SageBuilder::buildBreakStmt();
      SageInterface::appendStatement(brkStmt, caseBody);
    }

    // Insert HtContinue for each explicit goto.
    std::vector<SgGotoStatement *> gotos = 
        SageInterface::querySubTree<SgGotoStatement>(caseBody,
        V_SgGotoStatement); 
    foreach (SgGotoStatement *ngoto, gotos) {
      int target = labelToState[ngoto->get_label()];
      callStmt = SageBuilder::buildFunctionCallStmt(
          "HtContinue", SageBuilder::buildVoidType(),
          SageBuilder::buildExprListExp(SageBuilder::buildEnumVal_nfi(target,
          enumDecl, stateToName[target])), funcBody);
      SgStatement *brkStmt = SageBuilder::buildBreakStmt();
      SageInterface::insertStatementBefore(ngoto, callStmt);
      SageInterface::replaceStatement(ngoto, brkStmt, true);
    }
示例#2
0
void finishSageAST(ClangToSageTranslator & translator) {
    SgGlobal * global_scope = translator.getGlobalScope();

 // 1 - Label Statements: Move sub-statement after the label statement.

    std::vector<SgLabelStatement *> label_stmts = SageInterface::querySubTree<SgLabelStatement>(global_scope, V_SgLabelStatement);
    std::vector<SgLabelStatement *>::iterator label_stmt_it;
    for (label_stmt_it = label_stmts.begin(); label_stmt_it != label_stmts.end(); label_stmt_it++) {
        SgStatement * sub_stmt = (*label_stmt_it)->get_statement();
        if (!isSgNullStatement(sub_stmt)) {
            SgNullStatement * null_stmt = SageBuilder::buildNullStatement_nfi();
            translator.setCompilerGeneratedFileInfo(null_stmt);
            (*label_stmt_it)->set_statement(null_stmt);
            null_stmt->set_parent(*label_stmt_it);
            SageInterface::insertStatementAfter(*label_stmt_it, sub_stmt);
        }
    }

 // 2 - Place Preprocessor informations
}