Add pure/const attributes. Documentation will follow.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44109 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2007-11-14 09:52:30 +00:00
parent 9de1934099
commit 0adb7b41e7
5 changed files with 34 additions and 14 deletions

View File

@ -38,7 +38,9 @@ enum Attributes {
NoUnwind = 1 << 5, ///< Function doesn't unwind stack
NoAlias = 1 << 6, ///< Considered to not alias after call
ByVal = 1 << 7, ///< Pass structure by value
Nest = 1 << 8 ///< Nested function static chain
Nest = 1 << 8, ///< Nested function static chain
Pure = 1 << 9, ///< Function is pure
Const = 1 << 10 ///< Function is const
};
}

View File

@ -275,6 +275,8 @@ noreturn { return NORETURN; }
noalias { return NOALIAS; }
byval { return BYVAL; }
nest { return NEST; }
pure { return PURE; }
const { return CONST; }
sext{WSNL} { // For auto-upgrade only, drop in LLVM 3.0
return SIGNEXT; }
zext{WSNL} { // For auto-upgrade only, drop in LLVM 3.0

View File

@ -1113,6 +1113,7 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
// Function Attributes
%token SIGNEXT ZEROEXT NORETURN INREG SRET NOUNWIND NOALIAS BYVAL NEST
%token CONST PURE
// Visibility Styles
%token DEFAULT HIDDEN PROTECTED
@ -1256,6 +1257,8 @@ FuncAttr : NORETURN { $$ = ParamAttr::NoReturn; }
| NOUNWIND { $$ = ParamAttr::NoUnwind; }
| ZEROEXT { $$ = ParamAttr::ZExt; }
| SIGNEXT { $$ = ParamAttr::SExt; }
| PURE { $$ = ParamAttr::Pure; }
| CONST { $$ = ParamAttr::Const; }
;
OptFuncAttrs : /* empty */ { $$ = ParamAttr::None; }

View File

@ -108,6 +108,10 @@ ParamAttrsList::getParamAttrsText(uint16_t Attrs) {
Result += "byval ";
if (Attrs & ParamAttr::Nest)
Result += "nest ";
if (Attrs & ParamAttr::Pure)
Result += "pure ";
if (Attrs & ParamAttr::Const)
Result += "const ";
return Result;
}

View File

@ -398,7 +398,8 @@ void Verifier::visitFunction(Function &F) {
ParamAttr::Nest | ParamAttr::StructRet;
const uint16_t ParameterIncompatible =
ParamAttr::NoReturn | ParamAttr::NoUnwind;
ParamAttr::NoReturn | ParamAttr::NoUnwind |
ParamAttr::Const | ParamAttr::Pure;
const uint16_t MutuallyIncompatible =
ParamAttr::ByVal | ParamAttr::InReg |
@ -407,6 +408,9 @@ void Verifier::visitFunction(Function &F) {
const uint16_t MutuallyIncompatible2 =
ParamAttr::ZExt | ParamAttr::SExt;
const uint16_t MutuallyIncompatible3 =
ParamAttr::Pure | ParamAttr::Const;
const uint16_t IntegerTypeOnly =
ParamAttr::SExt | ParamAttr::ZExt;
@ -423,9 +427,14 @@ void Verifier::visitFunction(Function &F) {
uint16_t RetI = Attrs->getParamAttrs(0) & ReturnIncompatible;
Assert1(!RetI, "Attribute " + Attrs->getParamAttrsText(RetI) +
"should not apply to functions!", &F);
uint16_t MutI = Attrs->getParamAttrs(0) & MutuallyIncompatible2;
Assert1(MutI != MutuallyIncompatible2, "Attributes" +
Attrs->getParamAttrsText(MutI) + "are incompatible!", &F);
uint16_t MutI2 = Attrs->getParamAttrs(0) & MutuallyIncompatible2;
Assert1(MutI2 != MutuallyIncompatible2, "Attributes" +
Attrs->getParamAttrsText(MutI2) + "are incompatible!", &F);
uint16_t MutI3 = Attrs->getParamAttrs(0) & MutuallyIncompatible3;
Assert1(MutI3 != MutuallyIncompatible3, "Attributes" +
Attrs->getParamAttrsText(MutI3) + "are incompatible!", &F);
for (FunctionType::param_iterator I = FT->param_begin(),
E = FT->param_end(); I != E; ++I, ++Idx) {