mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
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
This commit is contained in:
parent
e9c608d6cc
commit
6167c3fcda
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user