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