From cfa3c236b23aff80e48df11ef5833b7e63fab802 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Tue, 8 Jul 2008 09:41:30 +0000 Subject: [PATCH] Add some helpers for manipulating function parameter attributes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53228 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Function.h | 38 +++++++++++++++++++++++++++++--------- lib/VMCore/Function.cpp | 28 +++++++++++----------------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/include/llvm/Function.h b/include/llvm/Function.h index ef824579262..f48eb38d1da 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 7533185be1d..1b4e39f952a 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -113,16 +113,13 @@ bool Argument::hasStructRetAttr() const { /// addAttr - Add a ParamAttr to an argument void Argument::addAttr(ParameterAttributes attr) { - getParent()->setParamAttrs( - getParent()->getParamAttrs().addAttr(getArgNo() + 1, attr)); -} - -/// removeAttr - Remove a ParamAttr from an argument -void Argument::removeAttr(ParameterAttributes attr) { - getParent()->setParamAttrs( - getParent()->getParamAttrs().removeAttr(getArgNo() + 1, attr)); + getParent()->addParamAttr(getArgNo() + 1, attr); } +/// removeAttr - Remove a ParamAttr from an argument +void Argument::removeAttr(ParameterAttributes attr) { + getParent()->removeParamAttr(getArgNo() + 1, attr); +} //===----------------------------------------------------------------------===// @@ -231,21 +228,18 @@ void Function::dropAllReferences() { BasicBlocks.clear(); // Delete all basic blocks... } -void Function::setDoesNotThrow(bool doesNotThrow) { - PAListPtr PAL = getParamAttrs(); - if (doesNotThrow) - PAL = PAL.addAttr(0, ParamAttr::NoUnwind); - else - PAL = PAL.removeAttr(0, ParamAttr::NoUnwind); - setParamAttrs(PAL); -} - void Function::addParamAttr(unsigned i, ParameterAttributes attr) { PAListPtr PAL = getParamAttrs(); PAL = PAL.addAttr(i, attr); setParamAttrs(PAL); } +void Function::removeParamAttr(unsigned i, ParameterAttributes attr) { + PAListPtr PAL = getParamAttrs(); + PAL = PAL.removeAttr(i, attr); + setParamAttrs(PAL); +} + // Maintain the collector name for each function in an on-the-side table. This // saves allocating an additional word in Function for programs which do not use // GC (i.e., most programs) at the cost of increased overhead for clients which