.\" Man page generated from reStructuredText .\" by the Docutils 0.23 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "FILECHECK" "1" "2026-07-15" "22" "LLVM" .SH "نام (NAME)" FileCheck \- ابزار اعتبارسنجی فایل با تطبیق انعطاف‌پذیر الگوها .SH "خلاصه دستور (SYNOPSIS)" .sp \fBFileCheck\fP \fImatch\-filename\fP [\fI\-\-check\-prefix=XXX\fP] [\fI\-\-strict\-whitespace\fP] .SH "توضیحات (DESCRIPTION)" .sp دستور \fBFileCheck\fP دو فایل را می‌خواند (یکی از ورودی استاندارد و دیگری مشخص‌شده در خط فرمان) و از یکی برای اعتبارسنجی دیگری استفاده می‌کند. این رفتار به‌ویژه برای مجموعه آزمون‌ها مفید است، که می‌خواهد بررسی کند آیا خروجی یک ابزار (مانند \fBllc\fP) حاوی اطلاعات مورد انتظار است یا خیر (برای نمونه، یک دستور movsd از esp یا هر مورد مد نظر دیگری). این سازوکار مشابه استفاده از \fBgrep\fP است، اما برای تطبیق چندین ورودی مختلف در یک فایل با ترتیبی مشخص بهینه‌سازی شده است. .sp فایل \fBmatch\-filename\fP فایلی را مشخص می‌کند که حاوی الگوهای مورد نظر برای تطبیق است. فایلی که باید اعتبارسنجی شود از ورودی استاندارد خوانده می‌شود، مگر اینکه از گزینه \fB\-\-input\-file\fP استفاده شده باشد. .SH "گزینه‌ها (OPTIONS)" .sp گزینه‌ها از متغیر محیطی \fBFILECHECK_OPTS\fP و از خط فرمان پردازش می‌شوند. .INDENT 0.0 .TP .B \-help چاپ خلاصه‌ای از گزینه‌های خط فرمان. .UNINDENT .INDENT 0.0 .TP .B \-\-check\-prefix prefix دستور FileCheck محتویات \fBmatch\-filename\fP را برای یافتن الگوهای تطبیق جستجو می‌کند. به‌طور پیش‌فرض، پیشوند این الگوها \(dq\fBCHECK:\fP\(dq است. اگر مایل به استفاده از پیشوند متفاوتی هستید (مثلاً به این دلیل که همان فایل ورودی در حال بررسی چندین ابزار یا گزینه مختلف است)، آرگومان \fB\-\-check\-prefix\fP به شما امکان می‌دهد یک یا چند پیشوند را برای تطبیق (بدون \(dq\fB:\fP\(dq انتهایی) مشخص کنید. استفاده از چند پیشوند برای آزمون‌هایی مفید است که ممکن است برای گزینه‌های مختلف اجرا تغییر کنند، اما بیشتر خطوط آن‌ها یکسان باقی می‌ماند. .sp دستور FileCheck اجازه استفاده از پیشوندهای تکراری را نمی‌دهد، حتی اگر یکی از آن‌ها پیشوند بررسی و دیگری پیشوند توضیح باشد (بخش \fB\-\-comment\-prefixes\fP در زیر را ببینید). .UNINDENT .INDENT 0.0 .TP .B \-\-check\-prefixes prefix1,prefix2,... نام مستعاری برای \fB\-\-check\-prefix\fP که امکان مشخص کردن چندین پیشوند را به‌صورت فهرستی جداشده با کاما فراهم می‌کند. .UNINDENT .INDENT 0.0 .TP .B \-\-comment\-prefixes prefix1,prefix2,... به‌طور پیش‌فرض، FileCheck هرگونه وقوع هر پیشوند بررسی را در \fBmatch\-filename\fP نادیده می‌گیرد اگر در همان خط، پیش از آن \(dq\fBCOM:\fP\(dq یا \(dq\fBRUN:\fP\(dq آمده باشد. برای جزئیات نحوه استفاده، بخش دستورالعمل \(dqCOM:\(dq را ببینید. .sp در صورتی که این پیشوندهای توضیح پیش‌فرض برای محیط آزمون شما مناسب نباشند، می‌توان آن‌ها را با \fB\-\-comment\-prefixes\fP بازنویسی کرد. با این حال، انجام این کار در مجموعه‌های آزمون مبتنی بر LIT در LLVM توصیه نمی‌شود، زیرا اگر همگی از یک شیوه توضیح‌نویسی یکپارچه پیروی کنند نگهداری آن‌ها آسان‌تر خواهد بود. در چنین حالتی، در عوض پیشنهاد تغییر پیشوندهای توضیح پیش‌فرض را مد نظر قرار دهید. .UNINDENT .INDENT 0.0 .TP .B \-\-allow\-unused\-prefixes این گزینه رفتار برنامه را در هنگام استفاده از بیش از یک پیشوند (مشخص‌شده توسط \fB\-\-check\-prefix\fP یا \fB\-\-check\-prefixes\fP) که برخی از آن‌ها در فایل آزمون وجود ندارند، کنترل می‌کند. اگر true باشد، این حالت مجاز است؛ اگر false باشد، FileCheck خطایی گزارش کرده و پیشوندهای ناموجود را فهرست می‌کند. مقدار پیش‌فرض false است. .UNINDENT .INDENT 0.0 .TP .B \-\-input\-file filename فایلی که باید بررسی شود (پیش‌فرض stdin است). .UNINDENT .INDENT 0.0 .TP .B \-\-match\-full\-lines به‌طور پیش‌فرض، FileCheck اجازه تطبیق در هر کجای خط را می‌دهد. این گزینه ایجاب می‌کند که تمام تطبیق‌های مثبت یک خط کامل را پوشش دهند. فاصله‌های سفید ابتدا و انتهای خط نادیده گرفته می‌شوند، مگر اینکه \fB\-\-strict\-whitespace\fP نیز مشخص شده باشد. (توجه: تطبیق‌های منفی حاصل از \fBCHECK\-NOT\fP تحت تأثیر این گزینه قرار نمی‌گیرند!) .sp ارسال این گزینه معادل درج \fB{{^ *}}\fP یا \fB{{^}}\fP قبل از، و \fB{{ *$}}\fP یا \fB{{$}}\fP بعد از هر الگوی بررسی مثبت است. .UNINDENT .INDENT 0.0 .TP .B \-\-strict\-whitespace به‌طور پیش‌فرض، FileCheck فاصله‌های سفید افقی ورودی (فاصله‌ها و تب‌ها) را استانداردسازی (canonicalize) می‌کند که باعث می‌شود تفاوت‌های آن‌ها نادیده گرفته شود (یک فاصله با یک تب تطبیق داده می‌شود). آرگومان \fB\-\-strict\-whitespace\fP این رفتار را غیرفعال می‌کند. توالی‌های پایان خط در تمام حالت‌ها به فرمت یونیکسی \fB\en\fP استانداردسازی می‌شوند. .UNINDENT .INDENT 0.0 .TP .B \-\-ignore\-case به‌طور پیش‌فرض، FileCheck از تطبیق حساس به حروف کوچک و بزرگ استفاده می‌کند. این گزینه باعث می‌شود FileCheck از تطبیق غیرحساس به حروف کوچک و بزرگ استفاده کند. .UNINDENT .INDENT 0.0 .TP .B \-\-implicit\-check\-not check\-pattern بررسی‌های منفی ضمنی را برای الگوهای مشخص‌شده بین بررسی‌های مثبت اضافه می‌کند. این گزینه امکان نوشتن آزمون‌های سخت‌گیرانه‌تر را بدون انباشتن آن‌ها با \fBCHECK\-NOT\fP فراهم می‌سازد. .sp برای مثال، \(dq\fB\-\-implicit\-check\-not warning:\fP\(dq می‌تواند هنگام آزمایش پیام‌های تشخیصی ابزارهایی که گزینه‌ای مشابه \fBclang \-verify\fP ندارند، مفید باشد. با این گزینه FileCheck بررسی خواهد کرد که ورودی حاوی هشدارهایی نباشد که تحت پوشش هیچ‌یک از الگوهای \fBCHECK:\fP قرار نگرفته‌اند. .UNINDENT .INDENT 0.0 .TP .B \-\-dump\-input تخلیه (dump) ورودی در stderr، به همراه یادداشت‌هایی که نشان‌دهنده تشخیص‌های فعال فعلی هستند. هنگامی که این گزینه چند بار تکرار شود، مقداری از \fB\fP که زودتر در فهرست زیر آمده است تقدم خواهد داشت. مقدار پیش‌فرض \fBfail\fP است. .INDENT 7.0 .IP \(bu 2 \fBhelp\fP \- توضیح نحوه تخلیه ورودی و خروج .IP \(bu 2 \fBalways\fP \- تخلیه همیشگی ورودی .IP \(bu 2 \fBfail\fP \- تخلیه ورودی فقط در صورت شکست .IP \(bu 2 \fBnever\fP \- عدم تخلیه ورودی در هر شرایطی .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-dump\-input\-context در خروجی درخواست‌شده توسط \fB\-\-dump\-input\fP، تعداد \fB\fP خط ورودی قبل و \fB\fP خط ورودی بعد از هر خط مشخص‌شده توسط \fB\-\-dump\-input\-filter\fP را چاپ می‌کند. هنگامی که این گزینه چند بار مشخص شده باشد، بزرگ‌ترین \fB\fP تعیین‌شده اولویت دارد. مقدار پیش‌فرض ۵ است. .UNINDENT .INDENT 0.0 .TP .B \-\-dump\-input\-filter در خروجی درخواست‌شده توسط \fB\-\-dump\-input\fP، تنها خطوط ورودی از نوع \fB\fP را به همراه زمینه مشخص‌شده توسط \fB\-\-dump\-input\-context\fP چاپ می‌کند. در صورت تکرار چندباره این گزینه، مقداری از \fB\fP که زودتر در فهرست زیر آمده است اولویت دارد. مقدار پیش‌فرض در صورت \fB\-\-dump\-input=fail\fP برابر با \fBerror\fP، و در صورت \fB\-\-dump\-input=always\fP برابر با \fBall\fP است. .INDENT 7.0 .IP \(bu 2 \fBall\fP \- تمام خطوط ورودی .IP \(bu 2 \fBannotation\-full\fP \- خطوط ورودی حاوی یادداشت‌ها .IP \(bu 2 \fBannotation\fP \- خطوط ورودی دارای نقطه شروع یادداشت‌ها .IP \(bu 2 \fBerror\fP \- خطوط ورودی دارای نقطه شروع یادداشت‌های خطا .UNINDENT .UNINDENT .INDENT 0.0 .TP .B \-\-enable\-var\-scope حوزه دید (scope) را برای متغیرهای عبارت باقاعده (regex) فعال می‌کند. .sp متغیرهایی که نام آن‌ها با \fB$\fP آغاز می‌شود، عمومی (global) تلقی شده و در سراسر فایل معتبر باقی می‌مانند. .sp تعریف تمام متغیرهای دیگر پس از برخورد با هر \fBCHECK\-LABEL\fP لغو می‌شود. .UNINDENT .INDENT 0.0.TP .B \-D یک متغیر الگوی filecheck با نام \fBVAR\fP و مقدار \fBVALUE\fP تنظیم می‌کند که می‌تواند در خطوط \fBCHECK:\fP استفاده شود. .UNINDENT .INDENT 0.0 .TP .B \-D#,= یک متغیر عددی filecheck به نام \fBNUMVAR\fP با قالب تطبیق \fBFMT\fP را برابر با نتیجهٔ ارزیابی \fB\fP قرار می‌دهد که می‌تواند در خطوط \fBCHECK:\fP استفاده شود. برای جزئیات در مورد عبارت‌های عددی پشتیبانی‌شده، بخش \fBFileCheck Numeric Variables and Expressions\fP را ببینید. .UNINDENT .INDENT 0.0 .TP .B \-version شماره نسخهٔ این برنامه را نمایش می‌دهد. .UNINDENT .INDENT 0.0 .TP .B \-v تطبیق‌های موفقیت‌آمیز الگوی دستورالعمل‌ها را چاپ می‌کند. با این حال، اگر \fB\-dump\-input=fail\fP یا \fB\-dump\-input=always\fP تنظیم شده باشد، این تطبیق‌ها به عنوان حاشیه‌نویسی‌های ورودی افزوده می‌شوند. .UNINDENT .INDENT 0.0 .TP .B \-vv اطلاعات مفیدی را برای عیب‌یابی مسائل داخلی FileCheck چاپ می‌کند، مانند تطبیق‌های هم‌پوشان نادیده‌گرفته‌شدهٔ \fBCHECK\-DAG:\fP، تطبیق‌های الگوی ضمنی EOF، و الگوهای \fBCHECK\-NOT:\fP که تطبیقی ندارند. مستلزم \fB\-v\fP است. با این حال، اگر \fB\-dump\-input=fail\fP یا \fB\-dump\-input=always\fP تنظیم شده باشد، این اطلاعات را صرفاً به عنوان حاشیه‌نویسی‌های ورودی اضافه می‌کند. .UNINDENT .INDENT 0.0 .TP .B \-\-allow\-deprecated\-dag\-overlap هم‌پوشانی بین تطبیق‌ها را در گروهی از دستورالعمل‌های متوالی \fBCHECK\-DAG:\fP فعال می‌کند. این گزینه منسوخ شده است و صرفاً برای راحتی در حین انتقال آزمون‌های قدیمی به پیاده‌سازی جدید غیرهم‌پوشان \fBCHECK\-DAG:\fP ارائه شده است. .UNINDENT .INDENT 0.0 .TP .B \-\-allow\-empty بررسی ورودی خالی را مجاز می‌داند. به‌طور پیش‌فرض، ورودی خالی رد می‌شود. .UNINDENT .INDENT 0.0 .TP .B \-\-color استفاده از رنگ‌ها در خروجی (به‌طور پیش‌فرض خودکار شناسایی می‌شود). .UNINDENT .SH "وضعیت خروج (EXIT STATUS)" .sp اگر \fBFileCheck\fP تأیید کند که فایل با محتوای مورد انتظار مطابقت دارد، با وضعیت 0 خارج می‌شود. در غیر این صورت، یا در صورت وقوع یک خطا، با یک مقدار غیرصفر خارج خواهد شد. .SH "آموزش (TUTORIAL)" .sp ابزار FileCheck معمولاً در آزمون‌های رگرسیون LLVM استفاده می‌شود و در خط RUN آزمون فراخوانی می‌گردد. یک مثال ساده از استفاده از FileCheck در یک خط RUN به این صورت است: .INDENT 0.0 .INDENT 3.5 .sp .EX ; RUN: llvm\-as < %s | llc \-march=x86\-64 | FileCheck %s .EE .UNINDENT .UNINDENT .sp این نحو بیان می‌کند که فایل جاری (\(dq\fB%s\fP\(dq) به \fBllvm\-as\fP هدایت (pipe) شود، آن به \fBllc\fP منتقل گردد، و سپس خروجی \fBllc\fP به \fBFileCheck\fP ارسال شود. این بدین معناست که FileCheck ورودی استاندارد خود (خروجی llc) را در برابر نام فایل مشخص‌شده به عنوان آرگومان (فایل اصلی \fB\&.ll\fP که با \(dq\fB%s\fP\(dq مشخص شده) بررسی خواهد کرد. برای درک نحوهٔ کارکرد آن، نگاهی به بقیهٔ فایل \fB\&.ll\fP (بعد از خط RUN) می‌اندازیم: .INDENT 0.0 .INDENT 3.5 .sp .EX define void @sub1(i32* %p, i32 %v) { entry: ; CHECK: sub1: ; CHECK: subl %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v) ret void } define void @inc4(i64* %p) { entry: ; CHECK: inc4: ; CHECK: incq %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1) ret void } .EE .UNINDENT .UNINDENT .sp در اینجا می‌توانید خطوط \(dq\fBCHECK:\fP\(dq مشخص‌شده در کامنت‌ها را مشاهده کنید. اکنون می‌بینید که چگونه فایل به \fBllvm\-as\fP و سپس به \fBllc\fP هدایت می‌شود، و خروجی کد ماشین چیزی است که در حال بررسی آن هستیم. ابزار FileCheck خروجی کد ماشین را بررسی می‌کند تا مطمئن شود با آنچه خطوط \(dq\fBCHECK:\fP\(dq مشخص کرده‌اند، مطابقت دارد. .sp نحو خطوط \(dq\fBCHECK:\fP\(dq بسیار ساده است: آنها رشته‌های ثابتی هستند که باید به ترتیب رخ دهند. FileCheck به‌طور پیش‌فرض تفاوت‌های فاصله‌های خالی افقی را نادیده می‌گیرد (برای مثال یک فاصله می‌تواند با یک تب مطابقت داشته باشد) اما در غیر این صورت، محتوای خط \(dq\fBCHECK:\fP\(dq باید دقیقاً با چیزی در فایل آزمون مطابقت داشته باشد. .sp یک ویژگی خوب FileCheck (در مقایسه با grep) این است که امکان ادغام موارد آزمون را در گروه‌های منطقی فراهم می‌کند. به عنوان مثال، از آنجا که آزمون بالا برچسب‌های \(dq\fBsub1:\fP\(dq و \(dq\fBinc4:\fP\(dq را بررسی می‌کند، تنها زمانی تطبیق می‌یابد که یک \(dq\fBsubl\fP\(dq در بین این برچسب‌ها وجود داشته باشد. اگر در جای دیگری از فایل وجود داشت، به حساب نمی‌آمد؛ در حالی که \(dq\fBgrep subl\fP\(dq اگر \(dq\fBsubl\fP\(dq در هر کجای فایل وجود داشته باشد مطابقت پیدا می‌کند. .SS "گزینهٔ \-check\-prefix در FileCheck" .sp گزینهٔ \fI\-check\-prefix\fP در FileCheck اجازه می‌دهد چندین پیکربندی آزمون از یک فایل \fI\&.ll\fP اجرا شوند. این در بسیاری از شرایط مفید است، برای مثال، آزمایش انواع معماری‌های مختلف با \fBllc\fP\&. در اینجا یک مثال ساده آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX ; RUN: llvm\-as < %s | llc \-mtriple=i686\-apple\-darwin9 \-mattr=sse41 \e ; RUN: | FileCheck %s \-check\-prefix=X32 ; RUN: llvm\-as < %s | llc \-mtriple=x86_64\-apple\-darwin9 \-mattr=sse41 \e ; RUN: | FileCheck %s \-check\-prefix=X64 define <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind { %tmp1 = insertelement <4 x i32>; %tmp, i32 %s, i32 1 ret <4 x i32> %tmp1 ; X32: pinsrd_1: ; X32: pinsrd $1, 4(%esp), %xmm0 ; X64: pinsrd_1: ; X64: pinsrd $1, %edi, %xmm0 } .EE .UNINDENT .UNINDENT .sp در این حالت، ما در حال آزمایش این هستیم که در هر دو تولید کد ۳۲ بیتی و ۶۴ بیتی، تولید کد مورد انتظار را به دست آوریم..SS دستورالعمل \(dqCOM:\(dq .sp گاهی اوقات می‌خواهید بدون حذف کامل یک دستورالعمل FileCheck، آن را غیرفعال کنید یا می‌خواهید یادداشت‌هایی بنویسید که نام یک دستورالعمل در آن‌ها ذکر شده است. دستورالعمل \(dq\fBCOM:\fP\(dq انجام این کار را آسان می‌کند. برای مثال، ممکن است کدی مانند این داشته باشید: .INDENT 0.0 .INDENT 3.5 .sp .EX ; X32: pinsrd_1: ; X32: pinsrd $1, 4(%esp), %xmm0 ; COM: FIXME: X64 isn\(aqt working correctly yet for this part of codegen, but ; COM: X64 will have something similar to X32: ; COM: ; COM: X64: pinsrd_1: ; COM: X64: pinsrd $1, %edi, %xmm0 .EE .UNINDENT .UNINDENT .sp بدون \(dq\fBCOM:\fP\(dq، لازم بود ترکیبی از تغییر عبارت و دستکاری نگارشی دستورالعمل را به کار ببرید تا از تشخیص موارد یادداشت‌شده‌ی \(dq\fBX32:\fP\(dq و \(dq\fBX64:\fP\(dq بالا به عنوان دستورالعمل توسط FileCheck جلوگیری کنید. علاوه بر این، پیام‌های خطایابی FileCheck به گونه‌ای پیشنهاد شده‌اند که ممکن است به موارد بالا از \(dq\fBX64\fP\(dq که بدون دونقطه پایانی \(dq\fB:\fP\(dq هستند، به دلیل شباهت به غلط املایی در دستورالعمل اعتراض کنند. دور زدن همه‌ی این مشکلات برای نویسنده آزمون می‌تواند خسته‌کننده باشد و دستکاری نگارشی دستورالعمل‌ها نیز می‌تواند هدف کد آزمون را نامشخص سازد. \(dq\fBCOM:\fP\(dq از بروز تمام این مشکلات جلوگیری می‌کند. .sp چند نکته مهم درباره استفاده: .INDENT 0.0 .IP \(bu 2 قرار گرفتن \(dq\fBCOM:\fP\(dq درون الگوی یک دستورالعمل دیگر، ادامه الگو را تبدیل به یادداشت \fIنمی‌کند\fP. برای مثال: .INDENT 2.0 .INDENT 3.5 .sp .EX ; X32: pinsrd $1, 4(%esp), %xmm0 COM: This is part of the X32 pattern! .EE .UNINDENT .UNINDENT .sp اگر نیاز دارید بخشی از الگوی یک دستورالعمل را موقتاً به یادداشت تبدیل کنید، آن را به خط دیگری منتقل کنید. دلیل این است که FileCheck دستورالعمل \(dq\fBCOM:\fP\(dq را دقیقاً مشابه هر دستورالعمل دیگری تجزیه می‌کند: فقط اولین دستورالعمل موجود در خط به عنوان یک دستورالعمل شناخته می‌شود. .IP \(bu 2 به خاطر LIT، ابزار FileCheck با \(dq\fBRUN:\fP\(dq دقیقاً مانند \(dq\fBCOM:\fP\(dq رفتار می‌کند. اگر این رفتار برای محیط آزمون شما مناسب نیست، \fB\-\-comment\-prefixes\fP را ببینید\&. .IP \(bu 2 ابزار FileCheck اگر \(dq\fBCOM\fP\(dq، \(dq\fBRUN\fP\(dq یا هر پیشوند یادداشت تعریف‌شده توسط کاربر با یکی از پسوندهای معمول دستورالعمل بررسی، مانند \(dq\fB\-NEXT:\fP\(dq یا \(dq\fB\-NOT:\fP\(dq (که در ادامه شرح داده شده‌اند) ترکیب شده باشد، آن را به عنوان یک دستورالعمل یادداشت تشخیص نمی‌دهد. در عوض FileCheck با چنین ترکیبی به عنوان متن ساده رفتار می‌کند. اگر لازم است برای محیط آزمون شما به عنوان دستورالعمل یادداشت عمل کند، آن را با استفاده از \fB\-\-comment\-prefixes\fP به عنوان چنین پیشوندی تعریف کنید\&. .UNINDENT .SS دستورالعمل \(dqCHECK\-NEXT:\(dq .sp گاهی اوقات می‌خواهید خطوط را تطبیق دهید و مایلید تأیید کنید که تطابق‌ها دقیقاً در خطوط متوالی و بدون هیچ خط دیگری در میان آن‌ها رخ می‌دهند. در این حالت، می‌توانید از دستورالعمل‌های \(dq\fBCHECK:\fP\(dq و \(dq\fBCHECK\-NEXT:\fP\(dq برای مشخص کردن این موضوع استفاده کنید. اگر یک پیشوند بررسی سفارشی تعیین کرده‌اید، کافی است از \(dq\fB\-NEXT:\fP\(dq استفاده کنید. برای مثال، موردی مانند این همان‌طور که انتظار دارید کار می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX define void @t2(<2 x double>* %r, <2 x double>* %A, double %B) { %tmp3 = load <2 x double>* %A, align 16 %tmp7 = insertelement <2 x double> undef, double %B, i32 0 %tmp9 = shufflevector <2 x double> %tmp3, <2 x double> %tmp7, <2 x i32> < i32 0, i32 2 > store <2 x double> %tmp9, <2 x double>* %r, align 16 ret void ; CHECK: t2: ; CHECK: movl 8(%esp), %eax ; CHECK\-NEXT: movapd (%eax), %xmm0 ; CHECK\-NEXT: movhpd 12(%esp), %xmm0 ; CHECK\-NEXT: movl 4(%esp), %eax ; CHECK\-NEXT: movapd %xmm0, (%eax) ; CHECK\-NEXT: ret } .EE .UNINDENT .UNINDENT .sp دستورالعمل‌های \(dq\fBCHECK\-NEXT:\fP\(dq ورودی را رد می‌کنند مگر اینکه دقیقاً یک خط جدید بین آن و دستورالعمل قبلی وجود داشته باشد. یک \(dq\fBCHECK\-NEXT:\fP\(dq نمی‌تواند اولین دستورالعمل در یک فایل باشد. .SS دستورالعمل \(dqCHECK\-SAME:\(dq .sp گاهی اوقات می‌خواهید خطوط را تطبیق دهید و مایلید تأیید کنید که تطابق‌ها در همان خط تطابق قبلی رخ می‌دهند. در این حالت، می‌توانید از دستورالعمل‌های \(dq\fBCHECK:\fP\(dq و \(dq\fBCHECK\-SAME:\fP\(dq برای مشخص کردن این موضوع استفاده کنید. اگر یک پیشوند بررسی سفارشی تعیین کرده‌اید، کافی است از \(dq\fB\-SAME:\fP\(dq استفاده کنید. .sp دستورالعمل \(dq\fBCHECK\-SAME:\fP\(dq به‌ویژه در ترکیب با \(dq\fBCHECK\-NOT:\fP\(dq (توضیح داده شده در زیر) بسیار قدرتمند است. .sp برای مثال، مورد زیر طبق انتظار عمل می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX !0 = !DILocation(line: 5, scope: !1, inlinedAt: !2) ; CHECK: !DILocation(line: 5, ; CHECK\-NOT: column: ; CHECK\-SAME: scope: ![[SCOPE:[0\-9]+]] .EE .UNINDENT .UNINDENT .sp دستورالعمل‌های \(dq\fBCHECK\-SAME:\fP\(dq در صورتی که هرگونه خط جدیدی بین آن و دستورالعمل قبلی وجود داشته باشد، ورودی را رد می‌کنند. .sp دستورالعمل \(dq\fBCHECK\-SAME:\fP\(dq همچنین برای اجتناب از نوشتن تطبیق‌دهنده‌ها برای فیلدهای نامربوط کاربرد دارد. برای مثال، فرض کنید در حال نوشتن آزمونی هستید که ابزاری با خروجی‌ای مانند این را تجزیه می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX Name: foo Field1: ... Field2: ... Field3: ... Value: 1 Name: bar Field1: ... Field2: ... Field3: ... Value: 2 Name: baz Field1: ... Field2: ... Field3: ... Value: 1 .EE .UNINDENT .UNINDENT .sp برای نوشتن آزمونی که تأیید کند \fBfoo\fP مقدار \fB1\fP دارد، ممکن است ابتدا این را بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX CHECK: Name: foo CHECK: Value: 1{{$}} .EE .UNINDENT .UNINDENT .sp با این حال، این یک آزمون نامناسب خواهد بود: اگر مقدار مربوط به \fBfoo\fP تغییر کند، آزمون همچنان موفق خواهد شد زیرا خط \(dq\fBCHECK: Value: 1\fP\(dq با مقدار مربوط به \fBbaz\fP تطابق پیدا می‌کند\&. برای رفع این مشکل، می‌توانید تطبیق‌دهنده‌های \fBCHECK\-NEXT\fP را برای هر خط \fBFieldN:\fP اضافه کنید، اما این کار طولانی و پرگو خواهد بود و با اضافه شدن \fBField4\fP نیازمند به‌روزرسانی است. روشی خلاصه‌تر برای نوشتن آزمون با استفاده از تطبیق‌دهنده \(dq\fBCHECK\-SAME:\fP\(dq به شکل زیر خواهد بود: .INDENT 0.0 .INDENT 3.5 .sp .EX CHECK: Name: foo CHECK: Value: CHECK\-SAME: {{ 1$}} .EE .UNINDENT .UNINDENT .sp این بررسی تأیید می‌کند که بار \fIبعدی\fP که عبارت \(dq\fBValue:\fP\(dq در خروجی ظاهر می‌شود، دارای مقدار \fB1\fP باشد\&. .sp نکته: یک \(dq\fBCHECK\-SAME:\fP\(dq نمی‌تواند اولین دستورالعمل در یک فایل باشد..SS دستورالعمل \(dqCHECK\-EMPTY:\(dq .sp اگر نیاز دارید بررسی کنید که خط بعدی کاملاً خالی است و حتی نویسه فاصله خالی (whitespace) نیز در آن وجود ندارد، می‌توانید از دستورالعمل \(dq\fBCHECK\-EMPTY:\fP\(dq استفاده کنید. .INDENT 0.0 .INDENT 3.5 .sp .EX declare void @foo() declare void @bar() ; CHECK: foo ; CHECK\-EMPTY: ; CHECK\-NEXT: bar .EE .UNINDENT .UNINDENT .sp درست مانند \(dq\fBCHECK\-NEXT:\fP\(dq، این دستورالعمل نیز در صورتی که قبل از یافتن خط خالی بعدی بیش از یک خط جدید وجود داشته باشد شکست خواهد خورد، و نمی‌تواند اولین دستورالعمل درون یک فایل باشد. .SS دستورالعمل \(dqCHECK\-NOT:\(dq .sp دستورالعمل \(dq\fBCHECK\-NOT:\fP\(dq برای اطمینان از عدم وقوع یک رشته بین دو تطابق (یا پیش از نخستین تطابق، یا پس از آخرین تطابق) به کار می‌رود. برای مثال، جهت بررسی اینکه آیا یک بارگذاری (load) توسط یک تبدیل حذف شده است یا خیر، می‌توان از آزمونی مانند این استفاده کرد: .INDENT 0.0 .INDENT 3.5 .sp .EX define i8 @coerce_offset0(i32 %V, i32* %P) { store i32 %V, i32* %P %P2 = bitcast i32* %P to i8* %P3 = getelementptr i8* %P2, i32 2 %A = load i8* %P3 ret i8 %A ; CHECK: @coerce_offset0 ; CHECK\-NOT: load ; CHECK: ret i8 } .EE .UNINDENT .UNINDENT .SS دستورالعمل \(dqCHECK\-COUNT:\(dq .sp اگر نیاز دارید چندین خط را بارها و بارها با یک الگوی یکسان مطابقت دهید، می‌توانید یک \fBCHECK:\fP ساده را به تعداد دفعات مورد نیاز تکرار کنید. اگر این کار بیش از حد خسته‌کننده به نظر می‌رسد، می‌توانید در عوض از یک بررسی شمارش‌شده \(dq\fBCHECK\-COUNT\-:\fP\(dq استفاده کنید، که در آن \fB\fP یک عدد ده‌دهی مثبت است. این دستورالعمل الگو را دقیقاً \fB\fP بار مطابقت می‌دهد، نه بیشتر و نه کمتر. اگر یک پیشوند بررسی سفارشی تعیین کرده‌اید، کافی است برای رسیدن به همان اثر از \(dq\fB\-COUNT\-:\fP\(dq استفاده کنید. در اینجا یک مثال ساده آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX Loop at depth 1 Loop at depth 1 Loop at depth 1 Loop at depth 1 Loop at depth 2 Loop at depth 3 ; CHECK\-COUNT\-6: Loop at depth {{[0\-9]+}} ; CHECK\-NOT: Loop at depth {{[0\-9]+}} .EE .UNINDENT .UNINDENT .SS دستورالعمل \(dqCHECK\-DAG:\(dq .sp اگر تطبیق رشته‌هایی که در ترتیبی اکیداً متوالی رخ نمی‌دهند ضروری باشد، می‌توان از \(dq\fBCHECK\-DAG:\fP\(dq برای بررسی آن‌ها بین دو تطابق (یا پیش از نخستین تطابق، یا پس از آخرین تطابق) استفاده کرد. برای نمونه، clang متغیرهای سراسری vtable را به ترتیب معکوس منتشر می‌کند. با استفاده از \fBCHECK\-DAG:\fP، می‌توانیم بررسی‌ها را در ترتیب طبیعی نگه داریم: .INDENT 0.0 .INDENT 3.5 .sp .EX // RUN: %clang_cc1 %s \-emit\-llvm \-o \- | FileCheck %s struct Foo { virtual void method(); }; Foo f; // emit vtable // CHECK\-DAG: @_ZTV3Foo = struct Bar { virtual void method(); }; Bar b; // CHECK\-DAG: @_ZTV3Bar = .EE .UNINDENT .UNINDENT .sp دستورالعمل‌های \fBCHECK\-NOT:\fP می‌توانند با دستورالعمل‌های \fBCHECK\-DAG:\fP ترکیب شوند تا رشته‌های میان دستورالعمل‌های پیرامونی \fBCHECK\-DAG:\fP را مستثنی سازند. در نتیجه، دستورالعمل‌های پیرامونی \fBCHECK\-DAG:\fP نمی‌توانند بازترتیب شوند؛ یعنی تمامی رخدادهای منطبق با \fBCHECK\-DAG:\fP قبل از \fBCHECK\-NOT:\fP نباید پس از رخدادهای منطبق با \fBCHECK\-DAG:\fP بعد از \fBCHECK\-NOT:\fP قرار گیرند\&. به عنوان مثال، .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK\-DAG: BEFORE ; CHECK\-NOT: NOT ; CHECK\-DAG: AFTER .EE .UNINDENT .UNINDENT .sp این حالت، رشته‌های ورودی‌ای را که در آن‌ها \fBBEFORE\fP بعد از \fBAFTER\fP رخ دهد، رد خواهد کرد\&. .sp با متغیرهای ثبت‌شده، \fBCHECK\-DAG:\fP قادر است ترتیب‌های توپولوژیکی معتبر یک DAG را با یال‌هایی از تعریف یک متغیر تا استفاده از آن تطبیق دهد. این قابلیت برای مثال هنگامی مفید است که نمونه آزمون‌های شما باید با دنباله‌های خروجی متفاوتی از زمان‌بند دستورالعمل‌ها (instruction scheduler) مطابقت داشته باشند. برای نمونه، .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK\-DAG: add [[REG1:r[0\-9]+]], r1, r2 ; CHECK\-DAG: add [[REG2:r[0\-9]+]], r3, r4 ; CHECK: mul r5, [[REG1]], [[REG2]] .EE .UNINDENT .UNINDENT .sp در این حالت، هر ترتیبی از آن دو دستورالعمل \fBadd\fP مجاز خواهد بود. .sp اگر متغیرها را در یک بلوک \fBCHECK\-DAG:\fP هم تعریف \fIو هم\fP استفاده می‌کنید، توجه داشته باشید که قاعده تعریف می‌تواند \fIپس از\fP استفاده از آن تطبیق یابد. .sp بنابراین، برای مثال، کد زیر موفق خواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK\-DAG: vmov.32 [[REG2:d[0\-9]+]][0] ; CHECK\-DAG: vmov.32 [[REG2]][1] vmov.32 d0[1] vmov.32 d0[0] .EE .UNINDENT .UNINDENT .sp در حالی که این کد دیگر، موفق نخواهد شد: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK\-DAG: vmov.32 [[REG2:d[0\-9]+]][0] ; CHECK\-DAG: vmov.32 [[REG2]][1] vmov.32 d1[1] vmov.32 d0[0] .EE .UNINDENT .UNINDENT .sp هرچند این قابلیت می‌تواند بسیار سودمند باشد، اما خطرناک نیز هست؛ زیرا در خصوص توالی ثبات‌ها، شما باید ترتیبی اکید داشته باشید (خواندن قبل از نوشتن، رونوشت قبل از استفاده و غیره). اگر تعریفی که آزمون شما به دنبال آن است مطابقت پیدا نکند (به دلیل وجود باگ در کامپایلر)، ممکن است در جایی بسیار دورتر از محل استفاده تطبیق یابد و باگ‌های واقعی را پنهان کند. .sp در این موارد، برای تحمیل ترتیب، از یک دستورالعمل غیر DAG بین بلوک‌های DAG استفاده کنید. .sp یک دستورالعمل \fBCHECK\-DAG:\fP از تطابق‌هایی که با تطابق‌های هر یک از دستورالعمل‌های پیشین \fBCHECK\-DAG:\fP در همان بلوک \fBCHECK\-DAG:\fP هم‌پوشانی داشته باشند صرف‌نظر می‌کند. این رفتار عدم هم‌پوشانی نه تنها با سایر دستورالعمل‌ها سازگار است، بلکه برای مدیریت مجموعه‌هایی از رشته‌ها یا الگوهای غیریکتا نیز ضروری است. به عنوان مثال، دستورالعمل‌های زیر به دنبال ورودی‌های لاگ بدون ترتیب برای دو وظیفه در یک برنامه موازی، مانند محیط زمان اجرای OpenMP هستند: .INDENT 0.0 .INDENT 3.5 .sp .EX // CHECK\-DAG: [[THREAD_ID:[0\-9]+]]: task_begin // CHECK\-DAG: [[THREAD_ID]]: task_end // // CHECK\-DAG: [[THREAD_ID:[0\-9]+]]: task_begin // CHECK\-DAG: [[THREAD_ID]]: task_end .EE .UNINDENT .UNINDENT .sp تضمین می‌شود که جفت دوم دستورالعمل‌ها با همان ورودی‌های لاگ منطبق با جفت اول مطابقت پیدا نکنند، حتی با اینکه الگوها یکسان هستند و حتی اگر متن ورودی‌های لاگ به دلیل استفاده مجدد از شناسه thread کاملاً یکسان باشد..SS دستورالعمل \(dqCHECK\-LABEL:\(dq .sp گاهی در فایلی که شامل چندین آزمون تقسیم‌شده به بلوک‌های منطقی است، یک یا چند دستورالعمل \fBCHECK:\fP ممکن است به‌طور ناخواسته با تطبیق خطوط در یک بلوک بعدی با موفقیت انجام شوند. در حالی که معمولاً در نهایت خطایی ایجاد خواهد شد، بررسی نشانه‌گذاری‌شده به‌عنوان عامل خطا ممکن است در عمل هیچ ارتباطی با منبع واقعی مشکل نداشته باشد. .sp برای ایجاد پیام‌های خطای بهتر در این موارد، می‌توان از دستورالعمل \(dq\fBCHECK\-LABEL:\fP\(dq استفاده کرد. با این دستورالعمل دقیقاً مانند یک دستورالعمل معمولی \fBCHECK\fP رفتار می‌شود، با این تفاوت که FileCheck این فرض اضافی را در نظر می‌گیرد که خط تطبیق‌یافته توسط این دستورالعمل نمی‌تواند با هیچ بررسی دیگری موجود در \fBmatch\-filename\fP نیز تطبیق یابد؛ این قابلیت برای خطوط حاوی برچسب‌ها یا سایر شناسه‌های منحصربه‌فرد در نظر گرفته شده است. از نظر مفهومی، وجود \fBCHECK\-LABEL\fP جریان ورودی را به بلوک‌های مجزایی تقسیم می‌کند که هر کدام به‌طور مستقل پردازش می‌شوند و از تطبیق یک دستورالعمل \fBCHECK:\fP در یک بلوک با خطی در بلوک دیگر جلوگیری می‌نماید. اگر \fB\-\-enable\-var\-scope\fP فعال باشد، تمام متغیرهای محلی در ابتدای بلوک پاک می‌شوند. .sp به عنوان مثال، .INDENT 0.0 .INDENT 3.5 .sp .EX define %struct.C* @C_ctor_base(%struct.C* %this, i32 %x) { entry: ; CHECK\-LABEL: C_ctor_base: ; CHECK: mov [[SAVETHIS:r[0\-9]+]], r0 ; CHECK: bl A_ctor_base ; CHECK: mov r0, [[SAVETHIS]] %0 = bitcast %struct.C* %this to %struct.A* %call = tail call %struct.A* @A_ctor_base(%struct.A* %0) %1 = bitcast %struct.C* %this to %struct.B* %call2 = tail call %struct.B* @B_ctor_base(%struct.B* %1, i32 %x) ret %struct.C* %this } define %struct.D* @D_ctor_base(%struct.D* %this, i32 %x) { entry: ; CHECK\-LABEL: D_ctor_base: .EE .UNINDENT .UNINDENT .sp استفاده از دستورالعمل‌های \fBCHECK\-LABEL:\fP در این حالت تضمین می‌کند که سه دستورالعمل \fBCHECK:\fP تنها خطوط مربوط به بدنهٔ تابع \fB@C_ctor_base\fP را می‌پذیرند، حتی اگر الگوها با خطوطی که بعداً در فایل یافت می‌شوند مطابقت داشته باشند. علاوه بر این، اگر یکی از این سه دستورالعمل \fBCHECK:\fP ناموفق باشد، FileCheck با رفتن به بلوک بعدی بازیابی می‌شود و این امکان را می‌دهد که چندین شکست آزمون در یک بار اجرا شناسایی شوند. .sp هیچ الزامی وجود ندارد که دستورالعمل‌های \fBCHECK\-LABEL:\fP حاوی رشته‌هایی باشند که با برچسب‌های نحوی واقعی در یک زبان مبدأ یا خروجی مطابقت دارند: آن‌ها تنها باید به‌طور منحصربه‌فرد با یک خط منفرد در فایلِ در حال اعتبارسنجی تطبیق یابند. .sp دستورالعمل‌های \fBCHECK\-LABEL:\fP نمی‌توانند حاوی تعریف یا استفاده از متغیرها باشند. .SS اصلاح‌کننده‌های دستورالعمل .sp یک اصلاح‌کنندهٔ دستورالعمل را می‌توان با قرار دادن \fB{}\fP به دنبال دستورالعمل اضافه کرد، که در آن تنها مقدار پشتیبانی‌شده برای \fB\fP مقدار \fBLITERAL\fP\& است. .sp اصلاح‌کنندهٔ دستورالعمل \fBLITERAL\fP می‌تواند برای انجام یک تطبیق تحت‌اللفظی (literal) استفاده شود. این اصلاح‌کننده باعث می‌شود دستورالعمل هیچ نحوی را برای انجام تطبیق با عبارت باقاعده (regex)، ضبط متغیر یا هرگونه جایگزینی تشخیص ندهد. این قابلیت زمانی مفید است که در غیر این صورت، متن مورد نظر برای تطبیق نیازمند کاراکترهای گریز (escaping) بیش از حد باشد. برای مثال، موارد زیر به جای در نظر گرفتن عبارات به عنوان عبارات باقاعده، تطبیق‌های تحت‌اللفظی انجام می‌دهند: .INDENT 0.0 .INDENT 3.5 .sp .EX Input: [[[10, 20]], [[30, 40]]] Output %r10: [[10, 20]] Output %r10: [[30, 40]] ; CHECK{LITERAL}: [[[10, 20]], [[30, 40]]] ; CHECK\-DAG{LITERAL}: [[30, 40]] ; CHECK\-DAG{LITERAL}: [[10, 20]] .EE .UNINDENT .UNINDENT .SS نحو تطبیق عبارت باقاعده در FileCheck .sp تمام دستورالعمل‌های FileCheck الگویی را برای تطبیق می‌پذیرند. برای بیشتر استفاده‌های FileCheck، تطبیق رشتهٔ ثابت کاملاً کافی است. برای برخی موارد، شکل انعطاف‌پذیرتری از تطبیق مورد نظر است. برای پشتیبانی از این موضوع، FileCheck به شما امکان می‌دهد عبارات باقاعده را در رشته‌های تطبیق مشخص کنید، که توسط دو جفت‌آکولاد محصور می‌شوند: \fB{{yourregex}}\fP\&. برنامه FileCheck یک تطبیق‌دهندهٔ عبارت باقاعده POSIX را پیاده‌سازی می‌کند؛ این برنامه از عبارات باقاعده توسعه‌یافته POSIX (ERE) پشتیبانی می‌نماید. از آنجا که می‌خواهیم برای بیشتر کارهایمان از تطبیق رشتهٔ ثابت استفاده کنیم، FileCheck طوری طراحی شده است که از ترکیب و انطباقِ تطبیق رشتهٔ ثابت با عبارات باقاعده پشتیبانی کند. این ویژگی به شما اجازه می‌دهد مواردی مانند این را بنویسید: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: movhpd {{[0\-9]+}}(%esp), {{%xmm[0\-7]}} .EE .UNINDENT .UNINDENT .sp در این حالت، هر آفستی از ثبات ESP مجاز خواهد بود و هر ثبات xmm نیز پذیرفته می‌شود. .sp از آنجا که عبارات باقاعده درون دو جفت‌آکولاد قرار می‌گیرند، از نظر بصری متمایز هستند و نیازی نیست مانند زبان C از کاراکترهای گریز درون دو آکولاد استفاده کنید. در موارد نادری که می‌خواهید دو آکولاد را صریحاً از ورودی مطابقت دهید، می‌توانید از چیزی مانند \fB{{[}][}]}}\fP به عنوان الگوی خود استفاده کنید. یا اگر از نحو شمارش تکرار استفاده می‌کنید، برای مثال \fB[[:xdigit:]]{8}\fP برای تطبیق دقیقاً ۸ رقم هگزادسیمال، لازم است پرانتزهایی مانند این اضافه کنید: \fB{{([[:xdigit:]]{8})}}\fP تا از تداخل با آکولاد پایانی FileCheck جلوگیری شود. .SS بلوک‌های جایگزینی رشته در FileCheck .sp اغلب مفید است که یک الگو مطابقت داده شود و سپس بررسی شود که آیا دوباره بعداً در فایل تکرار می‌شود یا خیر. برای آزمون‌های تولید کد (codegen)، این کار می‌تواند برای مجاز دانستن هر ثباتی و سپس اطمینان از استفادهٔ یکپارچه از همان ثبات در ادامه مفید باشد. برای انجام این کار، \fBFileCheck\fP از بلوک‌های جایگزینی رشته پشتیبانی می‌کند که امکان تعریف متغیرهای رشته‌ای و جایگزینی آن‌ها در الگوها را فراهم می‌سازد. در اینجا یک مثال ساده آورده شده است: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: test5: ; CHECK: notw [[REGISTER:%[a\-z]+]] ; CHECK: andw {{.*}}[[REGISTER]] .EE .UNINDENT .UNINDENT .sp خط بررسی اول با عبارت باقاعدهٔ \fB%[a\-z]+\fP مطابقت پیدا می‌کند و آن را در متغیر رشته‌ای \fBREGISTER\fP ضبط می‌نماید. خط دوم بررسی می‌کند که هر مقداری که در \fBREGISTER\fP قرار دارد، بعداً در فایل پس از یک \(dq\fBandw\fP\(dq ظاهر شود. بلوک‌های جایگزینی رشتهٔ \fBFileCheck\fP همیشه در جفت‌های \fB[[ ]]\fP قرار می‌گیرند، و نام متغیرهای رشته‌ای می‌توانند با عبارت باقاعدهٔ \fB\e$[a\-zA\-Z_][a\-zA\-Z0\-9_]*\fP تشکیل شوند. اگر بعد از نام دو نقطه بیاید، این یک تعریف متغیر است؛ در غیر این صورت، یک جایگزینی به حساب می‌آید. .sp متغیرهای \fBFileCheck\fP می‌توانند چندین بار تعریف شوند و جایگزینی‌ها همیشه آخرین مقدار را دریافت می‌کنند. همچنین متغیرها می‌توانند بعداً در همان خطی که تعریف شده‌اند جایگزین شوند. به عنوان مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: op [[REG:r[0\-9]+]], [[REG]] .EE .UNINDENT .UNINDENT .sp این ساختار می‌تواند زمانی مفید باشد که بخواهید عملوندهای \fBop\fP ثباتی یکسان باشند، و اهمیتی ندهید که دقیقاً کدام ثبات است. .sp اگر \fB\-\-enable\-var\-scope\fP اعمال شده باشد، متغیرهایی که نام آن‌ها با \fB$\fP شروع می‌شود، متغیر سراسری (global) در نظر گرفته می‌شوند. تمام متغیرهای دیگر محلی (local) هستند. تمام متغیرهای محلی در ابتدای هر بلوک CHECK\-LABEL نامعین (undefined) می‌شوند. متغیرهای سراسری تحت تأثیر CHECK\-LABEL قرار نمی‌گیرند. این امر اطمینان حاصل کردن از اینکه آزمون‌های مجزا تحت تأثیر متغیرهای تنظیم‌شده در آزمون‌های قبلی قرار نگیرند را ساده‌تر می‌سازد..SS بلوک‌های جایگزینی عددی FileCheck .sp ابزار \fBFileCheck\fP همچنین از بلوک‌های جایگزینی عددی پشتیبانی می‌کند که امکان تعریف متغیرهای عددی و تطبیق با مقادیر عددی که قید یک عبارت عددی را بر پایه آن متغیرها ارضا می‌کنند، از طریق یک جایگزینی عددی فراهم می‌سازد. این امر به دستورالعمل‌های \fBCHECK:\fP اجازه می‌دهد تا یک رابطه عددی میان دو عدد را راستی‌آزمایی کنند، مانند نیاز به استفاده از ثبات‌های متوالی. .sp نحو ثبت و دریافت یک مقدار عددی به صورت \fB[[#%,:]]\fP است که در آن: .INDENT 0.0 .IP \(bu 2 \fB%,\fP یک مشخص‌کننده اختیاری قالب است که قالب عددی برای تطبیق و حداقل تعداد ارقام مورد انتظار را تعیین می‌کند. .IP \(bu 2 \fB:\fP تعریفی اختیاری برای متغیر \fB\fP از روی مقدار ثبت‌شده است. .UNINDENT .sp نحو \fB\fP به صورت \fB#.\fP است که در آن: .INDENT 0.0 .IP \(bu 2 \fB#\fP پرچمی اختیاری برای مقادیر هگزادسیمال (hex) است (بخش \fB\fP در ادامه را ببینید) که نیازمند پیشوند \fB0x\fP برای مقدار تطبیق‌یافته است. .IP \(bu 2 \fB\&.\fP یک مشخص‌کننده دقت اختیاری به سبک printf است که در آن \fB\fP حداقل تعداد ارقامی را که مقدار تطبیق‌یافته باید داشته باشد نشان می‌دهد، و در صورت لزوم صفرهای ابتدایی را انتظار دارد. .IP \(bu 2 \fB\fP یک مشخص‌کننده تبدیل اختیاری به سبک scanf است تا مشخص کند چه قالبی از عدد باید تطبیق داده شود (مانند یک عدد هگز). در حال حاضر مشخص‌کننده‌های قالب پذیرفته‌شده \fB%u\fP، \fB%d\fP، \fB%x\fP و \fB%X\fP هستند. در صورت عدم ذکر، مشخص‌کننده قالب به طور پیش‌فرض \fB%u\fP خواهد بود. .UNINDENT .sp به عنوان مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: mov r[[#REG:]], 0x[[#%.8X,ADDR:]] .EE .UNINDENT .UNINDENT .sp با \fBmov r5, 0x0000FEFE\fP تطبیق می‌یابد و مقدار \fBREG\fP را برابر \fB5\fP و \fBADDR\fP را برابر \fB0xFEFE\fP قرار می‌دهد. توجه داشته باشید که به علت مشخص‌کننده دقت، این الگو با \fBmov r5, 0xFEFE\fP مطابقت نخواهد داشت. .sp به عنوان نتیجه‌ای از اختیاری بودن تعریف متغیر عددی، این امکان وجود دارد که صرفاً حضور یک مقدار عددی در یک قالب معین بررسی شود. این ویژگی زمانی که خود مقدار اهمیتی ندارد می‌تواند مفید باشد، برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK\-NOT: mov r0, r[[#]] .EE .UNINDENT .UNINDENT .sp برای بررسی اینکه یک مقدار به جای انتقال یافتن، ساخته (تولید) شده است. .sp نحو یک جایگزینی عددی به صورت \fB[[#%, ]]\fP است که در آن: .INDENT 0.0 .IP \(bu 2 \fB\fP همان مشخص‌کننده قالب مورد استفاده برای تعریف متغیر است، اما در این زمینه نشان می‌دهد که مقدار عبارت عددی چگونه باید تطبیق داده شود. در صورت عدم ذکر، هر دو مؤلفه مشخص‌کننده قالب از قالب تطبیق متغیر(های) عددی استفاده‌شده در قید عبارت (در صورت وجود) استنتاج می‌شوند، و در صورت عدم استفاده از متغیرهای عددی به طور پیش‌فرض \fB%u\fP در نظر گرفته می‌شود که نشان‌دهنده بدون علامت بودن مقدار و بدون صفرهای ابتدایی است. در صورت بروز تعارض میان مشخص‌کننده‌های قالب چند متغیر عددی، مشخص‌کننده تبدیل اجباری می‌شود اما مشخص‌کننده دقت اختیاری باقی می‌ماند. .IP \(bu 2 \fB\fP قیدی است که نحوه ارتباط مقدار مورد تطبیق با مقدار عبارت عددی را بیان می‌کند. تنها قید پذیرفته‌شده کنونی \fB==\fP برای تطبیق دقیق است که در صورت مشخص نشدن \fB\fP پیش‌فرض خواهد بود. در صورتی که \fB\fP خالی باشد، نباید هیچ قید تطبیقی مشخص شود. .IP \(bu 2 \fB\fP یک عبارت است. یک عبارت نیز به نوبه خود به صورت بازگشتی به این شکل تعریف می‌شود: .INDENT 2.0 .IP \(bu 2 یک عملوند عددی، یا .IP \(bu 2 یک عبارت به همراه یک عملگر و یک عملوند عددی پس از آن. .UNINDENT .sp یک عملوند عددی می‌تواند یک متغیر عددی از پیش تعریف‌شده، یک لیترال عدد صحیح یا یک تابع باشد. فاصله‌ها قبل، بعد و میان هر یک از این عناصر پذیرفته می‌شوند. عملوندهای عددی دارای دقت ۶۴ بیتی هستند. سرریز و زیرریز رد می‌شوند. هیچ اولویتی برای عملگرها وجود ندارد، اما برای تغییر ترتیب ارزیابی می‌توان از پرانتزها استفاده کرد. .UNINDENT .sp عملگرهای پشتیبانی‌شده عبارتند از: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB+\fP \- حاصل جمع دو عملوند خود را برمی‌گرداند. .IP \(bu 2 \fB\-\fP \- تفاضل دو عملوند خود را برمی‌گرداند. .UNINDENT .UNINDENT .UNINDENT .sp نحو فراخوانی تابع به صورت \fB()\fP است که در آن: .INDENT 0.0 .IP \(bu 2 \fBname\fP یک رشته لیترال از پیش تعریف‌شده است. مقادیر مجاز عبارتند از: .INDENT 2.0 .IP \(bu 2 add \- حاصل جمع دو عملوند خود را برمی‌گرداند. .IP \(bu 2 div \- خارج‌قسمت تقسیم دو عملوند خود را برمی‌گرداند. .IP \(bu 2 max \- بزرگ‌ترین مقدار از میان دو عملوند خود را برمی‌گرداند. .IP \(bu 2 min \- کوچک‌ترین مقدار از میان دو عملوند خود را برمی‌گرداند. .IP \(bu 2 mul \- حاصل‌ضرب دو عملوند خود را برمی‌گرداند. .IP \(bu 2 sub \- تفاضل دو عملوند خود را برمی‌گرداند. .UNINDENT .IP \(bu 2 \fB\fP فهرستی از عبارت‌هاست که با کاما از هم جدا شده‌اند. .UNINDENT .sp به عنوان مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: load r[[#REG:]], [r0] ; CHECK: load r[[#REG+1]], [r1] ; CHECK: Loading from 0x[[#%x,ADDR:]] ; CHECK\-SAME: to 0x[[#ADDR + 7]] .EE .UNINDENT .UNINDENT .sp مثال بالا با متن زیر مطابقت دارد: .INDENT 0.0 .INDENT 3.5 .sp .EX load r5, [r0] load r6, [r1] Loading from 0xa0463440 to 0xa0463447 .EE .UNINDENT .UNINDENT .sp اما با این متن مطابقت نخواهد داشت: .INDENT 0.0 .INDENT 3.5 .sp .EX load r5, [r0] load r7, [r1] Loading from 0xa0463440 to 0xa0463443 .EE .UNINDENT .UNINDENT .sp به این دلیل که مقدار \fB7\fP با \fB5 + 1\fP برابر نیست و مقدار \fBa0463443\fP نیز با \fBa0463440 + 7\fP برابری نمی‌کند. .sp یک متغیر عددی همچنین می‌تواند با نتیجه یک عبارت عددی مقداردهی شود، که در این حالت قید عبارت عددی بررسی شده و در صورت تأیید، مقدار به متغیر تخصیص می‌یابد. بنابراین نحو یکپارچه برای بررسی یک عبارت عددی و ثبت مقدار آن در یک متغیر عددی به صورت \fB[[#%,: ]]\fP با اجزایی همان‌گونه که قبلاً شرح داده شد خواهد بود. می‌توان با استفاده از متغیرها به جای مقادیر، این نحو را برای خودتوصیف‌تر کردن یک مورد آزمون (testcase) به کار برد: .INDENT 0.0 .INDENT 3.5 .sp .EX ; CHECK: mov r[[#REG_OFFSET:]], 0x[[#%X,FIELD_OFFSET:12]] ; CHECK\-NEXT: load r[[#]], [r[[#REG_BASE:]], r[[#REG_OFFSET]]] .EE .UNINDENT .UNINDENT .sp که با این متن تطبیق پیدا می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .EX mov r4, 0xC load r6, [r5, r4] .EE .UNINDENT .UNINDENT .sp گزینه \fB\-\-enable\-var\-scope\fP همان تأثیری را بر متغیرهای عددی دارد که بر روی متغیرهای رشته‌ای می‌گذارد. .sp نکته مهم: در پیاده‌سازی کنونی، یک عبارت نمی‌تواند از متغیر عددی که پیش‌تر در همان دستورالعمل CHECK تعریف شده است استفاده کند..SS متغیرهای شبه‌عددی FileCheck .sp گاهی نیاز است خروجی‌ای که شامل شماره خطوط فایل تطابق است بررسی و تأیید شود؛ برای نمونه هنگام آزمایش پیام‌های تشخیصی کامپایلر (compiler diagnostics). این امر نوعی شکنندگی در ساختار فایل تطابق ایجاد می‌کند، چرا که خطوط \(dq\fBCHECK:\fP\(dq حاوی شماره خطوط مطلق در همان فایل هستند که باید با هر بار تغییر شماره خطوط در پی افزودن یا حذف متن، به‌روزرسانی شوند. .sp برای پشتیبانی از این حالت، عبارات FileCheck متغیر شبه‌عددی \fB@LINE\fP را درک می‌کنند که به شماره خطِ الگوی CHECK که در آن قرار دارد ارزیابی می‌شود. .sp بدین ترتیب، الگوهای تطابق می‌توانند در نزدیکی خطوط آزمون مربوطه قرار گیرند و شامل ارجاعات نسبی به شماره خطوط باشند؛ برای مثال: .INDENT 0.0 .INDENT 3.5 .sp .EX // CHECK: test.cpp:[[# @LINE + 4]]:6: error: expected \(aq;\(aq after top level declarator // CHECK\-NEXT: {{^int a}} // CHECK\-NEXT: {{^ \e^}} // CHECK\-NEXT: {{^ ;}} int a .EE .UNINDENT .UNINDENT .sp برای پشتیبانی از کاربردهای قدیمی \fB@LINE\fP به عنوان یک متغیر رشته‌ای ویژه، \fBFileCheck\fP همچنین استفاده‌های زیر از \fB@LINE\fP را با نحو بلوک جایگزینی رشته می‌پذیرد: \fB[[@LINE]]\fP، \fB[[@LINE+]]\fP و \fB[[@LINE\-]]\fP بدون هیچ فاصله‌ای درون براکت‌ها، جایی که \fBoffset\fP یک عدد صحیح است. .SS تطبیق نویسه‌های خط جدید .sp برای تطبیق نویسه‌های خط جدید در عبارت‌های منظم، می‌توان از ردهٔ نویسه‌ای \fB[[:space:]]\fP استفاده کرد. برای نمونه، الگوی زیر: .INDENT 0.0 .INDENT 3.5 .sp .EX // CHECK: DW_AT_location [DW_FORM_sec_offset] ([[DLOC:0x[0\-9a\-f]+]]){{[[:space:]].*}}\(dqintd\(dq .EE .UNINDENT .UNINDENT .sp با خروجی‌ای به شکل زیر (از llvm\-dwarfdump) مطابقت دارد: .INDENT 0.0 .INDENT 3.5 .sp .EX DW_AT_location [DW_FORM_sec_offset] (0x00000233) DW_AT_name [DW_FORM_strp] ( .debug_str[0x000000c9] = \(dqintd\(dq) .EE .UNINDENT .UNINDENT .sp و به ما امکان می‌دهد متغیر \fBDLOC\fP در \fBFileCheck\fP را برابر با مقدار دلخواه \fB0x00000233\fP که از خط بلافاصله پیش از \(dq\fBintd\fP\(dq استخراج شده است، مقداردهی کنیم. .SH "نویسندگان (AUTHORS)" توسط تیم LLVM نگهداری می‌شود (https://llvm.org). .SH "کپی‌رایت و تکثیر (COPYRIGHT)" 2003-2026, LLVM Project .\" End of generated man page.