<dt><tt>nest</tt></dt>
<dd>This indicates that the parameter can be excised using the
<a href="#int_trampoline">trampoline intrinsics</a>.</dd>
- <dt><tt>pure</tt></dt>
+ <dt><tt>readonly</tt></dt>
<dd>This function attribute indicates that the function has no side-effects
- except for producing a return value. The value returned must only depend on
- the function arguments and/or global variables. It may use values obtained
- by dereferencing pointers.</dd>
- <dt><tt>const</tt></dt>
- <dd>A <tt>const</tt> function has the same restrictions as a <tt>pure</tt>
+ except for producing a return value or throwing an exception. The value
+ returned must only depend on the function arguments and/or global variables.
+ It may use values obtained by dereferencing pointers.</dd>
+ <dt><tt>readnone</tt></dt>
+ <dd>A <tt>readnone</tt> function has the same restrictions as a <tt>readonly</tt>
function, but in addition it is not allowed to dereference any pointer arguments
or global variables.
</dl>
NoAlias = 1 << 6, ///< Considered to not alias after call
ByVal = 1 << 7, ///< Pass structure by value
Nest = 1 << 8, ///< Nested function static chain
- Pure = 1 << 9, ///< Function is pure
- Const = 1 << 10 ///< Function is const
+ ReadNone = 1 << 9, ///< Function does not access memory
+ ReadOnly = 1 << 10 ///< Function only reads from memory
};
}
KEYWORD("noalias", NOALIAS);
KEYWORD("byval", BYVAL);
KEYWORD("nest", NEST);
- KEYWORD("pure", PURE);
- KEYWORD("const", CONST);
+ KEYWORD("readnone", READNONE);
+ KEYWORD("readonly", READONLY);
KEYWORD("type", TYPE);
KEYWORD("opaque", OPAQUE);
// Function Attributes
%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST
-%token CONST PURE
+%token READNONE READONLY
// Visibility Styles
%token DEFAULT HIDDEN PROTECTED
| NOUNWIND { $$ = ParamAttr::NoUnwind; }
| ZEROEXT { $$ = ParamAttr::ZExt; }
| SIGNEXT { $$ = ParamAttr::SExt; }
- | PURE { $$ = ParamAttr::Pure; }
- | CONST { $$ = ParamAttr::Const; }
+ | READNONE { $$ = ParamAttr::ReadNone; }
+ | READONLY { $$ = ParamAttr::ReadOnly; }
;
OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; }
Result += "byval ";
if (Attrs & ParamAttr::Nest)
Result += "nest ";
- if (Attrs & ParamAttr::Pure)
- Result += "pure ";
- if (Attrs & ParamAttr::Const)
- Result += "const ";
+ if (Attrs & ParamAttr::ReadNone)
+ Result += "readnone ";
+ if (Attrs & ParamAttr::ReadOnly)
+ Result += "readonly ";
return Result;
}
const uint16_t ParameterIncompatible =
ParamAttr::NoReturn | ParamAttr::NoUnwind |
- ParamAttr::Const | ParamAttr::Pure;
+ ParamAttr::ReadNone | ParamAttr::ReadOnly;
const uint16_t MutuallyIncompatible[3] = {
ParamAttr::ByVal | ParamAttr::InReg |
ParamAttr::ZExt | ParamAttr::SExt,
- ParamAttr::Pure | ParamAttr::Const
+ ParamAttr::ReadNone | ParamAttr::ReadOnly
};
const uint16_t IntegerTypeOnly =