[llvm] 8c05007 - [X86] Fix a nullptr dereference in X86Subtarget::classifyLocalReference when compiling with -mcmodel=medium -fpic and using a constant pool
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu May 28 17:23:16 PDT 2020
Author: Craig Topper
Date: 2020-05-28T17:20:42-07:00
New Revision: 8c050070fb96b4e6b8608a120d102bac0c8ada1c
URL: https://github.com/llvm/llvm-project/commit/8c050070fb96b4e6b8608a120d102bac0c8ada1c
DIFF: https://github.com/llvm/llvm-project/commit/8c050070fb96b4e6b8608a120d102bac0c8ada1c.diff
LOG: [X86] Fix a nullptr dereference in X86Subtarget::classifyLocalReference when compiling with -mcmodel=medium -fpic and using a constant pool
LowerConstantPool passes a nullptr into classifyLocalReference. The medium code model handling for PIC will try to deference it using isa. This patch switches to isa_and_nonnull.
Differential Revision: https://reviews.llvm.org/D80763
Added:
Modified:
llvm/lib/Target/X86/X86Subtarget.cpp
llvm/test/CodeGen/X86/code-model-elf.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp
index 8f7185cc5fa6..975cbabb30fd 100644
--- a/llvm/lib/Target/X86/X86Subtarget.cpp
+++ b/llvm/lib/Target/X86/X86Subtarget.cpp
@@ -88,7 +88,9 @@ X86Subtarget::classifyLocalReference(const GlobalValue *GV) const {
// Medium is a hybrid: RIP-rel for code, GOTOFF for DSO local data.
case CodeModel::Medium:
- if (isa<Function>(GV))
+ // Constant pool and jump table handling pass a nullptr to this
+ // function so we need to use isa_and_nonnull.
+ if (isa_and_nonnull<Function>(GV))
return X86II::MO_NO_FLAG; // All code is RIP-relative
return X86II::MO_GOTOFF; // Local symbols use GOTOFF.
}
diff --git a/llvm/test/CodeGen/X86/code-model-elf.ll b/llvm/test/CodeGen/X86/code-model-elf.ll
index f7ffd6ea1eb7..82d0d1ef5913 100644
--- a/llvm/test/CodeGen/X86/code-model-elf.ll
+++ b/llvm/test/CodeGen/X86/code-model-elf.ll
@@ -439,6 +439,49 @@ define dso_local i32 @load_thread_data() #0 {
ret i32 %1
}
+define dso_local float @load_constant_pool(float %x) #0 {
+; SMALL-STATIC-LABEL: load_constant_pool:
+; SMALL-STATIC: # %bb.0:
+; SMALL-STATIC-NEXT: addss {{\.LCPI.*}}(%rip), %xmm0
+; SMALL-STATIC-NEXT: retq
+;
+; MEDIUM-STATIC-LABEL: load_constant_pool:
+; MEDIUM-STATIC: # %bb.0:
+; MEDIUM-STATIC-NEXT: movabsq ${{\.LCPI.*}}, %rax
+; MEDIUM-STATIC-NEXT: addss (%rax), %xmm0
+; MEDIUM-STATIC-NEXT: retq
+;
+; LARGE-STATIC-LABEL: load_constant_pool:
+; LARGE-STATIC: # %bb.0:
+; LARGE-STATIC-NEXT: movabsq ${{\.LCPI.*}}, %rax
+; LARGE-STATIC-NEXT: addss (%rax), %xmm0
+; LARGE-STATIC-NEXT: retq
+;
+; SMALL-PIC-LABEL: load_constant_pool:
+; SMALL-PIC: # %bb.0:
+; SMALL-PIC-NEXT: addss {{\.LCPI.*}}(%rip), %xmm0
+; SMALL-PIC-NEXT: retq
+;
+; MEDIUM-PIC-LABEL: load_constant_pool:
+; MEDIUM-PIC: # %bb.0:
+; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
+; MEDIUM-PIC-NEXT: movabsq ${{\.LCPI.*}}@GOTOFF, %rcx
+; MEDIUM-PIC-NEXT: addss (%rax,%rcx), %xmm0
+; MEDIUM-PIC-NEXT: retq
+;
+; LARGE-PIC-LABEL: load_constant_pool:
+; LARGE-PIC: # %bb.0:
+; LARGE-PIC-NEXT: .L11$pb:
+; LARGE-PIC-NEXT: leaq .L11$pb(%rip), %rax
+; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
+; LARGE-PIC-NEXT: addq %rax, %rcx
+; LARGE-PIC-NEXT: movabsq ${{\.LCPI.*}}@GOTOFF, %rax
+; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
+; LARGE-PIC-NEXT: retq
+ %a = fadd float %x, 1.0
+ ret float %a
+}
+
attributes #0 = { noinline nounwind uwtable }
!llvm.module.flags = !{!0, !1, !2}
More information about the llvm-commits
mailing list