ROSE  0.9.10.200
utility_functions.h
1 // utility_functions.h -- header file for the ROSE Optimizing Preprocessor
2 
3 #ifndef UTILITY_FUNCTIONS_H
4 #define UTILITY_FUNCTIONS_H
5 
6 #include "Cxx_Grammar.h"
7 class UnparseDelegate;
8 
9 #define BACKEND_VERBOSE_LEVEL 2
10 
11 // DQ (11/1/2009): replaced "version()" with separate "version_number()" and "version_message()" functions.
12 // returns a string containing the current version message (includes the version number).
13 std::string version_message();
14 
15 // DQ (11/1/2009): replaced "version()" with separate "version_number()" and "version_message()" functions.
16 // returns a string containing the current version number
17 std::string version_number();
18 
20 std::string rose_scm_version_id();
21 
23 time_t rose_scm_version_date();
24 
26 unsigned int rose_boost_version_id();
27 
29 std::string rose_boost_version_path();
30 
31 // DQ (7/3/2013): Added support to output pre-defined macro settings.
33 void outputPredefinedMacros();
34 
35 
36 // Simple interface for ROSE (error codes are in SgProject.frontendErrorCode(), backendErrorCode() )
37 // tps : Need to make this function (DLL) public
38 ROSE_DLL_API SgProject* frontend ( int argc, char** argv, bool frontendConstantFolding = false );
39 ROSE_DLL_API SgProject* frontend ( const std::vector<std::string>& argv, bool frontendConstantFolding = false );
40 
41 // DQ (4/17/2015): After discussion with Liao, Markus, and Pei-Hung, we have agreed that
42 // we want to support multiple SgProject IR nodes. So in addition to the SgProject* frontend()
43 // function we will in the future support:
44 // 1) A SgProject member function "frontend()" that can be used to generate a new SgFile in
45 // an existing SgProject.
46 // 2) A SgBuilder function for building an empty SgProject (without files).
47 // 3) We will remove the use of the SageInterface::getProject() (which asserts that there
48 // is only one SgProject).
49 
50 // This builds a shell of a frontend SgProject with associated SgFile objects (but with empty
51 // SgGlobal objects) supporting only commandline processing and requiring the frontend to be
52 // called explicitly for each SgFile object. See tutorial/selectedFileTranslation.C for example.
53 SgProject* frontendShell ( int argc, char** argv);
54 ROSE_DLL_API SgProject* frontendShell ( const std::vector<std::string>& argv);
55 
56 // DQ (3/18/2006): Modified backend function interface to permit handling of user specified
57 // objects to control the formatting of code generation and the use of alternative code generation
58 // techniques (e.g. copy-based code generation).
59 // int backend ( SgProject* project );
60 //
61 // WARNING: If a non-null unparseFormatHelp is specified then backend will unconditionally delete it. Therefore, the caller
62 // must have allocated it on the heap or else strange errors will result.
63 ROSE_DLL_API int backend ( SgProject* project, UnparseFormatHelp *unparseFormatHelp = NULL, UnparseDelegate* unparseDelagate = NULL );
64 
65 // DQ (8/24/2009): This backend calls the backend compiler using the original input source file list.
66 // This is useful as a test code for testing ROSE for use on projects that target Compass or any
67 // other analysis only tool using ROSE. Called in tests/nonsmoke/functional/testAnalysis.C for example.
68 ROSE_DLL_API int backendCompilesUsingOriginalInputFile ( SgProject* project, bool compile_with_USE_ROSE_macro = false );
69 
70 // DQ (2/6/2010): This backend forces all code to be generated but still uses the backend vendor
71 // compiler to compile the original code. This is a step between backendUsingOriginalInputFile(),
72 // which does not generate code; and backend() which generated code and compiles it. The use of
73 // this backend permits an intermediate test of robustness where the code that we generate might
74 // be generated incorrectly (usually with missing name qualification as required for a specific
75 // backend (vendor) compiler).
76 ROSE_DLL_API int backendGeneratesSourceCodeButCompilesUsingOriginalInputFile ( SgProject* project );
77 
78 //QY: new back end that performs only source-to-source translations
79 // of the original file. Furthermore, statements are copied from
80 // the original file if they are not changed
81 ROSE_DLL_API int copy_backend( SgProject* project, UnparseFormatHelp *unparseFormatHelp = NULL );
82 
83 // int globalBackendErrorCode = 0;
84 // int backend ( const SgProject & project, int & errorCode = globalBackendErrorCode);
85 // SgProject & frontend ( int argc, char * argv[] );
86 
87 ROSE_DLL_API void generatePDF ( const SgProject & project );
88 
89 // DQ (12/20/2018): Added option to exclude template instantiations which make the graphs smaller and tractable t manage for larger C++ applications.
90 ROSE_DLL_API void generateDOT ( const SgProject & project, std::string filenamePostfix = "", bool excludeTemplateInstantiations = false );
91 
92 // DQ (9/22/2017): Adding support that is can work with any IR node, so that we can generated DOT files on untyped ASTs.
93 // I prefer the API that takes a SgNode pointer.
94 // ROSE_DLL_API void generateDOT ( SgNode* node, std::string baseFilename, std::string filenamePostfix = "" );
95 ROSE_DLL_API void generateDOT ( SgNode* node, std::string filename );
96 
97 // DQ (9/1/2008): Added function to generate the compete AST when specificed with multiple files
98 // on the command line. This is the older default behavior of generateDOT (from last year, or so).
99 ROSE_DLL_API void generateDOT_withIncludes ( const SgProject & project, std::string filenamePostfix = "" );
100 ROSE_DLL_API void generateDOTforMultipleFile ( const SgProject & project, std::string filenamePostfix = "" );
101 
102 // DQ (6/14/2007): Support for whole AST graphs output with attributes (types, symbols, all edges, etc.)
103 // We define a default value for the maximum graph size (number of nodes).
104 ROSE_DLL_API void generateAstGraph ( const SgProject* project, int maxSize = 2000, std::string filenameSuffix = "" );
105 // void generateAstGraph ( const SgProject* project, int maxSize, std::string filenameSuffix = "", CustomMemoryPoolDOTGeneration::s_Filter_Flags* filter_flags = NULL)
106 
107 // output of EDG AST (useful for debugging connection to SAGE)
108 //void pdfPrintAbstractSyntaxTreeEDG ( SgFile *file );
109 // void generatePDFofEDG ( const SgProject & project );
110 
111 #ifndef SWIG
112 
113 //#include "rose.h"
114 //#include "../midend/astProcessing/DOTGeneration.h"
115 //#include "roseInternal.h"
116 //#include "../midend/astProcessing/AstDotGeneration.h"
117 //using namespace AstDOTGenerationExtended_Defaults;
118 //#include "../midend/astProcessing/AstDOTGeneration.h"
119 #include "AstDOTGeneration.h"
120 
121 template <typename ExtraNodeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeInfo, typename ExtraNodeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeOptions, typename ExtraEdgeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeInfo, typename ExtraEdgeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeOptions>
123 //void
124 //generateDOTExtended ( const SgProject & project, std::string filenamePostfix = "", ExtraNodeInfo_t eni = AstDOTGenerationExtended_Defaults::DefaultExtraNodeInfo(), ExtraNodeOptions_t eno = AstDOTGenerationExtended_Defaults::DefaultExtraNodeOptions(), ExtraEdgeInfo_t eei = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeInfo(), ExtraEdgeOptions_t eeo = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeOptions() );
125 
126 template <typename ExtraNodeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeInfo, typename ExtraNodeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeOptions, typename ExtraEdgeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeInfo, typename ExtraEdgeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeOptions>
128 
129 template <typename ExtraNodeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeInfo, typename ExtraNodeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraNodeOptions, typename ExtraEdgeInfo_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeInfo, typename ExtraEdgeOptions_t = AstDOTGenerationExtended_Defaults::DefaultExtraEdgeOptions>
131 
132 // endif for ifndef SWIG
133 #endif
134 
135 #ifndef SWIG
136 // DQ (3/10/2013): Swig has a problem with:
137 // src/roseSupport/utility_functions.h:138: Error: 'stripPathFromFileName' is multiply defined in the generated target language module in scope 'roseJNI'.
138 // src/util/stringSupport/string_functions.h:221: Error: Previous declaration of 'stripPathFromFileName'
139 // src/util/stringSupport/string_functions.h:223: Error: Previous declaration of 'getPathFromFileName'
140 // So exclude this code below.
141 
142 namespace Rose
143  {
144  // This class serves as a catch all location for functions of general use within ROSE
145  // we have added variables that are set using command line parameters to avoid the use of
146  // global variables.
147 
148  // DQ (3/6/2017): Adding ROSE options data structure to support frontend and backend options such as:
149  // 1) output of warnings from the EDG (or other) frontend.
150  // 2) output of notes from the EDG (or other) frontend.
151  // 3) output of warnings from the backend compiler.
152  // The reason for this options clas is to support tools that would want to suppress warnings from ROSE,
153  // and still also permit compilers that would be implemented using ROSE to have the full range of output
154  // from EDG (or other frontends) to control notes and warnings.
155  class Options
156  {
157  private:
158  bool frontend_notes;
159  bool frontend_warnings;
160  bool backend_notes;
161  bool backend_warnings;
162 
163  public:
164  ROSE_DLL_API Options();
165  ROSE_DLL_API Options(const Options & X);
166  ROSE_DLL_API Options & operator= (const Options & X);
167 
168  // Access functions for options API.
169  ROSE_DLL_API bool get_frontend_notes();
170  ROSE_DLL_API void set_frontend_notes(bool flag);
171  ROSE_DLL_API bool get_frontend_warnings();
172  ROSE_DLL_API void set_frontend_warnings(bool flag);
173  ROSE_DLL_API bool get_backend_notes();
174  ROSE_DLL_API void set_backend_notes(bool flag);
175  ROSE_DLL_API bool get_backend_warnings();
176  ROSE_DLL_API void set_backend_warnings(bool flag);
177  };
178 
179  // Global variable (in this rose namespace) to permit multiple parts of ROSE to access consistant information on options.
180  ROSE_DLL_API extern Options global_options;
181 
182 
183  // DQ (8/10/2004): This was moved to the SgFile a long time ago and should not be used any more)
184  // DQ (8/11/2004): Need to put this back so that there is a global concept of verbosity for all of ROSE.
185  // static int roseVerboseLevel;
186 
187  // These functions trim the header files from the unparsed output.
188  // static int isCutStart ( SgStatement *st );
189  // static int isCutEnd ( SgStatement *st );
190  // void ROSE_Unparse ( SgFile *f , std::ostream *of );
191 
192  // This function helps isolate the details of the UNIX strcmp function
193  // static int isSameName ( const std::string& s1, const std::string& s2 );
194  int containsString ( const std::string& masterString, const std::string& targetString );
195 
196  // DQ (9/5/2008): Try to remove these functions...
197  std::string getFileNameByTraversalBackToFileNode ( const SgNode* astNode );
198  // std::string getFileName ( const SgFile* file );
199 
200  // DQ (5/25/2005): Removed from ROSE class (since they are redundant with other uses)
201  std::string getFileName ( SgLocatedNode* locatedNodePointer ) ROSE_DEPRECATED_FUNCTION;
202  int getLineNumber ( SgLocatedNode* locatedNodePointer ) ROSE_DEPRECATED_FUNCTION;
203  int getColumnNumber ( SgLocatedNode* locatedNodePointer ) ROSE_DEPRECATED_FUNCTION;
204  bool isPartOfTransformation( SgLocatedNode* locatedNodePointer ) ROSE_DEPRECATED_FUNCTION;
205 
206  ROSE_DLL_API std::string getWorkingDirectory ();
207  ROSE_DLL_API std::string getSourceDirectory ( std::string fileNameWithPath );
208 
209  std::string getFileNameWithoutPath ( SgStatement* statementPointer );
210  ROSE_DLL_API std::string utility_stripPathFromFileName ( const std::string& fileNameWithPath );
211 
212  ROSE_DLL_API std::string getPathFromFileName ( std::string fileNameWithPath );
213 
214  // DQ (9/8/2008): This is removed since it is redundant with the version in StringUtility.
215  // std::string stripFileSuffixFromFileName ( const std::string& fileNameWithSuffix ); //! get the name without the ".C"
216 
217  // std::string getPragmaString ( SgStatement *stmt );
218  // std::string getPragmaString ( SgExpression *expr );
219 
220  // SgPragma* getPragma ( SgExpression *expr );
221  // SgPragma* getPragma ( SgStatement *stmt );
222  // SgPragma* getPragma ( SgBinaryOp *binaryOperator );
223 
224  // std::string identifyVariant ( int Code );
225 
226  SgName concatenate ( const SgName & X, const SgName & Y );
227 
228  ROSE_DLL_API void usage (int status);
229 
230  void filterInputFile ( const std::string inputFileName, const std::string outputFileName );
231 
233  SgStatement* getPreviousStatement ( SgStatement *targetStatement , bool climbOutScope = true);
234  SgStatement* getNextStatement ( SgStatement *targetStatement );
235 
236  // DQ (9/27/2018): We need to build multiple maps, one for each file (to support token based unparsing for multiple files,
237  // such as what is required when using the unparsing header files feature).
238  // DQ (10/28/2013): Put the token sequence map here, it is set and accessed via member functions on the SgSourceFile IR node.
239  // extern std::map<SgNode*,TokenStreamSequenceToNodeMapping*> tokenSubsequenceMap;
240  extern std::map<int,std::map<SgNode*,TokenStreamSequenceToNodeMapping*>* > tokenSubsequenceMapOfMaps;
241 
242  // DQ (11/27/2013): Adding vector of nodes in the AST that defines the token unparsing AST frontier.
243  // extern std::vector<FrontierNode*> frontierNodes;
244  // extern std::map<SgStatement*,FrontierNode*> frontierNodes;
245  extern std::map<int,std::map<SgStatement*,FrontierNode*>*> frontierNodesMapOfMaps;
246 
247  // DQ (11/27/2013): Adding adjacency information for the nodes in the token unparsing AST frontier.
248  // extern std::map<SgNode*,PreviousAndNextNodeData*> previousAndNextNodeMap;
249  extern std::map<int,std::map<SgNode*,PreviousAndNextNodeData*>*> previousAndNextNodeMapOfMaps;
250 
251  // DQ (11/29/2013): Added to support access to multi-map of redundant mapping of frontier IR nodes to token subsequences.
252  // extern std::multimap<int,SgStatement*> redundantlyMappedTokensToStatementMultimap;
253  // extern std::set<int> redundantTokenEndingsSet;
254  extern std::map<int,std::multimap<int,SgStatement*>*> redundantlyMappedTokensToStatementMapOfMultimaps;
255  extern std::map<int,std::set<int>*> redundantTokenEndingsMapOfSets;
256 
257  // DQ (11/20/2015): Provide a statement to use as a key in the token sequence map to get representative whitespace.
258  // extern std::map<SgScopeStatement*,SgStatement*> representativeWhitespaceStatementMap;
259  extern std::map<int,std::map<SgScopeStatement*,SgStatement*>*> representativeWhitespaceStatementMapOfMaps;
260 
261  // DQ (11/30/2015): Provide a statement to use as a key in the macro expansion map to get info about macro expansions.
262  // extern std::map<SgStatement*,MacroExpansion*> macroExpansionMap;
263  extern std::map<int,std::map<SgStatement*,MacroExpansion*>*> macroExpansionMapOfMaps;
264 
265  // DQ (10/29/2018): Build a map for the unparser to use to locate SgIncludeFile IR nodes.
266  extern std::map<std::string, SgIncludeFile*> includeFileMapForUnparsing;
267 
268  // DQ (3/5/2017): Added general IR node specific message stream to support debugging message from the ROSE IR nodes.
269  extern Sawyer::Message::Facility ir_node_mlog;
270 
271  void initDiagnostics();
272  };
273 
274 
275 // endif for ifndef SWIG
276 #endif
277 
278 #endif // ifndef UTILITY_FUNCTIONS_H
279 
280 
281 
282 
283 
284 
285 
Collection of streams.
Definition: Message.h:1579
Main namespace for the ROSE library.
SgName concatenate(const SgName &X, const SgName &Y)
get the path from the full filename
SgStatement * getPreviousStatement(SgStatement *targetStatement, bool climbOutScope=true)
Functions to move to SgStatement object in SAGE III later.
This class represents strings within the IR nodes.
ROSE_DLL_API std::string getPathFromFileName(std::string fileNameWithPath)
get the filename from the full filename
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:8900
ROSE_DLL_API std::string getSourceDirectory(std::string fileNameWithPath)
get the current directory
This class represents the notion of a statement.
This class represents the notion of an expression or statement which has a position within the source...
This class represents a source project, with a list of SgFile objects and global information about th...
std::string getFileNameWithoutPath(SgStatement *statementPointer)
get the sourceDirectory directory