xref: /llvm-project/bolt/test/runtime/X86/section-reloc-with-addend.s (revision 30a6d3ada6570254c27295eafe1188aa7baca574)
18331f75eSAmir Ayupov# This reproduces a bug triggered by a relocation referencing a section symbol
28331f75eSAmir Ayupov# plus a negative reloc. BOLT handles such cases specially, but while doing so,
38331f75eSAmir Ayupov# it was failing to sign extend a negative result for the relocation (encoded
48331f75eSAmir Ayupov# in the immediate operand of an LEA instruction).
58331f75eSAmir Ayupov# Originally triggered by https://fossies.org/linux/glib/glib/guniprop.c
68331f75eSAmir Ayupov# Line 550: const gchar *p = special_case_table + val - 0x1000000;
78331f75eSAmir Ayupov
88331f75eSAmir Ayupov# REQUIRES: system-linux
98331f75eSAmir Ayupov
108331f75eSAmir Ayupov# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown \
118331f75eSAmir Ayupov# RUN:   %s -o %t.o
128331f75eSAmir Ayupov# Delete our BB symbols so BOLT doesn't mark them as entry points
138331f75eSAmir Ayupov# RUN: llvm-strip --strip-unneeded %t.o
14487570fbSAmir Ayupov# RUN: %clang %cflags -no-pie %t.o -o %t.exe -Wl,-q
158331f75eSAmir Ayupov
16*30a6d3adSMaksim Panchenko# RUN: llvm-bolt %t.exe --print-finalized --print-only=main -o %t.out \
17*30a6d3adSMaksim Panchenko# RUN:   2>&1 | FileCheck %s
188331f75eSAmir Ayupov
19*30a6d3adSMaksim Panchenko# RUN: %t.out 1 2 | FileCheck --check-prefix=CHECK-RT %s
208331f75eSAmir Ayupov
218331f75eSAmir Ayupov  .text
228331f75eSAmir Ayupov  .globl  main
238331f75eSAmir Ayupov  .type main, %function
248331f75eSAmir Ayupov  .p2align  4
258331f75eSAmir Ayupovmain:
268331f75eSAmir Ayupov  pushq %rbp
278331f75eSAmir Ayupov  movq  %rsp, %rbp
28*30a6d3adSMaksim Panchenko  subq  $0x10, %rsp
298331f75eSAmir Ayupov  cmpl  $0x2, %edi
308331f75eSAmir Ayupov  jb    .BBend
318331f75eSAmir Ayupov.BB2:
32*30a6d3adSMaksim Panchenko
33*30a6d3adSMaksim Panchenko# CHECK: leaq
34*30a6d3adSMaksim Panchenko# CHECK-SAME: {{.*}}-{{.*}}
35*30a6d3adSMaksim Panchenko  leaq mystring-0x1000000, %rsi  # Use a large negative addend to cause a
368331f75eSAmir Ayupov                                 # negative result to be encoded in LEA
378331f75eSAmir Ayupov  addq $0x1000000, %rsi          # Eventually program logic compensates to get
388331f75eSAmir Ayupov                                 # a real address
398331f75eSAmir Ayupov  movq $2, %rbx
408331f75eSAmir Ayupov  xorq %rax, %rax
418331f75eSAmir Ayupov  movb (%rsi), %al
428331f75eSAmir Ayupov  addq %rbx, %rax
438331f75eSAmir Ayupov  movb %al, (%rsi)
448331f75eSAmir Ayupov  leaq mystring, %rdi
458331f75eSAmir Ayupov  callq puts
468331f75eSAmir Ayupov
478331f75eSAmir Ayupov.BBend:
488331f75eSAmir Ayupov  xorq %rax, %rax
498331f75eSAmir Ayupov  leaveq
508331f75eSAmir Ayupov  retq
518331f75eSAmir Ayupov  .size main, .-main
528331f75eSAmir Ayupov
538331f75eSAmir Ayupov  .data
54*30a6d3adSMaksim Panchenko
55*30a6d3adSMaksim Panchenko# CHECK-RT: {{.*}} is rbx mod 10 contents in decimal
568331f75eSAmir Ayupovmystring: .asciz "0 is rbx mod 10 contents in decimal\n"
57