xref: /llvm-project/bolt/test/X86/linux-exceptions.s (revision 6e8a1a45a783c13e4cd19bfd20b7a56cab6f7d81)
1ccf0c8daSMaksim Panchenko# REQUIRES: system-linux
2ccf0c8daSMaksim Panchenko
3ccf0c8daSMaksim Panchenko## Check that BOLT correctly parses the Linux kernel exception table.
4ccf0c8daSMaksim Panchenko
5ccf0c8daSMaksim Panchenko# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o
6ccf0c8daSMaksim Panchenko# RUN: %clang %cflags -nostdlib %t.o -o %t.exe \
7ccf0c8daSMaksim Panchenko# RUN:   -Wl,--image-base=0xffffffff80000000,--no-dynamic-linker,--no-eh-frame-hdr
8ccf0c8daSMaksim Panchenko
9ccf0c8daSMaksim Panchenko## Verify exception bindings to instructions.
10ccf0c8daSMaksim Panchenko
11ccf0c8daSMaksim Panchenko# RUN: llvm-bolt %t.exe --print-normalized -o %t.out --keep-nops=0 \
12ccf0c8daSMaksim Panchenko# RUN:   --bolt-info=0 | FileCheck %s
13ccf0c8daSMaksim Panchenko
14ccf0c8daSMaksim Panchenko## Verify the bindings again on the rewritten binary with nops removed.
15ccf0c8daSMaksim Panchenko
16ccf0c8daSMaksim Panchenko# RUN: llvm-bolt %t.out -o %t.out.1 --print-normalized | FileCheck %s
17ccf0c8daSMaksim Panchenko
18ccf0c8daSMaksim Panchenko# CHECK:      BOLT-INFO: Linux kernel binary detected
19ccf0c8daSMaksim Panchenko# CHECK:      BOLT-INFO: parsed 2 exception table entries
20ccf0c8daSMaksim Panchenko
21ccf0c8daSMaksim Panchenko  .text
22ccf0c8daSMaksim Panchenko  .globl _start
23ccf0c8daSMaksim Panchenko  .type _start, %function
24ccf0c8daSMaksim Panchenko_start:
25ccf0c8daSMaksim Panchenko# CHECK: Binary Function "_start"
26ccf0c8daSMaksim Panchenko  nop
27ccf0c8daSMaksim Panchenko.L0:
28ccf0c8daSMaksim Panchenko  mov (%rdi), %rax
29ccf0c8daSMaksim Panchenko# CHECK:      mov
30ccf0c8daSMaksim Panchenko# CHECK-SAME: ExceptionEntry: 1 # Fixup: [[FIXUP:[a-zA-Z0-9_]+]]
31ccf0c8daSMaksim Panchenko  nop
32ccf0c8daSMaksim Panchenko.L1:
33ccf0c8daSMaksim Panchenko  mov (%rsi), %rax
34ccf0c8daSMaksim Panchenko# CHECK:      mov
35ccf0c8daSMaksim Panchenko# CHECK-SAME: ExceptionEntry: 2 # Fixup: [[FIXUP]]
36ccf0c8daSMaksim Panchenko  nop
37ccf0c8daSMaksim Panchenko  ret
38ccf0c8daSMaksim Panchenko.LF0:
39ccf0c8daSMaksim Panchenko# CHECK: Secondary Entry Point: [[FIXUP]]
40ccf0c8daSMaksim Panchenko  jmp foo
41ccf0c8daSMaksim Panchenko  .size _start, .-_start
42ccf0c8daSMaksim Panchenko
43ccf0c8daSMaksim Panchenko  .globl foo
44ccf0c8daSMaksim Panchenko  .type foo, %function
45ccf0c8daSMaksim Panchenkofoo:
46ccf0c8daSMaksim Panchenko  ret
47ccf0c8daSMaksim Panchenko  .size foo, .-foo
48ccf0c8daSMaksim Panchenko
49ccf0c8daSMaksim Panchenko
50ccf0c8daSMaksim Panchenko## Exception table.
51ccf0c8daSMaksim Panchenko  .section __ex_table,"a",@progbits
52ccf0c8daSMaksim Panchenko  .align 4
53ccf0c8daSMaksim Panchenko
54ccf0c8daSMaksim Panchenko  .long .L0 - .  # instruction
55ccf0c8daSMaksim Panchenko  .long .LF0 - . # fixup
56ccf0c8daSMaksim Panchenko  .long 0        # data
57ccf0c8daSMaksim Panchenko
58ccf0c8daSMaksim Panchenko  .long .L1 - .  # instruction
59ccf0c8daSMaksim Panchenko  .long .LF0 - . # fixup
60ccf0c8daSMaksim Panchenko  .long 0        # data
61ccf0c8daSMaksim Panchenko
62*6e8a1a45SFranklin## Linux kernel version
63*6e8a1a45SFranklin  .rodata
64*6e8a1a45SFranklin  .align 16
65*6e8a1a45SFranklin  .globl linux_banner
66*6e8a1a45SFranklin  .type  linux_banner, @object
67*6e8a1a45SFranklinlinux_banner:
68*6e8a1a45SFranklin  .string  "Linux version 6.6.61\n"
69*6e8a1a45SFranklin  .size  linux_banner, . - linux_banner
70*6e8a1a45SFranklin
71ccf0c8daSMaksim Panchenko## Fake Linux Kernel sections.
72ccf0c8daSMaksim Panchenko  .section __ksymtab,"a",@progbits
73ccf0c8daSMaksim Panchenko  .section __ksymtab_gpl,"a",@progbits
74