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