diff options
-rw-r--r-- | include/llvm/Function.h | 38 | ||||
-rw-r--r-- | lib/VMCore/Function.cpp | 20 |
2 files changed, 36 insertions, 22 deletions
diff --git a/include/llvm/Function.h b/include/llvm/Function.h index ef82457926..f48eb38d1d 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -174,29 +174,49 @@ public: /// addParamAttr - adds the attribute to the list of attributes. void addParamAttr(unsigned i, ParameterAttributes attr); + /// removeParamAttr - removes the attribute from the list of attributes. + void removeParamAttr(unsigned i, ParameterAttributes attr); + /// @brief Extract the alignment for a call or parameter (0=unknown). unsigned getParamAlignment(unsigned i) const { return ParamAttrs.getParamAlignment(i); } - /// @brief Determine if the function cannot return. - bool doesNotReturn() const { return paramHasAttr(0, ParamAttr::NoReturn); } - void setDoesNotThrow(bool doesNotThrow = true); - - /// @brief Determine if the function cannot unwind. - bool doesNotThrow() const { - return paramHasAttr(0, ParamAttr::NoUnwind); - } - /// @brief Determine if the function does not access memory. bool doesNotAccessMemory() const { return paramHasAttr(0, ParamAttr::ReadNone); } + void setDoesNotAccessMemory(bool doesNotAccessMemory = true) { + if (doesNotAccessMemory) addParamAttr(0, ParamAttr::ReadNone); + else removeParamAttr(0, ParamAttr::ReadNone); + } /// @brief Determine if the function does not access or only reads memory. bool onlyReadsMemory() const { return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly); } + void setOnlyReadsMemory(bool onlyReadsMemory = true) { + if (onlyReadsMemory) addParamAttr(0, ParamAttr::ReadOnly); + else removeParamAttr(0, ParamAttr::ReadOnly | ParamAttr::ReadNone); + } + + /// @brief Determine if the function cannot return. + bool doesNotReturn() const { + return paramHasAttr(0, ParamAttr::NoReturn); + } + void setDoesNotReturn(bool doesNotReturn = true) { + if (doesNotReturn) addParamAttr(0, ParamAttr::NoReturn); + else removeParamAttr(0, ParamAttr::NoReturn); + } + + /// @brief Determine if the function cannot unwind. + bool doesNotThrow() const { + return paramHasAttr(0, ParamAttr::NoUnwind); + } + void setDoesNotThrow(bool doesNotThrow = true) { + if (doesNotThrow) addParamAttr(0, ParamAttr::NoUnwind); + else removeParamAttr(0, ParamAttr::NoUnwind); + } /// @brief Determine if the function returns a structure through first /// pointer argument. diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 7533185be1..1b4e39f952 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -113,18 +113,15 @@ bool Argument::hasStructRetAttr() const { /// addAttr - Add a ParamAttr to an argument void Argument::addAttr(ParameterAttributes attr) { - getParent()->setParamAttrs( - getParent()->getParamAttrs().addAttr(getArgNo() + 1, attr)); + getParent()->addParamAttr(getArgNo() + 1, attr); } - + /// removeAttr - Remove a ParamAttr from an argument void Argument::removeAttr(ParameterAttributes attr) { - getParent()->setParamAttrs( - getParent()->getParamAttrs().removeAttr(getArgNo() + 1, attr)); + getParent()->removeParamAttr(getArgNo() + 1, attr); } - //===----------------------------------------------------------------------===// // Helper Methods in Function //===----------------------------------------------------------------------===// @@ -231,18 +228,15 @@ void Function::dropAllReferences() { BasicBlocks.clear(); // Delete all basic blocks... } -void Function::setDoesNotThrow(bool doesNotThrow) { +void Function::addParamAttr(unsigned i, ParameterAttributes attr) { PAListPtr PAL = getParamAttrs(); - if (doesNotThrow) - PAL = PAL.addAttr(0, ParamAttr::NoUnwind); - else - PAL = PAL.removeAttr(0, ParamAttr::NoUnwind); + PAL = PAL.addAttr(i, attr); setParamAttrs(PAL); } -void Function::addParamAttr(unsigned i, ParameterAttributes attr) { +void Function::removeParamAttr(unsigned i, ParameterAttributes attr) { PAListPtr PAL = getParamAttrs(); - PAL = PAL.addAttr(i, attr); + PAL = PAL.removeAttr(i, attr); setParamAttrs(PAL); } |