2007-04-11 02:44:20 +00:00
|
|
|
//===-- llvm/ParameterAttributes.h - Container for ParamAttrs ---*- C++ -*-===//
|
2007-04-08 14:46:50 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-29 19:59:42 +00:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2007-04-08 14:46:50 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
2008-02-22 22:17:59 +00:00
|
|
|
// This file contains the simple types necessary to represent the parameter
|
|
|
|
// attributes associated with functions and their calls.
|
2007-04-08 14:46:50 +00:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_PARAMETER_ATTRIBUTES_H
|
|
|
|
#define LLVM_PARAMETER_ATTRIBUTES_H
|
|
|
|
|
2008-02-25 19:20:57 +00:00
|
|
|
#include "llvm/Support/DataTypes.h"
|
2008-01-03 03:32:33 +00:00
|
|
|
#include <cassert>
|
2007-04-08 14:46:50 +00:00
|
|
|
|
|
|
|
namespace llvm {
|
2008-01-06 18:27:01 +00:00
|
|
|
class Type;
|
|
|
|
|
2007-04-11 02:44:20 +00:00
|
|
|
namespace ParamAttr {
|
|
|
|
|
2007-04-22 17:28:03 +00:00
|
|
|
/// Function parameters and results can have attributes to indicate how they
|
|
|
|
/// should be treated by optimizations and code generation. This enumeration
|
|
|
|
/// lists the attributes that can be associated with parameters or function
|
|
|
|
/// results.
|
|
|
|
/// @brief Function parameter attributes.
|
2008-02-19 21:38:47 +00:00
|
|
|
|
|
|
|
/// @brief A more friendly way to reference the attributes.
|
|
|
|
typedef uint32_t Attributes;
|
|
|
|
|
|
|
|
const Attributes None = 0; ///< No attributes have been set
|
|
|
|
const Attributes ZExt = 1<<0; ///< Zero extended before/after call
|
|
|
|
const Attributes SExt = 1<<1; ///< Sign extended before/after call
|
|
|
|
const Attributes NoReturn = 1<<2; ///< Mark the function as not returning
|
|
|
|
const Attributes InReg = 1<<3; ///< Force argument to be passed in register
|
|
|
|
const Attributes StructRet = 1<<4; ///< Hidden pointer to structure to return
|
|
|
|
const Attributes NoUnwind = 1<<5; ///< Function doesn't unwind stack
|
|
|
|
const Attributes NoAlias = 1<<6; ///< Considered to not alias after call
|
|
|
|
const Attributes ByVal = 1<<7; ///< Pass structure by value
|
|
|
|
const Attributes Nest = 1<<8; ///< Nested function static chain
|
|
|
|
const Attributes ReadNone = 1<<9; ///< Function does not access memory
|
|
|
|
const Attributes ReadOnly = 1<<10; ///< Function only reads from memory
|
2008-02-19 23:51:49 +00:00
|
|
|
const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits)
|
|
|
|
// 0 = unknown, else in clear (not log)
|
2007-04-08 14:46:50 +00:00
|
|
|
|
2007-11-25 14:10:56 +00:00
|
|
|
/// @brief Attributes that only apply to function parameters.
|
2008-02-19 21:38:47 +00:00
|
|
|
const Attributes ParameterOnly = ByVal | InReg | Nest | StructRet;
|
2007-11-25 14:10:56 +00:00
|
|
|
|
|
|
|
/// @brief Attributes that only apply to function return values.
|
2008-02-19 21:38:47 +00:00
|
|
|
const Attributes ReturnOnly = NoReturn | NoUnwind | ReadNone | ReadOnly;
|
2007-11-25 14:10:56 +00:00
|
|
|
|
2008-01-12 16:42:01 +00:00
|
|
|
/// @brief Parameter attributes that do not apply to vararg call arguments.
|
2008-02-19 21:38:47 +00:00
|
|
|
const Attributes VarArgsIncompatible = StructRet;
|
2008-01-11 22:36:48 +00:00
|
|
|
|
2007-11-25 14:10:56 +00:00
|
|
|
/// @brief Attributes that are mutually incompatible.
|
2008-02-19 21:38:47 +00:00
|
|
|
const Attributes MutuallyIncompatible[3] = {
|
2007-11-25 14:10:56 +00:00
|
|
|
ByVal | InReg | Nest | StructRet,
|
|
|
|
ZExt | SExt,
|
|
|
|
ReadNone | ReadOnly
|
|
|
|
};
|
|
|
|
|
2008-01-07 17:16:06 +00:00
|
|
|
/// @brief Which attributes cannot be applied to a type.
|
2008-02-19 21:38:47 +00:00
|
|
|
Attributes typeIncompatible (const Type *Ty);
|
2008-01-06 18:27:01 +00:00
|
|
|
|
2008-02-22 17:49:45 +00:00
|
|
|
/// This turns an int alignment (a power of 2, normally) into the
|
|
|
|
/// form used internally in ParameterAttributes.
|
|
|
|
ParamAttr::Attributes inline constructAlignmentFromInt(uint32_t i) {
|
|
|
|
return (i << 16);
|
|
|
|
}
|
|
|
|
|
2008-01-02 23:42:30 +00:00
|
|
|
} // end namespace ParamAttr
|
2007-04-11 02:44:20 +00:00
|
|
|
|
2008-02-19 21:38:47 +00:00
|
|
|
/// @brief A more friendly way to reference the attributes.
|
|
|
|
typedef ParamAttr::Attributes ParameterAttributes;
|
|
|
|
|
2007-04-22 05:46:44 +00:00
|
|
|
/// This is just a pair of values to associate a set of parameter attributes
|
2007-04-22 17:28:03 +00:00
|
|
|
/// with a parameter index.
|
2007-04-22 05:46:44 +00:00
|
|
|
/// @brief ParameterAttributes with a parameter index.
|
|
|
|
struct ParamAttrsWithIndex {
|
2008-02-19 21:38:47 +00:00
|
|
|
ParameterAttributes attrs; ///< The attributes that are set, or'd together
|
2007-04-22 05:46:44 +00:00
|
|
|
uint16_t index; ///< Index of the parameter for which the attributes apply
|
2007-06-18 21:50:49 +00:00
|
|
|
|
2008-02-19 21:38:47 +00:00
|
|
|
static ParamAttrsWithIndex get(uint16_t idx, ParameterAttributes attrs) {
|
2007-06-18 21:50:49 +00:00
|
|
|
ParamAttrsWithIndex P;
|
|
|
|
P.index = idx;
|
|
|
|
P.attrs = attrs;
|
|
|
|
return P;
|
|
|
|
}
|
2007-04-22 05:46:44 +00:00
|
|
|
};
|
|
|
|
|
2007-04-08 14:46:50 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
|
|
|
#endif
|