[PATCH] [AsmPrinter] Fix crash in handleIndirectSymViaGOTPCRel

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Wed Jun 24 14:06:55 PDT 2015


Hi rafael,

Check for symbols in MCValue before using them. Bail out early in case they are null. Fix for PR23779.
Rafael, the changes in this patch checks all the possibilities, but do you know if it's possible for evaluateAsRelocatable to return a MCValue with a null SymbolA?

Thanks,

REPOSITORY
  rL LLVM

http://reviews.llvm.org/D10712

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

Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -2086,17 +2086,24 @@
   MCValue MV;
   if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
     return;
+  const MCSymbolRefExpr *SymA = MV.getSymA();
+  if (!SymA)
+    return;
 
-  const MCSymbol *GOTEquivSym = &MV.getSymA()->getSymbol();
+  // Check that GOT equivalent symbol is cached.
+  const MCSymbol *GOTEquivSym = &SymA->getSymbol();
   if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
     return;
 
   const GlobalValue *BaseGV = dyn_cast<GlobalValue>(BaseCst);
   if (!BaseGV)
     return;
 
+  // Check for a valid base symbol
   const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
-  if (BaseSym != &MV.getSymB()->getSymbol())
+  const MCSymbolRefExpr *SymB = MV.getSymB();
+
+  if (!SymB || BaseSym != &SymB->getSymbol())
     return;
 
   // Make sure to match:
Index: test/MC/MachO/cstexpr-gotpcrel-64.ll
===================================================================
--- test/MC/MachO/cstexpr-gotpcrel-64.ll
+++ test/MC/MachO/cstexpr-gotpcrel-64.ll
@@ -84,3 +84,12 @@
 define i32** @t1() {
   ret i32** @bargotequiv
 }
+
+; Do not crash when a pattern cannot be matched as a GOT equivalent
+
+ at a = external global i8
+ at b = internal unnamed_addr constant i8* @a
+
+; X86-LABEL: _c:
+; X86:   .quad _b
+ at c = global i8** @b

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10712.28399.patch
Type: text/x-patch
Size: 1460 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150624/9b170ece/attachment.bin>


More information about the llvm-commits mailing list