Honour ByVal parameter attribute for name decoration
authorAnton Korobeynikov <asl@math.spbu.ru>
Sun, 20 Jan 2008 14:00:07 +0000 (14:00 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Sun, 20 Jan 2008 14:00:07 +0000 (14:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46200 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86AsmPrinter.cpp

index f9756f046f6214397e6e715236c1c80652d2096c..ef8cbea590dcaf1a86915c4c6b49c68d8de2e39b 100644 (file)
@@ -25,6 +25,7 @@
 #include "llvm/Constants.h"
 #include "llvm/Module.h"
 #include "llvm/DerivedTypes.h"
+#include "llvm/ParameterAttributes.h"
 #include "llvm/Type.h"
 #include "llvm/Assembly/Writer.h"
 #include "llvm/Support/Mangler.h"
@@ -48,11 +49,19 @@ static X86MachineFunctionInfo calculateFunctionInfo(const Function *F,
     return Info;
   }
 
+  unsigned argNum = 1;
   for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
-       AI != AE; ++AI)
+       AI != AE; ++AI, ++argNum) {
+    const Type* Ty = AI->getType();
+
+    // 'Dereference' type in case of byval parameter attribute
+    if (F->paramHasAttr(argNum, ParamAttr::ByVal))
+      Ty = cast<PointerType>(Ty)->getElementType();
+
     // Size should be aligned to DWORD boundary
-    Size += ((TD->getABITypeSize(AI->getType()) + 3)/4)*4;
-  
+    Size += ((TD->getABITypeSize(Ty) + 3)/4)*4;
+  }
+
   // We're not supporting tooooo huge arguments :)
   Info.setBytesToPopOnReturn((unsigned int)Size);
   return Info;