[llvm-commits] [llvm-gcc-4.2] r49655 - in /llvm-gcc-4.2/trunk/gcc: llvm-abi.h llvm-convert.cpp

Devang Patel dpatel at apple.com
Mon Apr 14 10:36:40 PDT 2008


Author: dpatel
Date: Mon Apr 14 12:36:40 2008
New Revision: 49655

URL: http://llvm.org/viewvc/llvm-project?rev=49655&view=rev
Log:
Building and extracting multiple values 
from a return instruciton is target specific.

Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-abi.h
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=49655&r1=49654&r2=49655&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Mon Apr 14 12:36:40 2008
@@ -296,6 +296,33 @@
   getLLVMAggregateTypeForStructReturn(X)
 #endif
 
+// LLVM_BUILD_MULTIPLE_RETURN_VALUE - Build multiple return values
+// for the function FN and add them in RETVALS. Each target that
+// supports multiple return value must implement this hook.
+#ifndef LLVM_BUILD_MULTIPLE_RETURN_VALUE(Fn,R,RetVals,B)
+#define LLVM_BUILD_MULTIPLE_RETURN_VALUE(Fn,R,Rs,B) \
+  llvm_default_build_multiple_return_value((Fn),(R),(RetVals),(B))
+#endif
+
+static void llvm_default_build_multiple_return_value(Function *F, Value *RetVal,
+                                              SmallVectorImpl<Value *> &RetVals,
+                                                     IRBuilder &Builder) {
+  assert (0 && "LLVM_BUILD_MULTIPLE_RETURN_VALUE is not implemented!");
+}
+
+// LLVM_EXTRACT_MULTIPLE_RETURN_VALUE - Extract multiple return value from
+// SRC and assign it to DEST. Each target that supports multiple return
+// value must implement this hook.
+#ifndef LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,B)
+#define LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,V,B)     \
+  llvm_default_extract_multiple_return_value((Src),(Dest),(V),(B))
+#endif
+static void llvm_default_extract_multiple_return_value(Value *Src, Value *Dest,
+                                                       bool isVolatile,
+                                                       IRBuilder &Builder) {
+  assert (0 && "LLVM_EXTRACT_MULTIPLE_RETURN_VALUE is not implemented!");
+}
+
 /// DefaultABI - This class implements the default LLVM ABI where structures are
 /// passed by decimating them into individual components and unions are passed
 /// by passing the largest member of the union.

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=49655&r1=49654&r2=49655&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Apr 14 12:36:40 2008
@@ -761,12 +761,7 @@
       Value *RetVal = DECL_LLVM(DECL_RESULT(FnDecl));
       if (const StructType *STy = dyn_cast<StructType>(Fn->getReturnType())) {
         // Handle multiple return values
-        unsigned NumElements = STy->getNumElements();
-        for (unsigned i = 0; i < NumElements; i++) {
-          Value *GEP = Builder.CreateStructGEP(RetVal, i, "mrv_idx");
-          Value *RetVal = Builder.CreateLoad(GEP, "mrv");
-          RetVals.push_back(RetVal);
-        }
+        LLVM_BUILD_MULTIPLE_RETURN_VALUE(Fn,RetVal,RetVals,Builder);
       } else {
         // Otherwise, this aggregate result must be something that is returned in
         // a scalar register for this target.  We must bit convert the aggregate
@@ -2646,13 +2641,7 @@
   Call->setName("tmp");
 
   if (Client.isAggrReturn()) {
-    const StructType *STy = cast<StructType>(Call->getType());
-    unsigned NumElements = STy->getNumElements();
-    for (unsigned i = 0; i < NumElements; i++) {
-      Value *GEP = Builder.CreateStructGEP(DestLoc->Ptr, i, "mrv_gep");
-      GetResultInst *GR = Builder.CreateGetResult(Call, i, "mrv_gr");
-      Builder.CreateStore(GR, GEP, DestLoc->Volatile);
-    }
+    LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Call,DestLoc->Ptr,DestLoc->Volatile,Builder);
     return 0;
   }
 





More information about the llvm-commits mailing list