Author: baldrick Date: Thu Nov 22 03:34:20 2007 New Revision: 44269 URL: http://llvm.org/viewvc/llvm-project?rev=44269&view=rev Log: Struct return functions cannot be const/pure because they write the result via the sret pointer argument.
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=44269&r1=44268&r2=44269&view=diff ============================================================================== --- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Thu Nov 22 03:34:20 2007 @@ -1019,29 +1019,35 @@ TARGET_ADJUST_LLVM_CC(CallingConv, type); #endif - // Compute attributes for return type (and function attributes) + // Compute attributes for return type (and function attributes). ParamAttrsVector Attrs; uint16_t RAttributes = ParamAttr::None; int flags = flags_from_decl_or_type(decl ? decl : type); - // Check for 'const' function attribute + // Check for 'const' function attribute. if (flags & ECF_CONST) - RAttributes |= ParamAttr::Const; + // Since they write the return value through a pointer, + // 'sret' functions cannot be 'const'. + if (!ABIConverter.isStructReturn()) + RAttributes |= ParamAttr::Const; - // Check for 'noreturn' function attribute + // Check for 'noreturn' function attribute. if (flags & ECF_NORETURN) RAttributes |= ParamAttr::NoReturn; - // Check for 'nounwind' function attribute + // Check for 'nounwind' function attribute. if (flags & ECF_NOTHROW) RAttributes |= ParamAttr::NoUnwind; - // Check for 'pure' function attribute + // Check for 'pure' function attribute. if (flags & ECF_PURE) - RAttributes |= ParamAttr::Pure; + // Since they write the return value through a pointer, + // 'sret' functions cannot be 'pure'. + if (!ABIConverter.isStructReturn()) + RAttributes |= ParamAttr::Pure; - // Compute whether the result needs to be zext or sext'd + // Compute whether the result needs to be zext or sext'd. if (isa<IntegerType>(RetTy.get())) { tree ResultTy = TREE_TYPE(type); if (TREE_INT_CST_LOW(TYPE_SIZE(ResultTy)) < INT_TYPE_SIZE) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits