[AsmPrinter] Check for valid constants in handleIndirectSymViaGOTPCRel
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Jul 2015 21:45:42 +0000 (21:45 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 21 Jul 2015 21:45:42 +0000 (21:45 +0000)
Check whether BaseCst is valid before extracting a GlobalValue.
This fixes PR24163.

Patch by David Majnemer.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242840 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/MC/MachO/cstexpr-gotpcrel-64.ll

index 068b9172e9f541087a2c9c4d2823e75e9d99580d..ecdc7fa8b35ed840d9324c903b75243b2ad5e351 100644 (file)
@@ -2101,7 +2101,7 @@ static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME,
   if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
     return;
 
-  const GlobalValue *BaseGV = dyn_cast<GlobalValue>(BaseCst);
+  const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
   if (!BaseGV)
     return;
 
index bafddcb3db698331aee558e47ae4a3971bbaa5a7..41abeb0179cc4a16b80838e63512798565f2520c 100644 (file)
@@ -1,6 +1,7 @@
 ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t
 ; RUN:  FileCheck %s -check-prefix=X86 < %t
 ; RUN:  FileCheck %s -check-prefix=X86-GOT-EQUIV < %t
+; RUN:  FileCheck %s -check-prefix=X86-NOGOT-EQUIV < %t
 
 ; GOT equivalent globals references can be replaced by the GOT entry of the
 ; final symbol instead.
@@ -86,10 +87,15 @@ define i32** @t1() {
 }
 
 ; Do not crash when a pattern cannot be matched as a GOT equivalent
-
+define void @foo() {
+; X86-NOGOT-EQUIV-LABEL: _foo:
+; X86-NOGOT-EQUIV: leaq  _b(%rip), %rax
+  store i8** @b, i8*** null
+  ret void
+}
 @a = external global i8
 @b = internal unnamed_addr constant i8* @a
 
-; X86-LABEL: _c:
-; X86:   .quad _b
+; X86-NOGOT-EQUIV-LABEL: _c:
+; X86-NOGOT-EQUIV:   .quad _b
 @c = global i8** @b