LLVM 20.0.0git
Classes | Macros | Enumerations | Functions | Variables
Attributes.cpp File Reference
#include "llvm/IR/Attributes.h"
#include "AttributeImpl.h"
#include "LLVMContextImpl.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/ConstantRangeList.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ModRef.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <optional>
#include <string>
#include <tuple>
#include <utility>
#include "llvm/IR/Attributes.inc"

Go to the source code of this file.

Classes

struct  AttributeComparator
 Attribute comparator that only compares attribute keys. More...
 
struct  EnumAttr
 
struct  StrBoolAttr
 

Macros

#define GET_ATTR_NAMES
 
#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)    .Case(#DISPLAY_NAME, Attribute::ENUM_NAME)
 
#define GET_ATTR_NAMES
 
#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
 
#define GET_ATTR_NAMES
 
#define ATTRIBUTE_ALL(ENUM_NAME, DISPLAY_NAME)   .Case(#DISPLAY_NAME, true)
 
#define GET_ATTR_PROP_TABLE
 
#define GET_ATTR_NAMES
 
#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)
 
#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME)
 
#define GET_ATTR_COMPAT_FUNC
 

Enumerations

enum  AttributeProperty {
  FnAttr = (1 << 0) , ParamAttr = (1 << 1) , RetAttr = (1 << 2) , IntersectPreserve = (0 << 3) ,
  IntersectAnd = (1 << 3) , IntersectMin = (2 << 3) , IntersectCustom = (3 << 3) , IntersectPropertyMask = (3 << 3)
}
 

Functions

static uint64_t packAllocSizeArgs (unsigned ElemSizeArg, const std::optional< unsigned > &NumElemsArg)
 
static std::pair< unsigned, std::optional< unsigned > > unpackAllocSizeArgs (uint64_t Num)
 
static uint64_t packVScaleRangeArgs (unsigned MinValue, std::optional< unsigned > MaxValue)
 
static std::pair< unsigned, std::optional< unsigned > > unpackVScaleRangeArgs (uint64_t Value)
 
static const chargetModRefStr (ModRefInfo MR)
 
static unsigned getAttributeProperties (Attribute::AttrKind Kind)
 
static bool hasAttributeProperty (Attribute::AttrKind Kind, AttributeProperty Prop)
 
static bool hasIntersectProperty (Attribute::AttrKind Kind, AttributeProperty Prop)
 
static unsigned attrIdxToArrayIdx (unsigned Index)
 Map from AttributeList index to the internal array index.
 
template<typename K >
static void addAttributeImpl (SmallVectorImpl< Attribute > &Attrs, K Kind, Attribute Attr)
 
static bool denormModeCompatible (DenormalMode CallerMode, DenormalMode CalleeMode)
 Callees with dynamic denormal modes are compatible with any caller mode.
 
static bool checkDenormMode (const Function &Caller, const Function &Callee)
 
static bool checkStrictFP (const Function &Caller, const Function &Callee)
 
template<typename AttrClass >
static bool isEqual (const Function &Caller, const Function &Callee)
 
static bool isEqual (const Function &Caller, const Function &Callee, const StringRef &AttrName)
 
template<typename AttrClass >
static void setAND (Function &Caller, const Function &Callee)
 Compute the logical AND of the attributes of the caller and the callee.
 
template<typename AttrClass >
static void setOR (Function &Caller, const Function &Callee)
 Compute the logical OR of the attributes of the caller and the callee.
 
static void adjustCallerSSPLevel (Function &Caller, const Function &Callee)
 If the inlined function had a higher stack protection level than the calling function, then bump up the caller's stack protection level.
 
static void adjustCallerStackProbes (Function &Caller, const Function &Callee)
 If the inlined function required stack probes, then ensure that the calling function has those too.
 
static void adjustCallerStackProbeSize (Function &Caller, const Function &Callee)
 If the inlined function defines the size of guard region on the stack, then ensure that the calling function defines a guard region that is no larger.
 
static void adjustMinLegalVectorWidth (Function &Caller, const Function &Callee)
 If the inlined function defines a min legal vector width, then ensure the calling function has the same or larger min legal vector width.
 
static void adjustNullPointerValidAttr (Function &Caller, const Function &Callee)
 If the inlined function has null_pointer_is_valid attribute, set this attribute in the caller post inlining.
 

Variables

static const unsigned AllocSizeNumElemsNotPresent = -1
 

Macro Definition Documentation

◆ ATTRIBUTE_ALL

#define ATTRIBUTE_ALL (   ENUM_NAME,
  DISPLAY_NAME 
)    .Case(#DISPLAY_NAME, true)

◆ ATTRIBUTE_ENUM [1/3]

#define ATTRIBUTE_ENUM (   ENUM_NAME,
  DISPLAY_NAME 
)     .Case(#DISPLAY_NAME, Attribute::ENUM_NAME)

Definition at line 2598 of file Attributes.cpp.

◆ ATTRIBUTE_ENUM [2/3]

#define ATTRIBUTE_ENUM (   ENUM_NAME,
  DISPLAY_NAME 
)
Value:
case Attribute::ENUM_NAME: \
return #DISPLAY_NAME;

Definition at line 2598 of file Attributes.cpp.

◆ ATTRIBUTE_ENUM [3/3]

#define ATTRIBUTE_ENUM (   ENUM_NAME,
  DISPLAY_NAME 
)
Value:
struct ENUM_NAME##Attr : EnumAttr { \
static enum Attribute::AttrKind getKind() { \
return llvm::Attribute::ENUM_NAME; \
} \
};
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition: Attributes.h:86

Definition at line 2598 of file Attributes.cpp.

◆ ATTRIBUTE_STRBOOL

#define ATTRIBUTE_STRBOOL (   ENUM_NAME,
  DISPLAY_NAME 
)
Value:
struct ENUM_NAME##Attr : StrBoolAttr { \
static StringRef getKind() { return #DISPLAY_NAME; } \
};
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51

Definition at line 2604 of file Attributes.cpp.

◆ GET_ATTR_COMPAT_FUNC

#define GET_ATTR_COMPAT_FUNC

Definition at line 2610 of file Attributes.cpp.

◆ GET_ATTR_NAMES [1/4]

#define GET_ATTR_NAMES

Definition at line 2597 of file Attributes.cpp.

◆ GET_ATTR_NAMES [2/4]

#define GET_ATTR_NAMES

Definition at line 2597 of file Attributes.cpp.

◆ GET_ATTR_NAMES [3/4]

#define GET_ATTR_NAMES

Definition at line 2597 of file Attributes.cpp.

◆ GET_ATTR_NAMES [4/4]

#define GET_ATTR_NAMES

Definition at line 2597 of file Attributes.cpp.

◆ GET_ATTR_PROP_TABLE

#define GET_ATTR_PROP_TABLE

Definition at line 747 of file Attributes.cpp.

Enumeration Type Documentation

◆ AttributeProperty

Enumerator
FnAttr 
ParamAttr 
RetAttr 
IntersectPreserve 
IntersectAnd 
IntersectMin 
IntersectCustom 
IntersectPropertyMask 

Definition at line 736 of file Attributes.cpp.

Function Documentation

◆ addAttributeImpl()

template<typename K >
static void addAttributeImpl ( SmallVectorImpl< Attribute > &  Attrs,
Kind,
Attribute  Attr 
)
static

Definition at line 2064 of file Attributes.cpp.

References llvm::lower_bound(), and std::swap().

Referenced by llvm::AttrBuilder::addAttribute().

◆ adjustCallerSSPLevel()

static void adjustCallerSSPLevel ( Function Caller,
const Function Callee 
)
static

If the inlined function had a higher stack protection level than the calling function, then bump up the caller's stack protection level.

Definition at line 2473 of file Attributes.cpp.

References llvm::AttributeMask::addAttribute().

◆ adjustCallerStackProbes()

static void adjustCallerStackProbes ( Function Caller,
const Function Callee 
)
static

If the inlined function required stack probes, then ensure that the calling function has those too.

Definition at line 2503 of file Attributes.cpp.

◆ adjustCallerStackProbeSize()

static void adjustCallerStackProbeSize ( Function Caller,
const Function Callee 
)
static

If the inlined function defines the size of guard region on the stack, then ensure that the calling function defines a guard region that is no larger.

Definition at line 2514 of file Attributes.cpp.

References llvm::StringRef::getAsInteger(), llvm::Attribute::getValueAsString(), and llvm::Attribute::isValid().

◆ adjustMinLegalVectorWidth()

static void adjustMinLegalVectorWidth ( Function Caller,
const Function Callee 
)
static

If the inlined function defines a min legal vector width, then ensure the calling function has the same or larger min legal vector width.

If the caller has the attribute, but the callee doesn't, we need to remove the attribute from the caller since we can't make any guarantees about the caller's requirements. This function is called after the inlining decision has been made so we have to merge the attribute this way. Heuristics that would use min-legal-vector-width to determine inline compatibility would need to be handled as part of inline cost analysis.

Definition at line 2542 of file Attributes.cpp.

References llvm::StringRef::getAsInteger(), llvm::Attribute::getValueAsString(), and llvm::Attribute::isValid().

◆ adjustNullPointerValidAttr()

static void adjustNullPointerValidAttr ( Function Caller,
const Function Callee 
)
static

If the inlined function has null_pointer_is_valid attribute, set this attribute in the caller post inlining.

Definition at line 2563 of file Attributes.cpp.

◆ attrIdxToArrayIdx()

static unsigned attrIdxToArrayIdx ( unsigned  Index)
static

Map from AttributeList index to the internal array index.

Adding one happens to work, because -1 wraps around to 0.

Definition at line 1383 of file Attributes.cpp.

Referenced by llvm::AttributeList::addParamAttribute(), llvm::AttributeListImpl::AttributeListImpl(), llvm::AttributeList::get(), llvm::AttributeList::getAttributes(), and llvm::AttributeList::removeAttributesAtIndex().

◆ checkDenormMode()

static bool checkDenormMode ( const Function Caller,
const Function Callee 
)
static

Definition at line 2412 of file Attributes.cpp.

References denormModeCompatible(), and llvm::DenormalMode::getInvalid().

◆ checkStrictFP()

static bool checkStrictFP ( const Function Caller,
const Function Callee 
)
static

Definition at line 2429 of file Attributes.cpp.

◆ denormModeCompatible()

static bool denormModeCompatible ( DenormalMode  CallerMode,
DenormalMode  CalleeMode 
)
static

Callees with dynamic denormal modes are compatible with any caller mode.

Definition at line 2395 of file Attributes.cpp.

References llvm::DenormalMode::Dynamic, llvm::DenormalMode::getDynamic(), llvm::DenormalMode::Input, and llvm::DenormalMode::Output.

Referenced by checkDenormMode().

◆ getAttributeProperties()

static unsigned getAttributeProperties ( Attribute::AttrKind  Kind)
static

Definition at line 750 of file Attributes.cpp.

References assert().

Referenced by hasAttributeProperty(), and hasIntersectProperty().

◆ getModRefStr()

static const char * getModRefStr ( ModRefInfo  MR)
static

Definition at line 508 of file Attributes.cpp.

References llvm_unreachable, llvm::Mod, llvm::ModRef, llvm::NoModRef, and llvm::Ref.

Referenced by llvm::Attribute::getAsString().

◆ hasAttributeProperty()

static bool hasAttributeProperty ( Attribute::AttrKind  Kind,
AttributeProperty  Prop 
)
static

◆ hasIntersectProperty()

static bool hasIntersectProperty ( Attribute::AttrKind  Kind,
AttributeProperty  Prop 
)
static

◆ isEqual() [1/2]

template<typename AttrClass >
static bool isEqual ( const Function Caller,
const Function Callee 
)
static

Definition at line 2437 of file Attributes.cpp.

Referenced by EliminateDuplicatePHINodesSetBasedImpl(), and markAliveBlocks().

◆ isEqual() [2/2]

static bool isEqual ( const Function Caller,
const Function Callee,
const StringRef AttrName 
)
static

Definition at line 2442 of file Attributes.cpp.

◆ packAllocSizeArgs()

static uint64_t packAllocSizeArgs ( unsigned  ElemSizeArg,
const std::optional< unsigned > &  NumElemsArg 
)
static

◆ packVScaleRangeArgs()

static uint64_t packVScaleRangeArgs ( unsigned  MinValue,
std::optional< unsigned MaxValue 
)
static

◆ setAND()

template<typename AttrClass >
static void setAND ( Function Caller,
const Function Callee 
)
static

Compute the logical AND of the attributes of the caller and the callee.

This function sets the caller's attribute to false if the callee's attribute is false.

Definition at line 2453 of file Attributes.cpp.

◆ setOR()

template<typename AttrClass >
static void setOR ( Function Caller,
const Function Callee 
)
static

Compute the logical OR of the attributes of the caller and the callee.

This function sets the caller's attribute to true if the callee's attribute is true.

Definition at line 2465 of file Attributes.cpp.

◆ unpackAllocSizeArgs()

static std::pair< unsigned, std::optional< unsigned > > unpackAllocSizeArgs ( uint64_t  Num)
static

Definition at line 71 of file Attributes.cpp.

References AllocSizeNumElemsNotPresent.

Referenced by llvm::Attribute::getAllocSizeArgs().

◆ unpackVScaleRangeArgs()

static std::pair< unsigned, std::optional< unsigned > > unpackVScaleRangeArgs ( uint64_t  Value)
static

Variable Documentation

◆ AllocSizeNumElemsNotPresent

const unsigned AllocSizeNumElemsNotPresent = -1
static

Definition at line 59 of file Attributes.cpp.

Referenced by packAllocSizeArgs(), and unpackAllocSizeArgs().