mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
79405b0d62
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
54 lines
1.5 KiB
LLVM
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
|