[llvm-commits] [llvm-gcc-4.2] r50040 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp

Duncan Sands baldrick at free.fr
Mon Apr 21 03:57:21 PDT 2008


Author: baldrick
Date: Mon Apr 21 05:57:15 2008
New Revision: 50040

URL: http://llvm.org/viewvc/llvm-project?rev=50040&view=rev
Log:
Fix the x86-64 Ada build.  The problem was an
aggregate to scalar view conversion.  The source
was of a variable-sized type which converted to
i8.  The target was an i16 scalar.  The original
code created a temporary using the source type
(i8) which caused the 16 bit reads and writes to
it to smash the following stack variable.  Now
the temporary is created using the target type. 

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

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=50040&r1=50039&r2=50040&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Mon Apr 21 05:57:15 2008
@@ -2911,16 +2911,17 @@
   tree Op = TREE_OPERAND(exp, 0);
 
   if (isAggregateTreeType(TREE_TYPE(Op))) {
-    const Type *OpTy = ConvertType(TREE_TYPE(Op));
     MemRef Target;
-    if (DestLoc) {
+    if (DestLoc)
       // This is an aggregate-to-agg VIEW_CONVERT_EXPR, just evaluate in place.
       Target = *DestLoc;
-      Target.Ptr = BitCastToType(DestLoc->Ptr, PointerType::getUnqual(OpTy));
-    } else {
+    else
       // This is an aggregate-to-scalar VIEW_CONVERT_EXPR, evaluate, then load.
-      Target = CreateTempLoc(OpTy);
-    }
+      Target = CreateTempLoc(ConvertType(TREE_TYPE(exp)));
+
+    // Make the destination look like the source type.
+    const Type *OpTy = ConvertType(TREE_TYPE(Op));
+    Target.Ptr = BitCastToType(Target.Ptr, PointerType::getUnqual(OpTy));
 
     // Needs to be in sync with EmitLV.
     switch (TREE_CODE(Op)) {





More information about the llvm-commits mailing list