[llvm] r311001 - [mips] Handle variables with an explicit section and interactions with .sdata, .sbss
Simon Dardis via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 16 05:18:04 PDT 2017
Author: sdardis
Date: Wed Aug 16 05:18:04 2017
New Revision: 311001
URL: http://llvm.org/viewvc/llvm-project?rev=311001&view=rev
Log:
[mips] Handle variables with an explicit section and interactions with .sdata, .sbss
If a variable has an explicit section such as .sdata or .sbss, it is placed
in that section and accessed in a gp relative manner. This overrides the global
-G setting.
Otherwise if a variable has a explicit section attached to it, such as '.rodata'
or '.mysection', it is not placed in the small data section. This also overrides
the global -G setting.
Reviewers: atanasyan, nitesh.jain
Differential Revision: https://reviews.llvm.org/D36616
Added:
llvm/trunk/test/CodeGen/Mips/gpopt-explict-section.ll
Modified:
llvm/trunk/lib/Target/Mips/MipsTargetObjectFile.cpp
Modified: llvm/trunk/lib/Target/Mips/MipsTargetObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetObjectFile.cpp?rev=311001&r1=311000&r2=311001&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsTargetObjectFile.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsTargetObjectFile.cpp Wed Aug 16 05:18:04 2017
@@ -106,6 +106,22 @@ IsGlobalInSmallSectionImpl(const GlobalO
if (!GVA)
return false;
+ // If the variable has an explicit section, it is placed in that section but
+ // it's addressing mode may change.
+ if (GVA->hasSection()) {
+ StringRef Section = GVA->getSection();
+
+ // Explicitly placing any variable in the small data section overrides
+ // the global -G value.
+ if (Section == ".sdata" || Section == ".sbss")
+ return true;
+
+ // Otherwise reject accessing it through the gp pointer. There are some
+ // historic cases which GCC doesn't appear to respect any more. These
+ // are .lit4, .lit8 and .srdata. For the moment reject these as well.
+ return false;
+ }
+
// Enforce -mlocal-sdata.
if (!LocalSData && GVA->hasLocalLinkage())
return false;
Added: llvm/trunk/test/CodeGen/Mips/gpopt-explict-section.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/gpopt-explict-section.ll?rev=311001&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/gpopt-explict-section.ll (added)
+++ llvm/trunk/test/CodeGen/Mips/gpopt-explict-section.ll Wed Aug 16 05:18:04 2017
@@ -0,0 +1,53 @@
+; 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.
+
+ at a = global [2 x i32] zeroinitializer, section ".rodata", align 4
+ at b = global [4 x i32] zeroinitializer, section ".sdata", align 4
+ at 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, at object
+; CHECK: .section .rodata,"a", at progbits
+; CHECK: .globl a
+
+; CHECK: .type b, at object
+; CHECK: .section .sdata,"aw", at progbits
+; CHECK: .globl b
+
+; CHECK: .type c, at object
+; CHECK: .section .sbss,"aw", at nobits
+; CHECK: .globl c
More information about the llvm-commits
mailing list