[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