aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2008-02-19 23:51:49 +0000
committerDale Johannesen <dalej@apple.com>2008-02-19 23:51:49 +0000
commit6167c3fcda817f9dbfae4d3013bd63a8f909962f (patch)
tree4ac05be2d9ef89f15c7c3b31ec6142b4c5f01a18
parente9c608d6ccf0fae87982c7510835b8f2f99353ff (diff)
Add Alignment field to ParameterAttributes and
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
-rw-r--r--include/llvm/ParameterAttributes.h2
-rw-r--r--lib/VMCore/ParameterAttributes.cpp24
2 files changed, 25 insertions, 1 deletions
diff --git a/include/llvm/ParameterAttributes.h b/include/llvm/ParameterAttributes.h
index 270ff6501f..c3a52fbac3 100644
--- a/include/llvm/ParameterAttributes.h
+++ b/include/llvm/ParameterAttributes.h
@@ -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;
diff --git a/lib/VMCore/ParameterAttributes.cpp b/lib/VMCore/ParameterAttributes.cpp
index d78068df11..c49e14c76e 100644
--- a/lib/VMCore/ParameterAttributes.cpp
+++ b/lib/VMCore/ParameterAttributes.cpp
@@ -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;