diff --git a/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp b/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp index c748f71..dc7874e 100644 --- a/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp +++ b/dvm/fdvm/trunk/Sage/Sage++/libSage++.cpp @@ -26,7 +26,6 @@ extern "C" void exit(int status); #include "extcxx_low.h" extern "C" int number_of_ll_node; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); #undef USER @@ -1647,7 +1646,7 @@ SgFile &SgProject::file(int i) #ifdef __SPF SgStatement::setCurrProcessFile(pt->filename()); SgStatement::setCurrProcessLine(0); - last_file_symbol = FileLastSymbol(pt->filename()); + last_file_symbol = file->cur_symb; #endif return *pt; } @@ -1775,13 +1774,13 @@ int SgFile::switchToFile(const std::string &name) SgFile *file = &(CurrentProject->file(it->second.second)); current_file_id = it->second.second; current_file = file; - + SgStatement::setCurrProcessFile(file->filename()); SgStatement::setCurrProcessLine(0); + last_file_symbol = current_file->filept->cur_symb; } } - - last_file_symbol = FileLastSymbol(name.c_str()); + return it->second.second; } diff --git a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c index 3b95b45..02bf326 100644 --- a/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c +++ b/dvm/fdvm/trunk/Sage/lib/newsrc/low_level.c @@ -83,12 +83,6 @@ int out_upper_case; int out_line_unlimit; int out_line_length; // out_line_length = 132 for -ffo mode; out_line_length = 72 for -uniForm mode PTR_SYMB last_file_symbol; -struct file_symbol { - char *fname; - PTR_SYMB last_symb; - struct file_symbol *next; -} ; -struct file_symbol *file_last_symbol = NULL; static int CountNullBifNext = 0; /* for internal debugging */ @@ -253,24 +247,6 @@ char* mymalloc(int size) return pt1; } -PTR_SYMB FileLastSymbol(char *file_name) -{ - struct file_symbol *fsl; - for(fsl=file_last_symbol; fsl; fsl=fsl->next) - if(!strcmp(file_name, fsl->fname)) - return fsl->last_symb; - return NULL; -} - -void addFileSymbolList(char *file_name, PTR_SYMB symb) -{ - struct file_symbol *fsl; - fsl = (struct file_symbol *) xmalloc(sizeof (struct file_symbol)); - fsl->last_symb = symb; - fsl->fname = file_name; - fsl->next = file_last_symbol; - file_last_symbol = fsl; -} /***************** Provides infos on nodes ******************************** * * * based on the table info in include dir *.def * @@ -1228,7 +1204,6 @@ int Init_Tool_Box() number_of_ll_node = CUR_FILE_NUM_LLNDS() + 1; number_of_bif_node = CUR_FILE_NUM_BIFS() + 1; number_of_symb_node = CUR_FILE_NUM_SYMBS() + 1; - addFileSymbolList(CUR_FILE_NAME(), CUR_FILE_CUR_SYMB()); /* podd 01.03.24 */ if (CUR_FILE_NAME()) strcpy(Current_File_name, CUR_FILE_NAME()); if (ToolBOX_INIT) return 0; diff --git a/dvm/fdvm/trunk/fdvm/dvm.cpp b/dvm/fdvm/trunk/fdvm/dvm.cpp index 58d9b7b..2244f69 100644 --- a/dvm/fdvm/trunk/fdvm/dvm.cpp +++ b/dvm/fdvm/trunk/fdvm/dvm.cpp @@ -82,7 +82,6 @@ extern "C" int out_upper_case; extern "C" int out_line_unlimit; extern "C" int out_line_length; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); Options options; @@ -418,7 +417,7 @@ int main(int argc, char *argv[]) fout_name_info_C = ChangeFto_info_C(fout_name); /*ACC*/ //set the last symbol of file - last_file_symbol = FileLastSymbol(file->filename()); //for low_level.c and not only + last_file_symbol = file->filept->cur_symb; //for low_level.c and not only initLibNames(); //for every file InitDVM(file); //for every file current_file = file; // global variable (used in SgTypeComplex) diff --git a/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp b/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp index db7a1ce..78610d8 100644 --- a/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp +++ b/sapfor/experts/Sapfor_2017/_src/ProjectManipulation/ConvertFiles.cpp @@ -31,7 +31,6 @@ extern "C" int out_upper_case; extern "C" int out_line_unlimit; extern "C" int out_line_length; extern "C" PTR_SYMB last_file_symbol; -extern "C" PTR_SYMB FileLastSymbol(...); static int convertFile(int argc, char* argv[], const set& filesInProj, const set& moduleDeclsInFiles) { @@ -353,7 +352,6 @@ static int convertFile(int argc, char* argv[], const set& filesInProj, c fout_name_info_C = ChangeFto_info_C(fout_name); /*ACC*/ //set the last symbol of file - last_file_symbol = FileLastSymbol(file->filename()); initLibNames(); //for every file InitDVM(file); //for every file current_file = file; // global variable (used in SgTypeComplex) diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp index e09ce14..1ec6519 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.cpp @@ -13,7 +13,7 @@ using std::set; using std::remove_if; -#define PRINT_USELESS_STATEMENTS 0 +#define PRINT_USELESS_STATEMENTS 1 static void updateUseDefForInstruction(SAPFOR::BasicBlock* block, SAPFOR::Instruction* instr, set& use, set& def, @@ -329,10 +329,22 @@ public: void removeDeadCode(SgStatement* func, const map>& allFuncs, - const map& commonBlocks) + const map& commonBlocks, + SgStatement* intervalDelStart, SgStatement* intervalDelEnd) { + if (intervalDelStart && !intervalDelEnd || !intervalDelStart && intervalDelEnd) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + SgProgHedrStmt* prog = isSgProgHedrStmt(func); + if (intervalDelStart) + if (intervalDelStart->lineNumber() < prog->lineNumber() || intervalDelStart->lineNumber() > prog->lastNodeOfStmt()->lineNumber()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + + if (intervalDelEnd) + if (intervalDelEnd->lineNumber() < prog->lineNumber() || intervalDelEnd->lineNumber() > prog->lastNodeOfStmt()->lineNumber()) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + auto cfg = buildCFGforCurrentFunc(func, SAPFOR::CFG_Settings(true, false, false, false, false, false, false), commonBlocks, allFuncs); if(cfg.size() != 1) @@ -422,11 +434,8 @@ void removeDeadCode(SgStatement* func, } } } - +//TODO: need to add [intervalDelStart; intervalDelEnd] // remove dead statements - - SgStatement* end = func->lastNodeOfStmt(), *st = func; - set removable = { ASSIGN_STAT, @@ -435,49 +444,52 @@ void removeDeadCode(SgStatement* func, READ_STAT }; - while (st != end) + vector remove; + for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) { - SgStatement* next = st->lexNext(); - if (removable.find(st->variant()) != removable.end() && useful.find(st) == useful.end()) + { + remove.push_back(st); + st = st->lastNodeOfStmt(); + } + } + + for (auto& rem : remove) + { + __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); + rem->deleteStmt(); + } + + remove.clear(); + //remove empty blocks + for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext()) + { + const int var = st->variant(); + if ((var == FOR_NODE || var == WHILE_NODE || var == IF_NODE || var == SWITCH_NODE) && + st->lexNext()->variant() == CONTROL_END) { - __spf_print(PRINT_USELESS_STATEMENTS, "[Useless statement '%s' on line %d]\n", st->unparse(), st->lineNumber()); - - st->deleteStmt(); - } - else - { - if (isSgControlEndStmt(st)) - { - SgStatement* parent = st->controlParent(); - SgStatement* parent_end; - - if (parent && (parent_end = parent->lastNodeOfStmt()) && parent_end == st) - { - bool empty_parent = false; - - switch (parent->variant()) - { - case IF_NODE: - empty_parent = - parent->lexNext() == parent_end || // IF THEN ENDIF - isSgControlEndStmt(parent->lexNext()) && - parent->lexNext()->lexNext() == parent_end; // IF THEN ELSE ENDIF - break; - default: - empty_parent = parent->lexNext() == parent_end; // DO, WHILE - break; - } - - if (empty_parent) - parent->deleteStmt(); - else if(isSgIfStmt(parent) && isSgControlEndStmt(parent_end->lexPrev())) // IF with empty ELSE branch - parent_end->deleteStmt(); - } - } + remove.push_back(st); + continue; } - st = next; + if (var == IF_NODE) + { + SgStatement* ifS = st; + while (ifS->lexNext()->variant() == ELSEIF_NODE) + ifS = ifS->lexNext(); + + if (ifS->lexNext()->variant() == CONTROL_END) + remove.push_back(st); + } + + //TODO: SWITCH and other block statements + } + + + for (auto& rem : remove) + { + __spf_print(PRINT_USELESS_STATEMENTS, "[Useless block statement on line %d and file %s]\n", rem->lineNumber(), rem->fileName()); + rem->deleteStmt(); } deleteCFG(cfg); diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h index 7c83b1d..6f3ef35 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/dead_code.h @@ -11,4 +11,5 @@ void removeDeadCode(SgStatement* func, const std::map>&allFuncs, - const std::map& commonBlocks); \ No newline at end of file + const std::map& commonBlocks, + SgStatement* intervalDelStart = NULL, SgStatement* intervalDelEnd = NULL); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index bd7a65f..3b5edc5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2289" +#define VERSION_SPF "2290"