mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
4e5aa08380
Summary: The list of indirect labels should ALWAYS have their blockaddresses as argument operands to the callbr (but not necessarily the other way around). Add an invariant that checks this. The verifier catches a bad test case that was added recently in r368478. I think that was a simple mistake, and the test was made less strict in regards to the precise addresses (as those weren't specifically the point of the test). This invariant will be used to find a reported bug. Link: https://www.spinics.net/lists/arm-kernel/msg753473.html Link: https://github.com/ClangBuiltLinux/linux/issues/649 Reviewers: craig.topper, void, chandlerc Reviewed By: void Subscribers: ychen, lebedev.ri, javed.absar, kristof.beyls, hiraditya, llvm-commits, srhines Tags: #llvm Differential Revision: https://reviews.llvm.org/D67196 llvm-svn: 372923
51 lines
1.3 KiB
LLVM
51 lines
1.3 KiB
LLVM
; RUN: not opt -S %s -verify 2>&1 | FileCheck %s
|
|
|
|
; CHECK: Indirect label missing from arglist.
|
|
define void @foo() {
|
|
; The %4 in the indirect label list is not found in the blockaddresses in the
|
|
; arg list (bad).
|
|
callbr void asm sideeffect "${0:l} {1:l}", "X,X"(i8* blockaddress(@foo, %3), i8* blockaddress(@foo, %2))
|
|
to label %1 [label %4, label %2]
|
|
1:
|
|
ret void
|
|
2:
|
|
ret void
|
|
3:
|
|
ret void
|
|
4:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-NOT: Indirect label missing from arglist.
|
|
define void @bar() {
|
|
; %4 and %2 are both in the indirect label list and the arg list (good).
|
|
callbr void asm sideeffect "${0:l} ${1:l}", "X,X"(i8* blockaddress(@bar, %4), i8* blockaddress(@bar, %2))
|
|
to label %1 [label %4, label %2]
|
|
1:
|
|
ret void
|
|
2:
|
|
ret void
|
|
3:
|
|
ret void
|
|
4:
|
|
ret void
|
|
}
|
|
|
|
; CHECK-NOT: Indirect label missing from arglist.
|
|
define void @baz() {
|
|
; note %2 blockaddress. Such a case is possible when passing the address of
|
|
; a label as an input to the inline asm (both address of label and asm goto
|
|
; use blockaddress constants; we're testing that the indirect label list from
|
|
; the asm goto is in the arg list to the asm).
|
|
callbr void asm sideeffect "${0:l} ${1:l} ${2:l}", "X,X,X"(i8* blockaddress(@baz, %4), i8* blockaddress(@baz, %2), i8* blockaddress(@baz, %3))
|
|
to label %1 [label %3, label %4]
|
|
1:
|
|
ret void
|
|
2:
|
|
ret void
|
|
3:
|
|
ret void
|
|
4:
|
|
ret void
|
|
}
|