From 6167c3fcda817f9dbfae4d3013bd63a8f909962f Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Tue, 19 Feb 2008 23:51:49 +0000 Subject: [PATCH] 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 --- include/llvm/ParameterAttributes.h | 2 ++ lib/VMCore/ParameterAttributes.cpp | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/llvm/ParameterAttributes.h b/include/llvm/ParameterAttributes.h index 270ff6501fd..c3a52fbac32 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 d78068df113..c49e14c76ed 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 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; -- 2.11.0