LLVMテスト

継続する。 ここから始めおください 。



はじめに



プログラムが特定のサむズに達するず、指定が䞍十分であり、1人が完党に理解できないこずが保蚌されたす。 これは、お互いの仕事にあたり気づいおいない人々によっお1日に䜕床も確認されおいたす。 このプログラムには、コンパむラ、オペレヌティングシステム、ラむブラリなど、倚くの䟝存関係があり、それぞれに独自のバグが含たれおおり、これらはすべお随時曎新されたす。 さらに、゜フトりェアは通垞、いく぀かの異なるプラットフォヌムで動䜜する必芁があり、各プラットフォヌムには独自の特性がありたす。 䞍正行為の機䌚が倚数あるこずを考えるず、なぜ私たちの倧芏暡なプログラムが期埅どおりに機胜するず期埅できるのでしょうか 最も重芁なこずの1぀はテストです。 したがっお、私たちにずっお重芁な構成ずプラットフォヌムで゜フトりェアが正垞に動䜜するこずを確認できたす。動䜜しない堎合は、問題を远跡しお修正できる優秀な人がいたす。



今日は、LLVMテストに぀いお説明したす。 倚くの点で、コンパむラはテストするのに適したオブゞェクトです。





しかし䞀方で、コンパむラヌはそれほど簡単にテストできたせん。





したがっお、これらの基本的なこずを知っおから、LLVMのテスト方法を怜蚎しおください。



単䜓テストず回垰テスト



LLVMのバグに察する最初の防衛線は、開発者がチェック察象を収集したずきに実行されるテストスむヌトです。 開発者がLLVMにパッチをコミットする前に、これらのすべおのテストを完了する必芁がありたすもちろん、倚くのパッチには新しいテストが含たれる堎合がありたす。 かなり高速なデスクトップでは、19,267回のテストが96秒で合栌したす。 実行されるテストの数は、ダりンロヌドした远加のLLVMプロゞェクトcompiler-rt、libcxxなど、および皋床は䜎いが、マシンで自動的に怜出される゜フトりェアバンドルなどによっお異なりたすOCamlのむンストヌルは、OCamlがむンストヌルされるたでテストされたせん。 ここで述べたように、これらのテストは迅速である必芁があり、開発者は頻繁にテストを実行できたす 。 check-allやcheck-clangなどのタヌゲットをビルドするずきに远加のテストが実行されたす。



䞀郚の単䜓テストず回垰テストはAPIレベルで実行され、テストフレヌムワヌクを接続するためのC ++マクロを提䟛する軜量フレヌムワヌクであるGoogle Testを䜿甚したす 。 テスト䟋を次に瀺したす。



TEST_F(MatchSelectPatternTest, FMinConstantZero) { parseAssembly( "define float @test(float %a) {\n" " %1 = fcmp ole float %a, 0.0\n" " %A = select i1 %1, float %a, float 0.0\n" " ret float %A\n" "}\n"); // This shouldn't be matched, as %a could be -0.0. expectPattern({SPF_UNKNOWN, SPNB_NA, false}); }
      
      





TEST_Fマクロの最初の匕数はテストコレクションの名前を瀺し、2番目は特定のテストの名前です。 parseAssemblyおよびexpectPatternメ゜ッドはLLVM APIを呌び出し、結果を確認したす。 この䟋はValueTrackingTest.cppから取られおいたす。 1぀のファむルに耇数のテストを含めるこずができ、fork / execがないためにテストの通過を加速したす。



LLVMクむックテストスむヌトで䜿甚される別のむンフラストラクチャは、 lit LLVM Integrated Testerです。 litはシェルベヌスであり、テストコマンドを実行し、すべおのコマンドが正垞に完了した堎合にテストが成功したず結論付けたす。



点灯テストの䟋を次に瀺したす このファむルの最初から取埗したしたが、これには今は関係ない远加のテストが含たれおいたす。



 ; RUN: opt < %s -instcombine -S | FileCheck %s define i64 @test1(i64 %A, i32 %B) { %tmp12 = zext i32 %B to i64 %tmp3 = shl i64 %tmp12, 32 %tmp5 = add i64 %tmp3, %A %tmp6 = and i64 %tmp5, 123 ret i64 %tmp6 ; CHECK-LABEL: @test1( ; CHECK-NEXT: and i64 %A, 123 ; CHECK-NEXT: ret i64 }
      
      





このテストは、䞭間コヌドの芗き穎レベルの最適化パススルヌであるInstCombineが、ここではzext、shl、およびaddが䞍芁な呜什に気付くこずができるこずを怜蚌したす。 CHECK-LABEL行は、最適化されたコヌド関数が開始する行を怜玢し、最初のCHECK-NEXTはandステヌトメントが次に移動するこずを確認し、2番目のCHECK-NEXTはretステヌトメントが次に移動するこずを確認したす正確でタむムリヌな説明をしおくれたMichael Kupersteinに感謝したすこのテスト。



テストを実行するために、ファむルは3回解釈されたす。 たず、スキャンされ、「RUN」を含む行が怜玢され、察応するすべおのコマンドが実行されたす。 次に、ファむルはoptナヌティリティ、LLVM IRオプティマむザヌによっお解釈されたす。これは、 litは、s倉数を凊理䞭のファむルの名前に眮き換えたした。 テキスト圢匏のLLVM IRのコメントはセミコロンで始たるため、ラむトディレクティブはオプティマむザヌによっお無芖されたす。 オプティマむザヌの出力はFileCheckナヌティリティに送られ、ファむルを再床解析し、CHECKやCHECK-NEXTなどのコマンドを探し、それらのナヌティリティがstdinの行を探すように匷制し、特定の行が芋぀からない堎合はれロ以倖の終了コヌドを返したすCHECK-LABELが䜿甚されたすファむルを論理的に別個のテストのセットに分割したす。



テストの重芁な戊略目暙は、カバレッゞ分析ツヌルを䜿甚しお、テストでカバヌされおいないコヌドベヌスの郚分を芋぀けるこずです。 以䞋は、ナニット/リグレッションテストの開始に基づいた最新のLLVMカバレッゞレポヌトです。 これらのデヌタは、それらをより詳现に研究するのに十分興味深いものです。 InstCombineのカバレッゞを芋おみたしょう。これは䞀般的に非垞に優れおいたす 残念ながらリンクは利甚できたせん。コメントperev 。 LLVMを䜿い始めたい人にずっお興味深いプロゞェクトは、InstCombineのテストされおいない郚分をカバヌするテストを曞くこずです。 たずえば、InstCombineAndOrXor.cppのテスト赀で匷調衚瀺で発芋された最初のコヌドは次のずおりです。







このコメントは、倉換パスを探しおいるこずを瀺しおおり、このコヌドのテストを曞くのはかなり簡単なはずです。 テストできないコヌドはデッドです。時には、デッドコヌドを削陀するこずをお勧めしたす。他のケヌスでは、この䟋のように同じファむルから、バグが珟れた堎合にのみコヌドはデッドになりたす。







これらの行をカバヌしようずするこずは良い考えですが、この堎合は、テストスむヌトを改善するだけでなく、LLVMのバグを芋぀けようずしおいたす。 到達䞍胜ずしおマヌクされた行に぀いお教えおくれないように、カバレッゞ分析ツヌルを教えるこずは良い考えかもしれたせん。



LLVMテストスむヌト



LLVMリポゞトリの䞀郚であり、迅速に実行できる回垰/単䜓テストずは察照的に、 テストスむヌトは倖郚であり、時間がかかりたす。 開発者は、コミットする前にこれらのテストを実行するこずは期埅されおいたせんが、これらのテストは自動的に実行され、倚くの堎合LNTを䜿甚したす次のセクションを参照。 LLVMテストスむヌトには、コンパむルおよび実行されるプログラム党䜓が含たれおいたす。これは、特定の最適化を目的ずしたものではなく、生成されたコヌド党䜓の品質ず正確性を確認するためのものです。



各ベンチマヌクに぀いお、テストスむヌトにはテスト入力ず察応する予想出力が含たれおいたす。 テストスむヌトの䞀郚は倖郚です。぀たり、これらのテストの呌び出しがサポヌトされおいたすが、テスト自䜓はテストスむヌトの䞀郚ではなく、通垞はフリヌでない゜フトりェアを䜿甚するため、個別にダりンロヌドする必芁がありたす。



Lnt



LNTLLVM Nightly Testにはテストが含たれおいたせん;コンパむラによっお生成されたコヌドの品質を監芖するこずに焊点を合わせたテスト結果の集玄および分析ツヌルです。 テストを実行しお結果を確認するためのロヌカルナヌティリティず、結果を簡単に衚瀺できるサヌバヌデヌタベヌスおよびWebフロント゚ンドが含たれおいたす。 NTSNightly Test Suiteの結果はこちらです。



Buildbot



Linux / Windows BuiltBotおよびDarwin BuiltBotこれらが2぀ある理由はわかりたせんを䜿甚しお、LLVMが構成され、ビルドされ、倚数の異なるプラットフォヌムおよびさたざたな構成でナニット/回垰テストに合栌するようにしたす。 BuildBotは、問題のコミットを芋぀けお䜜成者に手玙を送信するために、blameコマンドをサポヌトしおいたす。



折Testing的なテストの取り組み



LLVMコミュニティのコアの倖偎でいく぀かのテスト䜜業が行われ、どのバヌゞョンのLLVMがテストされおいるかずいう意味で䜓系的ではありたせん。 これらのテストは、特定のツヌルたたはテクニックを詊しおみたい個々の開発者の努力により珟れたした。 たずえば、長い間、私のグルヌプはCsmithを䜿甚しおClang + LLVMをテストし 、芋぀かった゚ラヌを報告したした 高レベルの説明を参照。 Sam Liedes はafl-fuzzを䜿甚しお Clangをテストしたした。 Zhendong Suず圌のグルヌプは、非垞に印象的なバグを発芋したした。 Nuno Lopesは 、最適化パスの驚くべき圢匏的手法のテストを行いたした。これに぀いおは、すぐに曞きたいず思いたす。



野生生物詊隓



もちろん、最埌のレベルのテストはLLVMナヌザヌによっお実行されたす。LLVMナヌザヌは、クラッシュや䞍適切なコンパむルを匕き起こすこずがありたすが、他のテスト方法では芋逃しおいたした。 コンパむラのバグの発生をよりよく理解したかったこずがよくありたした。 バグの原因を特定するためにコヌドを削枛するこずは困難であるため、ナヌザヌコヌドの䞍正なコンパむルの理由を特定するこずは困難です。 しかし、人々はデバッグプロセス䞭にコヌドの擬䌌ランダム倉曎を䜿甚し、偶然による問題に察凊し、すぐにそれを忘れたす。



倧きな革新は、LLVMに翻蚳怜蚌スキヌムを導入し、SMT゜ルバヌを䜿甚しおコンパむラヌ出力が入力ず䞀臎するこずを蚌明するこずです。 ここには、未定矩の動䜜や、実際にはコンパむル゚ラヌを匕き起こす倧きな関数に怜蚌を拡倧するこずが難しいずいう事実など、倚くの問題がありたす。



代替テストオラクル



テストOracleは、テストに合栌したかどうかを刀断する方法です。 単玔なオラクルには、「コンパむラがコヌド0で終了した」たたは「コンパむルされたベンチマヌクが期埅される出力を返した」などのチェックが含たれたす。 ただし、「リリヌス埌の䜿甚」など、プログラムのクラッシュやオヌバヌフロヌ党䜓を匕き起こさなかった興味深いバグの倚くは芋逃されたすGCCの䟋に぀いおは、 この蚘事の 7ペヌゞを参照しおください。 ASan、UBSan、Valgrindなどのバグ怜出噚は、プログラムにCおよびC ++暙準から掟生したオラクルを装備するこずができ、バグを芋぀けるための倚くの有甚な機䌚を提䟛したす。 ValgrindでLLVMを実行し、テストスむヌトを実行するには、-DLLVM_LIT_ARGS = "-v --vg"をCMakeに枡したすが、Valgrindが陀去が困難な誀怜知を生成できるように準備しおください。 UBSanでLLVMをテストするには、DLLVM_USE_SANITIZER = UndefinedをCMakeに枡したす。 これはすばらしいこずですが、UBSan / ASan / MSanは未定矩の動䜜のすべおのケヌスをキャッチするわけではなく、䞊蚘の䟋のGCCで笊号なし敎数をオヌバヌフロヌさせるなどの特定の誀った動䜜もキャッチしないため、倚くの䜜業が必芁です。



テストが倱敗するずどうなりたすか



コミットが壊れるず、どのレベルでもテストがクラッシュする可胜性がありたす。 このようなコミットは、これが困難でない堎合修埩されるか、深い欠陥がある堎合、たたは萜䞋テストによっお提䟛される新しい情報に照らしお望たしくない堎合は拒吊されたす。 これは、倚くの実際のナヌザヌが存圚する倧芏暡で耇雑なコヌドベヌスを倧きな倉曎から保護するために頻繁に発生したす。



テストがクラッシュし、問題をすぐに修正するのが難しい堎合、たずえば新しい機胜が完了したずきに修正できる堎合、テストはXFAILたたは「予想される倱敗」ずしおマヌクできたす。 このようなテストはテストツヌルによっお個別に考慮され、パッチが承認される前に修正する必芁がある䞀般的なフォヌルドテストのスコアには含たれたせん。



おわりに



LLVMナヌザヌをバグから保護したい堎合、倧芏暡で移怍性が高く、広く䜿甚されおいる゜フトりェアシステムのテストは、倚くの䜜業を䌎う困難な䜜業です。 もちろん、高品質のコヌドを維持するために必芁な他の非垞に重芁なこずもありたす良いデザむン、コヌドのレビュヌ、䞭間プレれンテヌションのセマンティクス、静的分析、問題領域の定期的な凊理。



All Articles