Revision: 126488 Author: clattner Date: 2007-04-24 17:26:05 -0700 (Tue, 24 Apr 2007)
Log Message: ----------- Fix PR1352 and CFrontend/2007-04-24-VolatileStructCopy.c Modified Paths: -------------- apple-local/branches/llvm/gcc/llvm-convert.cpp Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp =================================================================== --- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-04-25 00:21:38 UTC (rev 126487) +++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-04-25 00:26:05 UTC (rev 126488) @@ -2762,9 +2762,23 @@ } // Non-bitfield aggregate value. - Emit(TREE_OPERAND(exp, 1), LV.Ptr); - if (DestLoc) + if (DestLoc) { + Emit(TREE_OPERAND(exp, 1), LV.Ptr); EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), isVolatile, false); + } else if (!isVolatile) { + Emit(TREE_OPERAND(exp, 1), LV.Ptr); + } else { + // Need to do a volatile store into TREE_OPERAND(exp, 1). To do this, we + // emit it into a temporary memory location, them do a volatile copy into + // the real destination. This is probably suboptimal in some cases, but + // it gets the volatile memory access right. It would be better if the + // destloc pointer of 'Emit' had a flag that indicated it should be + // volatile. + Value *Tmp = CreateTemporary(ConvertType(TREE_TYPE(TREE_OPERAND(exp,1)))); + Emit(TREE_OPERAND(exp, 1), Tmp); + EmitAggregateCopy(LV.Ptr, Tmp, TREE_TYPE(TREE_OPERAND(exp,1)), + isVolatile, false); + } return 0; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits