Print ret instruction that returns aggregates.
authorDevang Patel <dpatel@apple.com>
Fri, 22 Feb 2008 02:50:49 +0000 (02:50 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 22 Feb 2008 02:50:49 +0000 (02:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47472 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/AsmWriter.cpp

index 6e1652c4c7f961785b114a0ab85426963ac7086f..b1f15c676f0d1607fc9a90f25290013e5f2c144b 100644 (file)
@@ -1291,8 +1291,23 @@ void AssemblyWriter::printInstruction(const Instruction &I) {
       writeOperand(I.getOperand(op  ), false); Out << ',';
       writeOperand(I.getOperand(op+1), false); Out << " ]";
     }
-  } else if (isa<ReturnInst>(I) && !Operand) {
-    Out << " void";
+  } else if (isa<ReturnInst>(I)) {
+    if (!Operand)
+      Out << " void";
+    else {
+      if (I.getOperand(0)->getType()->isFirstClassType())
+        writeOperand(I.getOperand(0), true);
+      else {
+        Constant *ROp = cast<Constant>(I.getOperand(0));
+        const StructType *STy = cast<StructType>(ROp->getType());
+        unsigned NumElems = STy->getNumElements();
+        for (unsigned i = 0; i < NumElems; ++i) {
+          if (i)
+            Out << ",";
+          writeOperand(ROp->getOperand(i), true);
+        }
+      }
+    }
   } else if (const CallInst *CI = dyn_cast<CallInst>(&I)) {
     // Print the calling convention being used.
     switch (CI->getCallingConv()) {