跳轉到內容

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 ) 中為您的選項新增簡要的幫助文字。

華夏公益教科書