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); }
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 }