ROSE 编译器框架/如何添加 ROSE 命令行选项
通常,添加到 ROSE 中的功能会带有一组命令行选项。这些选项可以启用和定制该功能。
例如,ROSE 中的 OpenMP 支持默认情况下是禁用的。需要一个特殊的选项来启用它。此外,支持可以仅限于解析 OpenMP 指令,也可以复杂到将指令翻译成多线程代码。
本 HOWTO 将快速介绍添加选项的关键步骤。
选项需要存储在某个地方。有多种存储选项:
- 作为 SgProject 的数据成员,如果选项适用于与 SgProject 关联的所有文件
- 作为 SgFile 的数据成员,如果选项适用于单个源文件,或者
- 作为您定义的命名空间中的一个成员变量,如果选项用于某些转换或分析。
如果选项可以针对每个文件进行特定设置,建议添加一个新的数据成员到 SgFile 中来保存选项值。
例如,以下是一个命令行选项,用于打开 UPC 语言支持
ROSE/src/ROSETTA/src/support.C // 为 SgFile 添加一个数据成员
// Liao (6/6/2008): Support for UPC model of C , 6/19/2008: add support for static threads compilation File.setDataPrototype ( "bool", "UPC_only", "= false", NO_CONSTRUCTOR_PARAMETER, BUILD_ACCESS_FUNCTIONS, NO_TRAVERSAL, NO_DELETE);
ROSETTA 处理此信息,自动生成一个成员以及相应的成员访问函数(set/get_member())。
命令行选项应在 src/frontend/SageIII/sage_support/cmdline.cpp 中处理。
文件级别的选项由 void SgFile::processRoseCommandLineOptions ( vector<string> & argv ) 处理
处理 -rose:openmp 选项的示例代码
set_openmp(false); ROSE_ASSERT (get_openmp() == false); ... if ( CommandlineProcessing::isOption(argv,"-rose:","(OpenMP|openmp)",true) == true ) { if ( SgProject::get_verbose() >= 1 ) printf ("OpenMP option specified \n"); set_openmp(true); //side effect for enabling OpenMP, define the macro as required argv.push_back("-D_OPENMP"); }
ROSE 命令行选项在被处理后应该被删除,以避免与后端编译器混淆
SgFile::stripRoseCommandLineOptions ( vector<string>& argv ) 应该包含删除选项的代码。
在您的代码中,您可以使用自动生成的访问函数来设置/检索存储的选项值。
例如
if (sourceFile->get_openmp()) //... do something here ....
任何选项都应该在在线帮助输出中进行说明。
请在 ./src/frontend/SageIII/sage_support/cmdline.cpp 中的 void SgFile::usage ( int status ) 中为您的选项添加简要的帮助文本。