4

我正在爲LLVM編譯器開發一個新的後端。後端很好地進入,但我到達了一個點,我想驗證代碼生成器是否正常運行。我有一個非常準確的處理器模擬器,我想用它來驗證。編譯器代碼生成器驗證

使用LLVM-lit對我來說似乎不是一個好選擇,因爲在測試過程中無法集成模擬器。

目前我的測試策略涉及編寫測試程序,我嘗試檢查儘可能多的語句。以下是檢查算術的一個例子。

c = a + a;   
if (c != 6) return 4; 
c = a + a + a;  
if (c != 9) return 5; 
// etc 

我已經注意到很難找到儘可能多的角落案例。

這是驗證代碼生成器的智能方法嗎?如果是這樣,是否有人知道包含這些測試的預先存在的項目?

+0

看看這個方法(Csmith):http://www.cs.utah.edu/~regehr/papers/pldi11-preprint.pdf –

回答

3

你可以通過製作自己的lit.cfg腳本來完成你想做的事。例如,我爲我的項目ELLCC針對不同的目標交叉構建東西。我使用QEMU來運行測試。我修改lit.site.cfg的部分看起來像:

config.substitutions.append(('%microblazeecc', ' ' + config.ecc + ' ' + 
          '-target microblaze-ellcc-linux ')) 
config.substitutions.append(('%microblazeexx', ' ' + config.ecc + '++ ' + 
          '-target microblaze-ellcc-linux ')) 
config.substitutions.append(('%microblazerun', ' ' + ellcc + '/bin/qemu-microblaze ')) 

一個典型的測試看起來像:

// Compile and run for every target. 
// RUN: %armexx -o %t %s && %armrun %t | FileCheck -check-prefix=CHECK %s 
// RUN: %armebexx -o %t %s && %armebrun %t | FileCheck -check-prefix=CHECK %s 
// RUN: %i386exx -o %t %s && %i386run %t | FileCheck -check-prefix=CHECK %s 
// RUN: %microblazeexx -o %t %s && %microblazerun %t | FileCheck -check-prefix=CHECK %s 
// RUN: %mipsexx -o %t %s && %mipsrun %t | FileCheck -check-prefix=CHECK %s 
// RUN: %mipselexx -o %t %s && %mipselrun %t | FileCheck -check-prefix=CHECK %s 
// RUN: %ppcexx -o %t %s && %ppcrun %t | FileCheck -check-prefix=CHECK %s 
// FAIL: %ppc64exx -o %t %s && %ppc64run %t | FileCheck -check-prefix=CHECK %s 
// RUN: %x86_64exx -o %t %s && %x86_64run %t | FileCheck -check-prefix=CHECK %s 
// CHECK: foo.i = 10 
// CHECK: bye 
#include <cstdio> 

class Foo { 
    int i; 
public: 
    Foo(int i) : i(i) { } 
    int get() { return i; } 
    ~Foo() { printf("bye\n"); } 
}; 

int main(int argc, char** argv) 
{ 
    Foo foo(10); 
    printf("foo.i = %d\n", foo.get()); 
} 

您可以使用FileCheck來尋找你感興趣的輸出

1

您可能需要查看LLVM test suite - 一組「整個程序」,這些程序先用本地平臺編譯器(例如gcc)編譯,然後用LLVM編譯並對結果進行比較。

所以如果你的CPU已經有一些編譯器能夠爲它生成代碼,這是一個不錯的選擇。如果沒有,您可以使用它來在開發機器上生成預期的輸出,並與用後端編譯的代碼生成的輸出進行比較。

+0

感謝您的迴應!不幸的是,使用測試套件不是一種選擇,因爲我正在使用的模擬器沒有「乾淨」輸出的選項。我只能看到執行的指令和寄存器文件的狀態。到現在爲止,我一直在通過手動檢查返回寄存器的期望值來測試代碼生成器。 – Maurice