Work around a GCC bug, producing this code:

  unsigned char *llvm_cbe_X;
...
  llvm_cbe_X = 0; *((void**)&llvm_cbe_X) = __builtin_stack_save();

instead of:

  llvm_cbe_X = __builtin_stack_save();

See PR1809 for details.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44415 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index 852e28d..2d18468 100644
--- a/lib/Target/CBackend/CBackend.cpp
+++ b/lib/Target/CBackend/CBackend.cpp
@@ -2573,6 +2573,12 @@
         writeOperand(I.getOperand(3));
         Out << ")";
         return;
+      case Intrinsic::stacksave:
+        // Emit this as: Val = 0; *((void**)&Val) = __builtin_stack_save()
+        // to work around GCC bugs (see PR1809).
+        Out << "0; *((void**)&" << GetValueName(&I)
+            << ") = __builtin_stack_save()";
+        return;
       case Intrinsic::dbg_stoppoint: {
         // If we use writeOperand directly we get a "u" suffix which is rejected
         // by gcc.