llvm-project/llvm/test/CodeGen/X86/pcsections.ll
Marco Elver bf9814b705 [SanitizerBinaryMetadata] Emit constants as ULEB128
Emit all constant integers produced by SanitizerBinaryMetadata as
ULEB128 to further reduce binary space used. Increasing the version is
not necessary given this change depends on (and will land) along with
the bump to v2.

To support this, the !pcsections metadata format is extended to allow
for per-section options, encoded in the first MD operator which must
always be a string and contain the section: "<section>!<options>".

Reviewed By: dvyukov

Differential Revision: https://reviews.llvm.org/D143484
2023-02-08 13:12:34 +01:00

169 lines
5.4 KiB
LLVM

; RUN: llc -O0 < %s | FileCheck %s --check-prefixes=CHECK,DEFCM
; RUN: llc -O1 < %s | FileCheck %s --check-prefixes=CHECK,DEFCM
; RUN: llc -O2 < %s | FileCheck %s --check-prefixes=CHECK,DEFCM
; RUN: llc -O3 < %s | FileCheck %s --check-prefixes=CHECK,DEFCM
; RUN: llc -O1 -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,LARGE
target triple = "x86_64-unknown-linux-gnu"
@foo = dso_local global i64 0, align 8
@bar = dso_local global i64 0, align 8
define void @empty_no_aux() !pcsections !0 {
; CHECK-LABEL: empty_no_aux:
; CHECK-NEXT: .Lfunc_begin0
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: retq
; CHECK-NEXT: .Lfunc_end0:
; CHECK: .section section_no_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base0:
; DEFCM-NEXT: .long .Lfunc_begin0-.Lpcsection_base0
; LARGE-NEXT: .quad .Lfunc_begin0-.Lpcsection_base0
; CHECK-NEXT: .long .Lfunc_end0-.Lfunc_begin0
; CHECK-NEXT: .text
entry:
ret void
}
define void @empty_aux() !pcsections !1 {
; CHECK-LABEL: empty_aux:
; CHECK-NEXT: .Lfunc_begin1
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: retq
; CHECK-NEXT: .Lfunc_end1:
; CHECK: .section section_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base1:
; DEFCM-NEXT: .long .Lfunc_begin1-.Lpcsection_base1
; LARGE-NEXT: .quad .Lfunc_begin1-.Lpcsection_base1
; CHECK-NEXT: .long .Lfunc_end1-.Lfunc_begin1
; CHECK-NEXT: .long 10
; CHECK-NEXT: .long 20
; CHECK-NEXT: .long 30
; CHECK-NEXT: .text
entry:
ret void
}
define i64 @multiple() !pcsections !0 {
; CHECK-LABEL: multiple:
; CHECK-NEXT: .Lfunc_begin2
; CHECK: # %bb.0: # %entry
; CHECK: .Lpcsection0:
; CHECK-NEXT: movq
; CHECK-NEXT: retq
; CHECK-NEXT: .Lfunc_end2:
; CHECK: .section section_no_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base2:
; DEFCM-NEXT: .long .Lfunc_begin2-.Lpcsection_base2
; LARGE-NEXT: .quad .Lfunc_begin2-.Lpcsection_base2
; CHECK-NEXT: .long .Lfunc_end2-.Lfunc_begin2
; CHECK-NEXT: .section section_aux_42,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base3:
; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base3
; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base3
; CHECK-NEXT: .long 42
; CHECK-NEXT: .section section_aux_21264,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base4:
; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base4
; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base4
; CHECK-NEXT: .long 21264
; CHECK-NEXT: .text
entry:
%0 = load i64, ptr @bar, align 8, !pcsections !2
ret i64 %0
}
define i64 @test_simple_atomic() {
; CHECK-LABEL: test_simple_atomic:
; CHECK: .Lpcsection1:
; CHECK-NEXT: movq
; CHECK-NOT: .Lpcsection
; CHECK: addq
; CHECK-NEXT: retq
; CHECK-NEXT: .Lfunc_end3:
; CHECK: .section section_no_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base5:
; DEFCM-NEXT: .long .Lpcsection1-.Lpcsection_base5
; LARGE-NEXT: .quad .Lpcsection1-.Lpcsection_base5
; CHECK-NEXT: .text
entry:
%0 = load atomic i64, ptr @foo monotonic, align 8, !pcsections !0
%1 = load i64, ptr @bar, align 8
%add = add nsw i64 %1, %0
ret i64 %add
}
define i64 @test_complex_atomic() {
; CHECK-LABEL: test_complex_atomic:
; CHECK: movl $1
; CHECK-NEXT: .Lpcsection2:
; CHECK-NEXT: lock xaddq
; CHECK-NOT: .Lpcsection
; CHECK: movq
; CHECK: addq
; CHECK: retq
; CHECK-NEXT: .Lfunc_end4:
; CHECK: .section section_no_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base6:
; DEFCM-NEXT: .long .Lpcsection2-.Lpcsection_base6
; LARGE-NEXT: .quad .Lpcsection2-.Lpcsection_base6
; CHECK-NEXT: .text
entry:
%0 = atomicrmw add ptr @foo, i64 1 monotonic, align 8, !pcsections !0
%1 = load i64, ptr @bar, align 8
%inc = add nsw i64 %1, 1
store i64 %inc, ptr @bar, align 8
%add = add nsw i64 %1, %0
ret i64 %add
}
define void @mixed_atomic_non_atomic() {
; CHECK-LABEL: mixed_atomic_non_atomic:
; CHECK: .Lpcsection
; CHECK-NEXT: movl $1
; CHECK: .section section_no_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base7:
; DEFCM-NEXT: .long .Lpcsection3-.Lpcsection_base7
; LARGE-NEXT: .quad .Lpcsection3-.Lpcsection_base7
; CHECK-NEXT: .text
entry:
%0 = load volatile i32, ptr @foo, align 4
%inc = add nsw i32 %0, 1
store volatile i32 %inc, ptr @foo, align 4
store atomic volatile i32 1, ptr @foo monotonic, align 4, !pcsections !0
%1 = load volatile i32, ptr @foo, align 4
%dec = add nsw i32 %1, -1
store volatile i32 %dec, ptr @foo, align 4
ret void
}
define void @multiple_uleb128() !pcsections !6 {
; CHECK-LABEL: multiple_uleb128:
; CHECK: .section section_aux,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base8:
; DEFCM-NEXT: .long .Lfunc_begin3-.Lpcsection_base8
; LARGE-NEXT: .quad .Lfunc_begin3-.Lpcsection_base8
; CHECK-NEXT: .uleb128 .Lfunc_end6-.Lfunc_begin3
; CHECK-NEXT: .byte 42
; CHECK-NEXT: .ascii "\345\216&"
; CHECK-NEXT: .byte 255
; CHECK-NEXT: .section section_aux_21264,"awo",@progbits,.text
; CHECK-NEXT: .Lpcsection_base9:
; DEFCM-NEXT: .long .Lfunc_begin3-.Lpcsection_base9
; LARGE-NEXT: .quad .Lfunc_begin3-.Lpcsection_base9
; CHECK-NEXT: .long .Lfunc_end6-.Lfunc_begin3
; CHECK-NEXT: .long 21264
; CHECK-NEXT: .text
entry:
ret void
}
!0 = !{!"section_no_aux"}
!1 = !{!"section_aux", !3}
!2 = !{!"section_aux_42", !4, !"section_aux_21264", !5}
!3 = !{i32 10, i32 20, i32 30}
!4 = !{i32 42}
!5 = !{i32 21264}
!6 = !{!"section_aux!C", !7, !"section_aux_21264", !5}
!7 = !{i64 42, i32 624485, i8 255}