#include "llvm/Module.h"
#include "llvm/DerivedTypes.h"
#include "llvm/IntrinsicInst.h"
-#include "llvm/ParameterAttributes.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/Support/LeakDetector.h"
#include "llvm/Support/StringPool.h"
/// it in its containing function.
bool Argument::hasStructRetAttr() const {
if (!isa<PointerType>(getType())) return false;
- if (getArgNo()) return false; // StructRet param must be first param
+ if (this != getParent()->arg_begin()) return false; // StructRet param must be first param
return getParent()->paramHasAttr(1, ParamAttr::StructRet);
}
getParent()->getFunctionList().erase(this);
}
-/// @brief Determine whether the function has the given attribute.
-bool Function::paramHasAttr(uint16_t i, unsigned attr) const {
- return ParamAttrs && ParamAttrs->paramHasAttr(i, (ParameterAttributes)attr);
-}
-
-/// @brief Determine if the function cannot return.
-bool Function::doesNotReturn() const {
- return paramHasAttr(0, ParamAttr::NoReturn);
-}
-
-/// @brief Determine if the function cannot unwind.
-bool Function::doesNotThrow() const {
- return paramHasAttr(0, ParamAttr::NoUnwind);
-}
-
-/// @brief Determine if the function does not access memory.
-bool Function::doesNotAccessMemory() const {
- return paramHasAttr(0, ParamAttr::ReadNone);
-}
-
-/// @brief Determine if the function does not access or only reads memory.
-bool Function::onlyReadsMemory() const {
- return doesNotAccessMemory() || paramHasAttr(0, ParamAttr::ReadOnly);
-}
-
-/// @brief Determine if the function returns a structure.
-bool Function::isStructReturn() const {
- return paramHasAttr(1, ParamAttr::StructRet);
-}
-
//===----------------------------------------------------------------------===//
// Function Implementation
//===----------------------------------------------------------------------===//
Function::Function(const FunctionType *Ty, LinkageTypes Linkage,
const std::string &name, Module *ParentModule)
: GlobalValue(PointerType::getUnqual(Ty),
- Value::FunctionVal, 0, 0, Linkage, name),
- ParamAttrs(0) {
+ Value::FunctionVal, 0, 0, Linkage, name) {
SymTab = new ValueSymbolTable();
- assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy)
+ assert((getReturnType()->isFirstClassType() ||getReturnType() == Type::VoidTy
+ || isa<StructType>(getReturnType()))
&& "LLVM functions cannot return aggregate values!");
// If the function has arguments, mark them as lazily built.
ArgumentList.clear();
delete SymTab;
- // Drop our reference to the parameter attributes, if any.
- if (ParamAttrs)
- ParamAttrs->dropRef();
-
// Remove the function from the on-the-side collector table.
clearCollector();
}
LeakDetector::removeGarbageObject(this);
}
-void Function::setParamAttrs(const ParamAttrsList *attrs) {
- // Avoid deleting the ParamAttrsList if they are setting the
- // attributes to the same list.
- if (ParamAttrs == attrs)
- return;
-
- // Drop reference on the old ParamAttrsList
- if (ParamAttrs)
- ParamAttrs->dropRef();
-
- // Add reference to the new ParamAttrsList
- if (attrs)
- attrs->addRef();
-
- // Set the new ParamAttrsList.
- ParamAttrs = attrs;
-}
-
// dropAllReferences() - This function causes all the subinstructions to "let
// go" of all references that they are maintaining. This allows one to
// 'delete' a whole class at a time, even though there may be circular
return FunctionType::get(ResultTy, ArgTys, IsVarArg);
}
-const ParamAttrsList *Intrinsic::getParamAttrs(ID id) {
- ParamAttrsVector Attrs;
- uint16_t Attr = ParamAttr::None;
+PAListPtr Intrinsic::getParamAttrs(ID id) {
+ ParameterAttributes Attr = ParamAttr::None;
#define GET_INTRINSIC_ATTRIBUTES
#include "llvm/Intrinsics.gen"
// Intrinsics cannot throw exceptions.
Attr |= ParamAttr::NoUnwind;
- Attrs.push_back(ParamAttrsWithIndex::get(0, Attr));
- return ParamAttrsList::get(Attrs);
+ ParamAttrsWithIndex PAWI = ParamAttrsWithIndex::get(0, Attr);
+ return PAListPtr::get(&PAWI, 1);
}
Function *Intrinsic::getDeclaration(Module *M, ID id, const Type **Tys,