跳转到内容

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 ) 中为您的选项添加简要的帮助文本。

华夏公益教科书