Add Alignment field to ParameterAttributes and
authorDale Johannesen <dalej@apple.com>
Tue, 19 Feb 2008 23:51:49 +0000 (23:51 +0000)
committerDale Johannesen <dalej@apple.com>
Tue, 19 Feb 2008 23:51:49 +0000 (23:51 +0000)
treat more or less rationally in interface
functions, subject to change.  No functional change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47352 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ParameterAttributes.h
lib/VMCore/ParameterAttributes.cpp

index 270ff6501fdcdd74583f895e91f6c09e76beda44..c3a52fbac320083b15f05bb7d5f76141dc3992bb 100644 (file)
@@ -47,6 +47,8 @@ const Attributes ByVal     = 1<<7;  ///< Pass structure by value
 const Attributes Nest      = 1<<8;  ///< Nested function static chain
 const Attributes ReadNone  = 1<<9;  ///< Function does not access memory
 const Attributes ReadOnly  = 1<<10; ///< Function only reads from memory
+const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits)
+                                    // 0 = unknown, else in clear (not log)
 
 /// @brief Attributes that only apply to function parameters.
 const Attributes ParameterOnly = ByVal | InReg | Nest | StructRet;
index d78068df1133368446220f2ae309cefcc7c93011..c49e14c76ed9babef96cf7fdd6cde2e594712157 100644 (file)
@@ -14,6 +14,7 @@
 #include "llvm/ParameterAttributes.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Support/ManagedStatic.h"
+#include <sstream>
 
 using namespace llvm;
 
@@ -68,13 +69,20 @@ ParamAttrsList::getParamAttrsText(ParameterAttributes Attrs) {
     Result += "readnone ";
   if (Attrs & ParamAttr::ReadOnly)
     Result += "readonly ";
+  if (Attrs & ParamAttr::Alignment) {
+    std::stringstream s;
+    s << ((Attrs & ParamAttr::Alignment) >> 16);
+    Result += "align ";
+    Result += s.str();
+    Result += " ";
+  }
   return Result;
 }
 
 void ParamAttrsList::Profile(FoldingSetNodeID &ID,
                              const ParamAttrsVector &Attrs) {
   for (unsigned i = 0; i < Attrs.size(); ++i)
-    ID.AddInteger(unsigned(Attrs[i].attrs) << 16 | unsigned(Attrs[i].index));
+    ID.AddInteger(uint64_t(Attrs[i].attrs) << 16 | unsigned(Attrs[i].index));
 }
 
 const ParamAttrsList *
@@ -173,6 +181,15 @@ ParamAttrsList::includeAttrs(const ParamAttrsList *PAL,
                              uint16_t idx, ParameterAttributes attrs) {
   ParameterAttributes OldAttrs = PAL ? PAL->getParamAttrs(idx) : 
                                        ParamAttr::None;
+#ifndef NDEBUG
+  // FIXME it is not obvious how this should work for alignment.
+  // For now, say we can't change a known alignment.
+  ParameterAttributes OldAlign = OldAttrs & ParamAttr::Alignment;
+  ParameterAttributes NewAlign = attrs & ParamAttr::Alignment;
+  assert(!OldAlign || !NewAlign || OldAlign == NewAlign &&
+         "Attempt to change alignment!");
+#endif
+
   ParameterAttributes NewAttrs = OldAttrs | attrs;
   if (NewAttrs == OldAttrs)
     return PAL;
@@ -185,6 +202,11 @@ ParamAttrsList::includeAttrs(const ParamAttrsList *PAL,
 const ParamAttrsList *
 ParamAttrsList::excludeAttrs(const ParamAttrsList *PAL,
                              uint16_t idx, ParameterAttributes attrs) {
+#ifndef NDEBUG
+  // FIXME it is not obvious how this should work for alignment.
+  // For now, say we can't pass in alignment, which no current use does.
+  assert(!(attrs & ParamAttr::Alignment) && "Attempt to exclude alignment!");
+#endif
   ParameterAttributes OldAttrs = PAL ? PAL->getParamAttrs(idx) : 
                                        ParamAttr::None;
   ParameterAttributes NewAttrs = OldAttrs & ~attrs;