Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MC] [Win64EH] Check that the SEH unwind opcodes match the actual ins…
…tructions It's a fairly common issue that the generating code incorrectly marks instructions as narrow or wide; check that the instruction lengths add up to the expected value, and error out if it doesn't. This allows catching code generation bugs. Also check that prologs and epilogs are properly terminated, to catch other code generation issues. Differential Revision: https://reviews.llvm.org/D125647
- Loading branch information
Showing
6 changed files
with
197 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
// This test checks error reporting for mismatched prolog/epilog lengths | ||
|
||
// RUN: not llvm-mc -triple thumbv7-pc-win32 -filetype=obj -o /dev/null %s 2>&1 | FileCheck %s | ||
|
||
// CHECK-NOT: func1 | ||
// CHECK: error: Incorrect size for func2 epilogue: 6 bytes of instructions in range, but .seh directives corresponding to 4 bytes | ||
// CHECK: error: Incorrect size for func3 prologue: 4 bytes of instructions in range, but .seh directives corresponding to 2 bytes | ||
|
||
.text | ||
.syntax unified | ||
|
||
.seh_proc func1 | ||
func1: | ||
// Instruction with indeterminate length | ||
b other | ||
.seh_endprologue | ||
nop | ||
.seh_startepilogue | ||
// The p2align causes the length of the epilogue to be unknown, so | ||
// we can't report errors about the mismatch here. | ||
.p2align 1 | ||
pop {r4-r7-lr} | ||
.seh_save_regs {r4-r7,lr} | ||
bx lr | ||
.seh_nop | ||
.seh_endepilogue | ||
.seh_endproc | ||
|
||
.seh_proc func2 | ||
func2: | ||
.seh_endprologue | ||
nop | ||
.seh_startepilogue | ||
// As we're popping into lr instead of directly into pc, this pop | ||
// becomes a wide instruction. | ||
pop {r4-r7,lr} | ||
// The directive things we're making a narrow instruction, which | ||
// is wrong. | ||
.seh_save_regs {r4-r7,lr} | ||
bx lr | ||
.seh_nop | ||
.seh_endepilogue | ||
.seh_endproc | ||
|
||
.seh_proc func3 | ||
func3: | ||
nop.w | ||
.seh_nop | ||
.seh_endprologue | ||
nop | ||
.seh_endproc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// This test checks error reporting for missing ending/starting of prologues/epilogues | ||
|
||
// RUN: not llvm-mc -triple thumbv7-pc-win32 -filetype=obj -o /dev/null %s 2>&1 | FileCheck %s | ||
|
||
// CHECK: error: Stray .seh_endepilogue in func1 | ||
// CHECK: error: Prologue in func2 not correctly terminated | ||
// CHECK: error: Epilogue in func3 not correctly terminated | ||
// CHECK: error: Epilogue in func4 not correctly terminated | ||
|
||
.text | ||
.syntax unified | ||
|
||
.seh_proc func1 | ||
func1: | ||
sub sp, #16 | ||
.seh_stackalloc 16 | ||
.seh_endprologue | ||
nop | ||
// Missing .seh_startepilogue | ||
add sp, #16 | ||
.seh_stackalloc 16 | ||
bx lr | ||
.seh_nop | ||
.seh_endepilogue | ||
.seh_endproc | ||
|
||
.seh_proc func2 | ||
func2: | ||
sub sp, #16 | ||
.seh_stackalloc 16 | ||
// Missing .seh_endprologue | ||
nop | ||
.seh_startepilogue | ||
add sp, #16 | ||
.seh_stackalloc 16 | ||
bx lr | ||
.seh_nop | ||
.seh_endepilogue | ||
.seh_endproc | ||
|
||
.seh_proc func3 | ||
func3: | ||
sub sp, #16 | ||
.seh_stackalloc 16 | ||
.seh_endprologue | ||
nop | ||
.seh_startepilogue | ||
add sp, #16 | ||
.seh_stackalloc 16 | ||
bx lr | ||
.seh_nop | ||
// Missing .seh_endepilogue | ||
.seh_endproc | ||
|
||
.seh_proc func4 | ||
func4: | ||
sub sp, #16 | ||
.seh_stackalloc 16 | ||
.seh_endprologue | ||
nop | ||
.seh_startepilogue | ||
add sp, #16 | ||
.seh_stackalloc 16 | ||
bx lr | ||
.seh_nop | ||
// Missing .seh_endepilogue | ||
nop | ||
.seh_startepilogue | ||
add sp, #16 | ||
.seh_stackalloc 16 | ||
bx lr | ||
.seh_nop | ||
.seh_endepilogue | ||
.seh_endproc |