Work around a GCC bug, producing this code:
authorChris Lattner <sabre@nondot.org>
Wed, 28 Nov 2007 21:26:17 +0000 (21:26 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 28 Nov 2007 21:26:17 +0000 (21:26 +0000)
  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

lib/Target/CBackend/CBackend.cpp

index 852e28df874ab68508ac012dc29414c53ba0c220..2d18468215ed1b7ccf958788359669732e85bb77 100644 (file)
@@ -2573,6 +2573,12 @@ void CWriter::visitCallInst(CallInst &I) {
         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.