ນີ້ແມ່ນຄໍາສັ່ງ FileCheck-3.6 ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
FileCheck - ຕົວກວດສອບໄຟລ໌ທີ່ກົງກັບຮູບແບບທີ່ມີຄວາມຍືດຫຍຸ່ນ
ສະຫຼຸບສັງລວມ
FileCheck ຊື່ໄຟລ໌ທີ່ກົງກັນ [--check-prefix=XXX] [--strict-whitespace]
ລາຍລະອຽດ
FileCheck ອ່ານສອງໄຟລ໌ (ຫນຶ່ງຈາກວັດສະດຸປ້ອນມາດຕະຖານ, ແລະຫນຶ່ງທີ່ລະບຸໄວ້ໃນເສັ້ນຄໍາສັ່ງ)
ແລະໃຊ້ອັນໜຶ່ງເພື່ອຢັ້ງຢືນອີກອັນໜຶ່ງ. ພຶດຕິກໍານີ້ແມ່ນເປັນປະໂຫຍດໂດຍສະເພາະສໍາລັບ testsuite,
ທີ່ຕ້ອງການເພື່ອກວດສອບວ່າຜົນຜະລິດຂອງເຄື່ອງມືບາງ (eg llc) ປະກອບດ້ວຍຄາດຄະເນ
ຂໍ້ມູນ (ຕົວຢ່າງ, movsd ຈາກ esp ຫຼືສິ່ງທີ່ຫນ້າສົນໃຈ). ນີ້ແມ່ນຄ້າຍຄືກັນ
ການນໍາໃຊ້ grep, ແຕ່ມັນຖືກປັບປຸງໃຫ້ເຫມາະສົມກັບການຈັບຄູ່ວັດສະດຸປ້ອນທີ່ແຕກຕ່າງກັນຫຼາຍຢູ່ໃນໄຟລ໌ດຽວໃນ a
ຄໍາສັ່ງສະເພາະ.
ໄດ້ ຊື່ໄຟລ໌ທີ່ກົງກັນ ໄຟລ໌ກໍານົດໄຟລ໌ທີ່ມີຮູບແບບທີ່ຈະກົງກັນ. ໄຟລ໌
ເພື່ອກວດສອບແມ່ນອ່ານຈາກວັດສະດຸປ້ອນມາດຕະຖານເວັ້ນເສຍແຕ່ວ່າ --input-file ທາງເລືອກແມ່ນຖືກນໍາໃຊ້.
OPTIONS
-ຊ່ວຍ ພິມບົດສະຫຼຸບຂອງຕົວເລືອກແຖວຄໍາສັ່ງ.
--check-prefix ຄຳ ນຳ ໜ້າ
FileCheck ຄົ້ນຫາເນື້ອໃນຂອງ ຊື່ໄຟລ໌ທີ່ກົງກັນ ສໍາລັບຮູບແບບທີ່ກົງກັນ. ໂດຍ
ຄ່າເລີ່ມຕົ້ນ, ຮູບແບບເຫຼົ່ານີ້ຖືກນຳໜ້າດ້ວຍ "ກວດເບິ່ງ:". ຖ້າທ່ານຕ້ອງການໃຊ້ a
ຄໍານໍາຫນ້າທີ່ແຕກຕ່າງກັນ (e. g. ເນື່ອງຈາກວ່າໄຟລ໌ປ້ອນຂໍ້ມູນດຽວກັນແມ່ນການກວດສອບຫຼາຍທີ່ແຕກຕ່າງກັນ
ເຄື່ອງມືຫຼືທາງເລືອກ), ໄດ້ --check-prefix ການໂຕ້ຖຽງອະນຸຍາດໃຫ້ທ່ານລະບຸຫນຶ່ງຫຼືຫຼາຍກວ່ານັ້ນ
ຄໍານໍາຫນ້າເພື່ອໃຫ້ກົງກັນ. ຄໍານໍາຫນ້າຫຼາຍແມ່ນເປັນປະໂຫຍດສໍາລັບການທົດສອບທີ່ອາດຈະມີການປ່ຽນແປງສໍາລັບ
ທາງເລືອກການແລ່ນທີ່ແຕກຕ່າງກັນ, ແຕ່ສາຍສ່ວນໃຫຍ່ຍັງຄົງຄືກັນ.
--input-file ຊື່ເອກະສານ
ໄຟລ໌ທີ່ຈະກວດສອບ (ຄ່າເລີ່ມຕົ້ນຂອງ stdin).
--strict-whitespace
ໂດຍຄ່າເລີ່ມຕົ້ນ, FileCheck canonicalizes input input whitespace (spaces and tabs)
ເຊິ່ງເຮັດໃຫ້ມັນບໍ່ສົນໃຈຄວາມແຕກຕ່າງເຫຼົ່ານີ້ (ຊ່ອງຫວ່າງຈະກົງກັບແຖບ). ໄດ້
--strict-whitespace argument ປິດການປະພຶດນີ້. ລໍາດັບທ້າຍຂອງເສັ້ນແມ່ນ
canonicalized ກັບ UNIX ແບບ \n ໃນທຸກຮູບແບບ.
--implicit-check-not ການກວດກາຮູບແບບ
ເພີ່ມການກວດສອບທາງລົບ implicit ສໍາລັບຮູບແບບທີ່ກໍານົດໄວ້ລະຫວ່າງການກວດສອບໃນທາງບວກ.
ທາງເລືອກທີ່ອະນຸຍາດໃຫ້ການຂຽນການທົດສອບເຂັ້ມງວດໂດຍບໍ່ມີການ stuffing ໃຫ້ເຂົາເຈົ້າດ້ວຍ ກວດເບິ່ງ-ບໍ່s.
ຍົກຕົວຢ່າງ, "--implicit-check-not ຄຳ ເຕືອນ:"ສາມາດເປັນປະໂຫຍດໃນເວລາທົດສອບການວິນິດໄສ
ຂໍ້ຄວາມຈາກເຄື່ອງມືທີ່ບໍ່ມີທາງເລືອກທີ່ຄ້າຍຄືກັນກັບ ຄາງ - ກວດສອບ. ດ້ວຍນີ້
ທາງເລືອກ FileCheck ຈະກວດສອບວ່າການປ້ອນຂໍ້ມູນບໍ່ມີຄໍາເຕືອນທີ່ບໍ່ໄດ້ກວມເອົາໂດຍ
ໃດ ກວດເບິ່ງ: ຮູບແບບ.
-ການປ່ຽນແປງ
ສະແດງຕົວເລກສະບັບຂອງໂຄງການນີ້.
ອອກ STATUS
If FileCheck ກວດສອບວ່າໄຟລ໌ກົງກັບເນື້ອໃນທີ່ຄາດວ່າຈະ, ມັນອອກດ້ວຍ 0.
ຖ້າບໍ່ດັ່ງນັ້ນ, ຖ້າບໍ່ແມ່ນ, ຫຼືຖ້າມີຂໍ້ຜິດພາດເກີດຂື້ນ, ມັນຈະອອກດ້ວຍຄ່າທີ່ບໍ່ແມ່ນສູນ.
TUTORIAL
FileCheck ຖືກນໍາໃຊ້ໂດຍປົກກະຕິຈາກການທົດສອບການຖົດຖອຍຂອງ LLVM, ຖືກເອີ້ນຢູ່ໃນເສັ້ນ RUN ຂອງ
ການທົດສອບ. ຕົວຢ່າງງ່າຍໆຂອງການໃຊ້ FileCheck ຈາກເສັ້ນ RUN ເບິ່ງຄືວ່ານີ້:
; ແລ່ນ: llvm-as < %s | llc -march=x86-64 | FileCheck %s
syntax ນີ້ບອກວ່າຈະທໍ່ໄຟລ໌ປະຈຸບັນ ("%s") ເຂົ້າໄປໃນ llvm-as, ທໍ່ນັ້ນເຂົ້າໄປໃນ llc, ຫຼັງຈາກນັ້ນ
ທໍ່ຜົນຜະລິດຂອງ llc ເຂົ້າໄປໃນ FileCheck. ນີ້ຫມາຍຄວາມວ່າ FileCheck ຈະກວດສອບມັນ
ການປ້ອນຂໍ້ມູນມາດຕະຖານ (ຜົນຜະລິດ llc) ຕໍ່ກັບອາກິວເມັນຊື່ໄຟລ໌ທີ່ລະບຸ (ຕົ້ນສະບັບ .ລ
ໄຟລ໌ທີ່ລະບຸໂດຍ "%s") ເພື່ອເບິ່ງວິທີການເຮັດວຽກນີ້, ໃຫ້ເບິ່ງສ່ວນທີ່ເຫຼືອຂອງ .ລ ເອກະສານ
(ຫຼັງຈາກເສັ້ນ RUN):
ກໍານົດ void @sub1(i32* %p, i32 %v) {
ເຂົ້າ:
; ກວດເບິ່ງ: ຍ່ອຍ 1:
; ກວດສອບ: subl
%0 = ຫາງໂທ i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v)
ret void
}
ກໍານົດ void @inc4(i64* %p) {
ເຂົ້າ:
; ກວດເບິ່ງ: inc4:
; ກວດສອບ: incq
%0 = ຫາງໂທ i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1)
ret void
}
ທີ່ນີ້ເຈົ້າສາມາດເຫັນບາງ "ກວດເບິ່ງ:" ເສັ້ນທີ່ລະບຸໄວ້ໃນຄໍາເຫັນ. ໃນປັດຈຸບັນທ່ານສາມາດເບິ່ງວິທີການໄຟລ໌
ຖືກທໍ່ເຂົ້າໄປໃນ llvm-as, ຫຼັງຈາກນັ້ນ llc, ແລະຜົນຜະລິດລະຫັດເຄື່ອງແມ່ນສິ່ງທີ່ພວກເຮົາກໍາລັງກວດສອບ.
FileCheck ກວດເບິ່ງຜົນຜະລິດລະຫັດເຄື່ອງເພື່ອກວດສອບວ່າມັນກົງກັບສິ່ງທີ່ "ກວດເບິ່ງ:"ສາຍ
ລະບຸ.
syntax ຂອງ "ກວດເບິ່ງ:" ເສັ້ນແມ່ນງ່າຍດາຍຫຼາຍ: ພວກເຂົາເປັນສາຍຄົງທີ່ຈະຕ້ອງເກີດຂື້ນໃນ
ສັ່ງ. FileCheck ເລີ່ມຕົ້ນທີ່ຈະບໍ່ສົນໃຈຄວາມແຕກຕ່າງທາງນອນຕາມລວງນອນ (ເຊັ່ນ: ຊ່ອງຫວ່າງ
ອະນຸຍາດໃຫ້ກົງກັບແຖບ) ແຕ່ຖ້າບໍ່ດັ່ງນັ້ນ, ເນື້ອໃນຂອງ ".ກວດເບິ່ງ:" ເສັ້ນແມ່ນຕ້ອງການ
ກົງກັບບາງສິ່ງທີ່ຢູ່ໃນໄຟລ໌ທົດສອບຢ່າງແທ້ຈິງ.
ສິ່ງຫນຶ່ງທີ່ສວຍງາມກ່ຽວກັບ FileCheck (ເມື່ອປຽບທຽບກັບ grep) ແມ່ນວ່າມັນອະນຸຍາດໃຫ້ປະສົມປະສານກໍລະນີທົດສອບ
ຮ່ວມກັນເປັນກຸ່ມຢ່າງມີເຫດຜົນ. ສໍາລັບຕົວຢ່າງ, ເນື່ອງຈາກວ່າການທົດສອບຂ້າງເທິງແມ່ນການກວດສອບສໍາລັບ
"ຍ່ອຍ 1:"ແລະ"inc4:"ປ້າຍຊື່, ມັນຈະບໍ່ກົງກັນເວັ້ນເສຍແຕ່ວ່າມີ "ຍ່ອຍ"ໃນລະຫວ່າງນັ້ນ
ປ້າຍກຳກັບ. ຖ້າມັນມີຢູ່ບ່ອນອື່ນໃນໄຟລ໌, ນັ້ນຈະບໍ່ນັບ: "grep ຍ່ອຍ"
ກົງກັນຖ້າ "ຍ່ອຍ" ມີຢູ່ທຸກບ່ອນໃນໄຟລ໌.
ໄດ້ FileCheck -check-prefix ທາງເລືອກ
FileCheck -check-prefix ທາງເລືອກອະນຸຍາດໃຫ້ການຕັ້ງຄ່າການທົດສອບຫຼາຍໄດ້ຮັບການຂັບເຄື່ອນຈາກ
ຫນຶ່ງ .ລ ໄຟລ໌. ນີ້ແມ່ນເປັນປະໂຫຍດໃນຫຼາຍສະຖານະການ, ສໍາລັບການຍົກຕົວຢ່າງ, ການທົດສອບທີ່ແຕກຕ່າງກັນ
variants ຖາປັດຕະຍະກັບ llc. ນີ້ແມ່ນຕົວຢ່າງທີ່ງ່າຍດາຍ:
; ແລ່ນ: llvm-as < %s | llc -mtriple=i686-apple-darwin9 -mattr=sse41 \
; ແລ່ນ: | FileCheck %s -check-prefix=X32
; ແລ່ນ: llvm-as < %s | llc -mtriple=x86_64-apple-darwin9 -mattr=sse41 \
; ແລ່ນ: | FileCheck %s -check-prefix=X64
ກໍານົດ <4 x i32> @pinsrd_1(i32 %s, <4 x i32> %tmp) nounwind {
%tmp1 = ອົງປະກອບແຊກ <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
}
ໃນກໍລະນີນີ້, ພວກເຮົາກໍາລັງທົດສອບວ່າພວກເຮົາໄດ້ຮັບການຜະລິດລະຫັດທີ່ຄາດວ່າຈະມີທັງ 32-bit ແລະ
ການສ້າງລະຫັດ 64-bit.
ໄດ້ ກວດເບິ່ງຕໍ່ໄປ: directive
ບາງຄັ້ງທ່ານຕ້ອງການຈັບຄູ່ເສັ້ນ ແລະຕ້ອງການກວດສອບວ່າກົງກັນເກີດຂຶ້ນແທ້
ສາຍຕິດຕໍ່ກັນທີ່ບໍ່ມີສາຍອື່ນຢູ່ໃນລະຫວ່າງພວກມັນ. ໃນກໍລະນີດັ່ງກ່າວນີ້, ທ່ານສາມາດນໍາໃຊ້ ".ກວດເບິ່ງ:"
ແລະ "ກວດເບິ່ງຕໍ່ໄປ:" ຄຳສັ່ງເພື່ອລະບຸອັນນີ້. ຖ້າທ່ານລະບຸຄຳນຳໜ້າການກວດສອບແບບກຳນົດເອງ,
ພຽງແຕ່ໃຊ້ "- ຕໍ່ໄປ:". ຕົວຢ່າງ, ບາງສິ່ງບາງຢ່າງເຊັ່ນນີ້ເຮັດວຽກຕາມທີ່ເຈົ້າຄາດຫວັງ:
ກຳນົດ void @t2(<2 x double>* %r, <2 x double>* %A, double %B) {
%tmp3 = ໂຫຼດ <2 x double>* %A, ຈັດຮຽງ 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 >
ຈັດເກັບ <2 x double> %tmp9, <2 x double>* %r, ຈັດຮຽງ 16
ret void
; ກວດເບິ່ງ: t2:
; ກວດສອບ: movl 8(%esp), %eax
; ກວດເບິ່ງ-ຕໍ່ໄປ: movapd (%eax), %xmm0
; ກວດເບິ່ງ-ຕໍ່ໄປ: movhpd 12(%esp), %xmm0
; ກວດເບິ່ງ-ຕໍ່ໄປ: movl 4(%esp), %eax
; ກວດເບິ່ງ-ຕໍ່ໄປ: movapd %xmm0, (%eax)
; ກວດເບິ່ງ-ຕໍ່ໄປ: ret
}
"ກວດເບິ່ງຕໍ່ໄປ:" ຄໍາສັ່ງປະຕິເສດການປ້ອນຂໍ້ມູນເວັ້ນເສຍແຕ່ວ່າມີເສັ້ນໃຫມ່ທີ່ແນ່ນອນລະຫວ່າງມັນ
ແລະຄໍາສັ່ງທີ່ຜ່ານມາ. A "ກວດເບິ່ງຕໍ່ໄປ:" ບໍ່ສາມາດເປັນຄໍາສັ່ງທໍາອິດໃນໄຟລ໌.
ໄດ້ ບໍ່ກວດ: directive
ການ "ບໍ່ກວດ:" ຄໍາສັ່ງແມ່ນໃຊ້ເພື່ອກວດສອບວ່າສະຕຣິງບໍ່ເກີດຂຶ້ນລະຫວ່າງສອງ
ການແຂ່ງຂັນ (ຫຼືກ່ອນການແຂ່ງຂັນຄັ້ງທໍາອິດ, ຫຼືຫຼັງຈາກການແຂ່ງຂັນສຸດທ້າຍ). ຕົວຢ່າງ, ເພື່ອກວດສອບວ່າ
ການໂຫຼດຖືກເອົາອອກໂດຍການຫັນປ່ຽນ, ການທົດສອບເຊັ່ນນີ້ສາມາດນໍາໃຊ້ໄດ້:
ກໍານົດ i8 @coerce_offset0(i32 %V, i32* %P) {
ເກັບຮັກສາ i32 %V, i32* %P
%P2 = bitcast i32* %P ຫາ i8*
%P3 = getelementptr i8* %P2, i32 2
%A = ໂຫຼດ i8* %P3
ret i8 %A
; ກວດເບິ່ງ: @coerce_offset0
; ກວດເບິ່ງ-ບໍ່: ໂຫຼດ
; ກວດເບິ່ງ: ret i8
}
ໄດ້ ກວດເຊັກ: directive
ຖ້າມັນຈໍາເປັນຕ້ອງຈັບຄູ່ສະຕຣິງທີ່ບໍ່ເກີດຂື້ນໃນລໍາດັບລໍາດັບຢ່າງເຂັ້ມງວດ,
"ກວດເຊັກ:"ສາມາດຖືກນໍາໃຊ້ເພື່ອກວດສອບພວກເຂົາລະຫວ່າງສອງການແຂ່ງຂັນ (ຫຼືກ່ອນການແຂ່ງຂັນຄັ້ງທໍາອິດ,
ຫຼືຫຼັງຈາກການແຂ່ງຂັນສຸດທ້າຍ). ຕົວຢ່າງ, clang emits vtable globals ໃນຄໍາສັ່ງປີ້ນກັບກັນ. ການນໍາໃຊ້
ກວດເຊັກ:, ພວກເຮົາສາມາດຮັກສາການກວດສອບໃນຄໍາສັ່ງທໍາມະຊາດ:
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
struct Foo { virtual void method(); } ;
ຟູ f; // ປ່ອຍ vtable
// CHECK-DAG: @_ZTV3Foo =
struct Bar { virtual void method(); } ;
ບາ ;
// CHECK-DAG: @_ZTV3Bar =
ບໍ່ກວດ: ຄໍາແນະນໍາສາມາດປະສົມກັບ ກວດເຊັກ: ຄໍາສັ່ງທີ່ຈະຍົກເວັ້ນສາຍລະຫວ່າງ
ອ້ອມຂ້າງ ກວດເຊັກ: ຄຳແນະນຳ. ດັ່ງນັ້ນ, ອ້ອມຂ້າງ ກວດເຊັກ: directives
ບໍ່ສາມາດໄດ້ຮັບການຈັດລໍາດັບໃຫມ່, ເຊັ່ນວ່າການເກີດຂຶ້ນທັງຫມົດທີ່ກົງກັນ ກວດເຊັກ: ກ່ອນທີ່ຈະ ບໍ່ກວດ: ບໍ່ຕ້ອງ
ຕົກຢູ່ຫລັງການປະກົດຕົວທີ່ກົງກັນ ກວດເຊັກ: ຫຼັງຈາກ ບໍ່ກວດ:ທີ່ຢູ່ ຍົກຕົວຢ່າງ,
; ກວດກາເບິ່ງ: ກ່ອນຫນ້ານັ້ນ
; ກວດເບິ່ງ-ບໍ່: ບໍ່ແມ່ນ
; ກວດສອບໄດ້: ຫຼັງຈາກ
ກໍລະນີນີ້ຈະປະຕິເສດການປ້ອນຂໍ້ມູນໃສ່ບ່ອນທີ່ ກ່ອນ ເກີດຂຶ້ນພາຍຫຼັງ AFTER.
ດ້ວຍຕົວແປທີ່ຈັບໄດ້, ກວດເຊັກ: ສາມາດກົງກັບຄໍາສັ່ງ topological ທີ່ຖືກຕ້ອງຂອງ DAG
ມີຂອບຈາກຄໍານິຍາມຂອງຕົວແປກັບການນໍາໃຊ້ຂອງມັນ. ມັນເປັນປະໂຫຍດ, e.g., ໃນເວລາທີ່ຂອງທ່ານ
ກໍລະນີທົດສອບຕ້ອງກົງກັບລໍາດັບຜົນຜະລິດທີ່ແຕກຕ່າງກັນຈາກຕາຕະລາງຄໍາແນະນໍາ. ສໍາລັບ
ຍົກຕົວຢ່າງ,
; ກວດເຊັກ: ເພີ່ມ [[REG1:r[0-9]+]], r1, r2
; ກວດເຊັກ: ເພີ່ມ [[REG2:r[0-9]+]], r3, r4
; ກວດສອບ: mul r5, [[REG1]], [[REG2]]
ໃນກໍລະນີນີ້, ຄໍາສັ່ງໃດໆຂອງສອງອັນນັ້ນ ເພີ່ມ ຄໍາແນະນໍາຈະຖືກອະນຸຍາດໃຫ້.
ຖ້າທ່ານກໍາລັງກໍານົດ ແລະ ການນໍາໃຊ້ຕົວແປໃນດຽວກັນ ກວດເຊັກ: ຕັນ, ຈົ່ງຮູ້ວ່າ
ກົດລະບຽບການກໍານົດສາມາດກົງກັນ ຫຼັງຈາກ ການນໍາໃຊ້ຂອງຕົນ.
ດັ່ງນັ້ນ, ສໍາລັບຕົວຢ່າງ, ລະຫັດຂ້າງລຸ່ມນີ້ຈະຜ່ານ:
; ກວດເບິ່ງ-DAG: vmov.32 [[REG2:d[0-9]+]][0]
; ກວດເບິ່ງ-DAG: vmov.32 [[REG2]][1]
vmov.32 d0[1]
vmov.32 d0[0]
ໃນຂະນະທີ່ລະຫັດອື່ນນີ້, ຈະບໍ່:
; ກວດເບິ່ງ-DAG: vmov.32 [[REG2:d[0-9]+]][0]
; ກວດເບິ່ງ-DAG: vmov.32 [[REG2]][1]
vmov.32 d1[1]
vmov.32 d0[0]
ໃນຂະນະທີ່ນີ້ສາມາດເປັນປະໂຫຍດຫຼາຍ, ມັນຍັງເປັນອັນຕະລາຍ, ເພາະວ່າໃນກໍລະນີຂອງການລົງທະບຽນ
ລໍາດັບ, ທ່ານຕ້ອງມີຄໍາສັ່ງທີ່ເຂັ້ມແຂງ (ອ່ານກ່ອນຂຽນ, ສໍາເນົາກ່ອນການນໍາໃຊ້, ແລະອື່ນໆ). ຖ້າ
ຄໍານິຍາມການທົດສອບຂອງທ່ານກໍາລັງຊອກຫາບໍ່ກົງກັນ (ເນື່ອງຈາກວ່າມີຂໍ້ຜິດພາດໃນ compiler), ມັນ
ອາດຈະກົງກັນໄກຈາກການນໍາໃຊ້, ແລະປິດບັງແມງໄມ້ທີ່ແທ້ຈິງອອກໄປ.
ໃນກໍລະນີເຫຼົ່ານັ້ນ, ເພື່ອບັງຄັບຄໍາສັ່ງ, ໃຊ້ຄໍາສັ່ງທີ່ບໍ່ແມ່ນ DAG ລະຫວ່າງ DAG-blocks.
ໄດ້ ກວດເຊັກປ້າຍຊື່: directive
ບາງຄັ້ງໃນໄຟລ໌ທີ່ມີການທົດສອບຫຼາຍອັນແບ່ງອອກເປັນຕັນຢ່າງມີເຫດຜົນ, ຫນຶ່ງ ຫຼືຫຼາຍກວ່ານັ້ນ
ກວດເບິ່ງ: ຄໍາແນະນໍາອາດຈະປະສົບຜົນສໍາເລັດໂດຍບໍ່ໄດ້ຕັ້ງໃຈໂດຍການຈັບຄູ່ເສັ້ນໃນບລັອກຕໍ່ມາ. ໃນຂະນະທີ່ ກ
ປົກກະຕິແລ້ວຄວາມຜິດພາດຈະຖືກສ້າງຂື້ນ, ການກວດສອບຖືກທຸງວ່າເປັນການເຮັດໃຫ້ເກີດຄວາມຜິດພາດ
ຕົວຈິງແລ້ວຮັບຜິດຊອບການພົວພັນໃດໆກັບແຫຼ່ງທີ່ແທ້ຈິງຂອງບັນຫາ.
ເພື່ອຜະລິດຂໍ້ຄວາມຄວາມຜິດພາດທີ່ດີກວ່າໃນກໍລະນີເຫຼົ່ານີ້, "ກວດເຊັກປ້າຍຊື່:"ຄໍາສັ່ງສາມາດ
ຖືກນໍາໃຊ້. ມັນໄດ້ຖືກປະຕິບັດຢ່າງດຽວກັນກັບປົກກະຕິ CHECK ຄໍາສັ່ງຍົກເວັ້ນທີ່ FileCheck ເຮັດ
ສົມມຸດຕິຖານເພີ່ມເຕີມວ່າເສັ້ນທີ່ກົງກັນໂດຍຄໍາສັ່ງບໍ່ສາມາດຖືກຈັບຄູ່ໂດຍ
ການກວດສອບອື່ນໆທີ່ມີຢູ່ໃນ ຊື່ໄຟລ໌ທີ່ກົງກັນ; ນີ້ມີຈຸດປະສົງເພື່ອນໍາໃຊ້ສໍາລັບສາຍ
ມີປ້າຍກຳກັບ ຫຼືຕົວລະບຸທີ່ເປັນເອກະລັກອື່ນໆ. ແນວຄວາມຄິດ, ການປະກົດຕົວຂອງ ກວດເຊັກ-LABEL
ແບ່ງກະແສການປ້ອນຂໍ້ມູນອອກເປັນທ່ອນໄມ້ແຍກຕ່າງຫາກ, ແຕ່ລະອັນຈະຖືກປຸງແຕ່ງເປັນເອກະລາດ,
ປ້ອງກັນ ກ ກວດເບິ່ງ: ຄໍາສັ່ງໃນຫນຶ່ງຕັນທີ່ກົງກັບເສັ້ນໃນບລັອກອື່ນ. ຍົກຕົວຢ່າງ,
ກໍານົດ %struct.C* @C_ctor_base(%struct.C* %this, i32 %x) {
ເຂົ້າ:
; ເຊັກ-LABEL: C_ctor_base:
; ກວດເບິ່ງ: mov [[SAVETHIS:r[0-9]+]], r0
; ກວດເບິ່ງ: bl A_ctor_base
; ກວດເບິ່ງ: mov r0, [[SAVETHIS]]
%0 = bitcast %struct.C* % this to %struct.A*
%call = ຫາງ %struct.A* @A_ctor_base(%struct.A* %0)
%1 = bitcast %struct.C* % this to %struct.B*
%call2 = ການໂທຫາງ %struct.B* @B_ctor_base(%struct.B* %1, i32 %x)
ret %struct.C* % ນີ້
}
ກໍານົດ %struct.D* @D_ctor_base(%struct.D* %this, i32 %x) {
ເຂົ້າ:
; ເຊັກ-LABEL: D_ctor_base:
ການນໍາໃຊ້ຂອງ ກວດເຊັກປ້າຍຊື່: ຄໍາແນະນໍາໃນກໍລະນີນີ້ຮັບປະກັນວ່າສາມ ກວດເບິ່ງ: directives
ພຽງແຕ່ຍອມຮັບສາຍທີ່ສອດຄ້ອງກັນກັບຮ່າງກາຍຂອງ @C_ctor_base ຟັງຊັນ, ເຖິງແມ່ນວ່າ
ຮູບແບບກົງກັບເສັ້ນທີ່ພົບໃນພາຍຫຼັງໃນໄຟລ໌. ນອກຈາກນັ້ນ, ຖ້າຫນຶ່ງໃນສາມນີ້ ກວດເບິ່ງ:
ຄໍາສັ່ງລົ້ມເຫລວ, FileCheck ຈະຟື້ນຕົວໂດຍການສືບຕໍ່ບລັອກຕໍ່ໄປ, ອະນຸຍາດໃຫ້ຫຼາຍ
ການທົດສອບຄວາມລົ້ມເຫຼວທີ່ຈະກວດພົບໃນຄໍາຮ້ອງຂໍດຽວ.
ບໍ່ມີຂໍ້ກໍານົດວ່າ ກວດເຊັກປ້າຍຊື່: ຄໍາສັ່ງປະກອບດ້ວຍສະຕຣິງທີ່ສອດຄ້ອງກັບ
ປ້າຍຊື່ syntactic ຕົວຈິງໃນພາສາແຫຼ່ງຫຼືຜົນໄດ້ຮັບ: ພວກມັນພຽງແຕ່ຕ້ອງກົງກັບ a
ແຖວດຽວໃນໄຟລ໌ທີ່ກໍາລັງກວດສອບ.
ກວດເຊັກປ້າຍຊື່: ຄຳສັ່ງບໍ່ສາມາດມີຄຳນິຍາມ ຫຼືການນຳໃຊ້ທີ່ປ່ຽນແປງໄດ້.
FileCheck ຮູບແບບ ການຈັບຄູ່ syntax
ການ "ກວດເບິ່ງ:"ແລະ"ບໍ່ກວດ:" ຄໍາແນະນໍາທັງສອງໃຊ້ຮູບແບບເພື່ອໃຫ້ກົງກັນ. ສໍາລັບການນໍາໃຊ້ສ່ວນໃຫຍ່
FileCheck, ການຈັບຄູ່ສະຕຣິງຄົງແມ່ນພຽງພໍຢ່າງສົມບູນ. ສໍາລັບບາງສິ່ງ, ເພີ່ມເຕີມ
ຮູບແບບການຈັບຄູ່ທີ່ມີຄວາມຍືດຫຍຸ່ນແມ່ນຕ້ອງການ. ເພື່ອສະຫນັບສະຫນູນນີ້, FileCheck ອະນຸຍາດໃຫ້ທ່ານລະບຸ
ການສະແດງອອກປົກກະຕິໃນສາຍທີ່ຈັບຄູ່, ອ້ອມຮອບດ້ວຍວົງເລັບຄູ່: {{yourregex}}.
ເນື່ອງຈາກວ່າພວກເຮົາຕ້ອງການໃຊ້ການຈັບຄູ່ສະຕຣິງຄົງທີ່ສໍາລັບສ່ວນໃຫຍ່ຂອງສິ່ງທີ່ພວກເຮົາເຮັດ, FileCheck ມີ
ໄດ້ຮັບການອອກແບບເພື່ອສະຫນັບສະຫນູນການປະສົມແລະການຈັບຄູ່ສາຍຄົງທີ່ກົງກັບປົກກະຕິ
ການສະແດງອອກ. ນີ້ອະນຸຍາດໃຫ້ທ່ານຂຽນສິ່ງຕ່າງໆເຊັ່ນນີ້:
; ກວດເບິ່ງ: movhpd {{[0-9]+}}(%esp), {{%xmm[0-7]}}
ໃນກໍລະນີນີ້, ການຊົດເຊີຍໃດໆຈາກການລົງທະບຽນ ESP ຈະຖືກອະນຸຍາດໃຫ້, ແລະການລົງທະບຽນ xmm ໃດໆ
ອະນຸຍາດ.
ເນື່ອງຈາກວ່າການສະແດງອອກເປັນປົກກະຕິໄດ້ຖືກຫຸ້ມດ້ວຍວົງເລັບຄູ່, ພວກມັນມີຄວາມແຕກຕ່າງກັນທາງສາຍຕາ,
ແລະທ່ານບໍ່ ຈຳ ເປັນຕ້ອງໃຊ້ຕົວອັກສອນຫລົບ ໜີ ພາຍໃນວົງເລັບສອງເທົ່າທີ່ເຈົ້າຕ້ອງການໃນ C.
ໃນກໍລະນີທີ່ຫາຍາກທີ່ທ່ານຕ້ອງການຈັບຄູ່ວົງເລັບສອງຢ່າງຢ່າງຊັດເຈນຈາກການປ້ອນຂໍ້ມູນ, ທ່ານສາມາດເຮັດໄດ້
ໃຊ້ສິ່ງທີ່ບໍ່ດີເຊັ່ນ {{[{][{]}} ເປັນຮູບແບບຂອງທ່ານ.
FileCheck Variables
ມັນມັກຈະເປັນປະໂຫຍດທີ່ຈະຈັບຄູ່ຮູບແບບແລະຫຼັງຈາກນັ້ນກວດສອບວ່າມັນເກີດຂຶ້ນອີກເທື່ອຫນຶ່ງໃນພາຍຫຼັງ
ໄຟລ໌. ສໍາລັບການທົດສອບ codegen, ນີ້ສາມາດເປັນປະໂຫຍດທີ່ຈະອະນຸຍາດໃຫ້ລົງທະບຽນໃດກໍ່ຕາມ, ແຕ່ກວດສອບວ່າ
ການລົງທະບຽນແມ່ນຖືກນໍາໃຊ້ຢ່າງຕໍ່ເນື່ອງຕໍ່ມາ. ເພື່ອເຮັດສິ່ງນີ້, FileCheck ອະນຸຍາດໃຫ້ຕົວແປທີ່ມີຊື່
ກໍານົດແລະທົດແທນເຂົ້າໄປໃນຮູບແບບ. ນີ້ແມ່ນຕົວຢ່າງທີ່ງ່າຍດາຍ:
; ກວດສອບ: test5:
; ກວດເບິ່ງ: notw [[ລົງທະບຽນ:%[az]+]]
; ກວດເບິ່ງ: andw {{.*}}[[ລົງທະບຽນ]]
ເສັ້ນກວດທໍາອິດກົງກັບ regex %[az]+ ແລະຈັບມັນເຂົ້າໄປໃນຕົວແປ ເຂົ້າສູ່ລະບົບ.
ແຖວທີສອງຢັ້ງຢືນວ່າອັນໃດຢູ່ໃນ ເຂົ້າສູ່ລະບົບ ເກີດຂຶ້ນຕໍ່ມາໃນໄຟລ໌ຫຼັງຈາກ an
"Andw". FileCheck ການອ້າງອີງຕົວແປແມ່ນບັນຈຸຢູ່ໃນສະເຫມີ [[ ]] ຄູ່, ແລະຂອງເຂົາເຈົ້າ
ຊື່ສາມາດຖືກສ້າງຕັ້ງຂຶ້ນດ້ວຍ regex [a-zA-Z][a-zA-Z0-9]*. ຖ້າຈໍ້າສອງເມັດຕາມຊື່,
ຫຼັງຈາກນັ້ນມັນເປັນຄໍານິຍາມຂອງຕົວແປ; ຖ້າບໍ່ດັ່ງນັ້ນ, ມັນເປັນການນໍາໃຊ້.
FileCheck ຕົວແປສາມາດຖືກກໍານົດຫຼາຍຄັ້ງ, ແລະການນໍາໃຊ້ສະເຫມີໄດ້ຮັບຄ່າຫລ້າສຸດ.
ຕົວແປຍັງສາມາດຖືກນໍາໃຊ້ຕໍ່ມາໃນແຖວດຽວກັນທີ່ພວກເຂົາຖືກກໍານົດໄວ້. ຍົກຕົວຢ່າງ:
; ກວດເບິ່ງ: op [[REG:r[0-9]+]], [[REG]]
ສາມາດເປັນປະໂຫຍດຖ້າຫາກວ່າທ່ານຕ້ອງການ operands ຂອງ op ຈະເປັນທະບຽນດຽວກັນ, ແລະບໍ່ສົນໃຈ
ແນ່ນອນວ່າມັນເປັນການລົງທະບຽນໃດ.
FileCheck ສຳ ນວນ
ບາງຄັ້ງມີຄວາມຕ້ອງການທີ່ຈະກວດສອບຜົນຜະລິດທີ່ຫມາຍເຖິງຕົວເລກແຖວຂອງໄຟລ໌ທີ່ກົງກັນ,
ຕົວຢ່າງ: ເມື່ອທົດສອບການວິນິດໄສ compiler. ນີ້ແນະນໍາຄວາມອ່ອນແອທີ່ແນ່ນອນຂອງການແຂ່ງຂັນ
ໂຄງສ້າງໄຟລ໌, ເປັນ "ກວດເບິ່ງ:" ແຖວມີຕົວເລກເສັ້ນຢ່າງແທ້ຈິງຢູ່ໃນໄຟລ໌ດຽວກັນ, ເຊິ່ງ
ຕ້ອງໄດ້ຮັບການປັບປຸງທຸກຄັ້ງທີ່ຕົວເລກແຖວມີການປ່ຽນແປງເນື່ອງຈາກການເພີ່ມຂໍ້ຄວາມຫຼືການລຶບ.
ເພື່ອສະຫນັບສະຫນູນກໍລະນີນີ້, FileCheck ອະນຸຍາດໃຫ້ນໍາໃຊ້ [[@LINE]], [[@LINE+ ]],
[[@LINE- ]] ການສະແດງອອກໃນຮູບແບບ. ການສະແດງອອກເຫຼົ່ານີ້ຂະຫຍາຍໄປສູ່ຈໍານວນຂອງ
ເສັ້ນທີ່ຮູບແບບຕັ້ງຢູ່ (ໂດຍມີການຊົດເຊີຍ integer ທາງເລືອກ).
ວິທີນີ້ຮູບແບບການຈັບຄູ່ສາມາດຖືກວາງຢູ່ໃກ້ກັບສາຍການທົດສອບທີ່ກ່ຽວຂ້ອງແລະປະກອບມີເສັ້ນທີ່ກ່ຽວຂ້ອງ
ການອ້າງອີງຕົວເລກ, ສໍາລັບການຍົກຕົວຢ່າງ:
// ກວດເບິ່ງ: test.cpp:[[@LINE+4]]:6: error: expect ';' ຫຼັງຈາກຜູ້ປະກາດລະດັບສູງສຸດ
// ກວດເບິ່ງ-ຕໍ່ໄປ: {{^int a}}
// ກວດເບິ່ງ-ຕໍ່ໄປ: {{^ \^}}
// ກວດເບິ່ງ-ຕໍ່ໄປ: {{^ ;}}
int a
ໃຊ້ FileCheck-3.6 ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net