1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 04:32:44 +01:00
llvm-mirror/test/CodeGen/Mips/gpopt-explict-section.ll
Tomas Matheson 79405b0d62 [MC][ELF] Emit unique sections for different flags
Global values imply flags such as readable, writable, executable for the
sections that they will be placed in. Currently MC places all such
entries into the same section, using the first set of flags seen. This
can lead to situations in LTO where a writable global is placed in the
same named section as a readable global from another file, and the
section may not be marked writable.

D72194 ensures that mergeable globals with explicit sections are placed
in separate sections with compatible entry size, by emitting the
`unique` assembly syntax where appropriate. This change extends that
approach to include section flags, so that globals with different
section flags are emitted in separate unique sections.

Differential revision: https://reviews.llvm.org/D100944
2021-05-26 11:51:29 +01:00

54 lines
1.5 KiB
LLVM

; RUN: llc < %s -march=mips -mcpu=mips32 -mips-ssection-threshold=8 \
; RUN: -relocation-model=static -mattr=+noabicalls -mgpopt \
; RUN: | FileCheck %s
; Test that object with an explicit section that is not .sdata or .sbss are not
; considered in the small data section if they would otherwise qualify to be in
; small data section. Also test that explicitly placing something in the small
; data section uses %gp_rel addressing mode.
@a = constant [2 x i32] zeroinitializer, section ".rodata", align 4
@b = global [4 x i32] zeroinitializer, section ".sdata", align 4
@c = global [4 x i32] zeroinitializer, section ".sbss", align 4
; CHECK-LABEL: g
; CHECK: lui $[[R:[0-9]+]], %hi(a)
; CHECK: lw ${{[0-9]+}}, %lo(a)($[[R]])
define i32 @g() {
entry:
%0 = load i32, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @a, i32 0, i32 0), align 4
ret i32 %0
}
; CHECK-LABEL: f:
; CHECK-LABEL: lw ${{[0-9]+}}, %gp_rel(b)($gp)
define i32 @f() {
entry:
%0 = load i32, i32* getelementptr inbounds ([4 x i32], [4 x i32]* @b, i32 0, i32 0), align 4
ret i32 %0
}
; CHECK-LABEL: h:
; CHECK-LABEL: lw ${{[0-9]+}}, %gp_rel(c)($gp)
define i32 @h() {
entry:
%0 = load i32, i32* getelementptr inbounds ([4 x i32], [4 x i32]* @c, i32 0, i32 0), align 4
ret i32 %0
}
; CHECK: .type a,@object
; CHECK: .section .rodata,"a",@progbits
; CHECK: .globl a
; CHECK: .type b,@object
; CHECK: .section .sdata,"aw",@progbits
; CHECK: .globl b
; CHECK: .type c,@object
; CHECK: .section .sbss,"aw",@nobits
; CHECK: .globl c