summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2008-12-19 06:39:12 +0000
committerNick Lewycky <nicholas@mxc.ca>2008-12-19 06:39:12 +0000
commit2abb108f1b92ffa60dd8a89d3c90eddabb5ea76f (patch)
treef05e6d0ee2d6177814d1d3197b1a8bd8d56dd947 /llvm/include
parent19a54ffc7f955c5b322abce63fdf06c7dc2bd42e (diff)
downloadbcm5719-llvm-2abb108f1b92ffa60dd8a89d3c90eddabb5ea76f.tar.gz
bcm5719-llvm-2abb108f1b92ffa60dd8a89d3c90eddabb5ea76f.zip
Resubmit support for the 'nocapture' attribute.
The problematic part of this patch is that we were out of attribute bits, requiring some fancy bit hacking to make it fit (by shrinking alignment) without breaking existing users or the file format. This change will require users to rebuild llvm-gcc to match llvm. llvm-svn: 61239
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/Attributes.h39
1 files changed, 26 insertions, 13 deletions
diff --git a/llvm/include/llvm/Attributes.h b/llvm/include/llvm/Attributes.h
index 57f4e17c47f..ab093788f7a 100644
--- a/llvm/include/llvm/Attributes.h
+++ b/llvm/include/llvm/Attributes.h
@@ -15,6 +15,7 @@
#ifndef LLVM_ATTRIBUTES_H
#define LLVM_ATTRIBUTES_H
+#include "llvm/Support/MathExtras.h"
#include <cassert>
#include <string>
@@ -23,7 +24,7 @@ class Type;
/// Attributes - A bitset of attributes.
typedef unsigned Attributes;
-
+
namespace Attribute {
/// Function parameters and results can have attributes to indicate how they
@@ -44,16 +45,18 @@ 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
-const Attributes NoInline = 1<<11; // inline=never
-const Attributes AlwaysInline = 1<<12; // inline=always
-const Attributes OptimizeForSize = 1<<13; // opt_size
-const Attributes StackProtect = 1<<14; // Stack protection.
-const Attributes StackProtectReq = 1<<15; // Stack protection required.
-const Attributes Alignment = 0xffff<<16; ///< Alignment of parameter (16 bits)
- // 0 = unknown, else in clear (not log)
-
+const Attributes NoInline = 1<<11; ///< inline=never
+const Attributes AlwaysInline = 1<<12; ///< inline=always
+const Attributes OptimizeForSize = 1<<13; ///< opt_size
+const Attributes StackProtect = 1<<14; ///< Stack protection.
+const Attributes StackProtectReq = 1<<15; ///< Stack protection required.
+const Attributes Alignment = 31<<16; ///< Alignment of parameter (5 bits)
+ // stored as log2 of alignment with +1 bias
+ // 0 means unaligned different from align 1
+const Attributes NoCapture = 1<<21; ///< Function creates no aliases of pointer
+
/// @brief Attributes that only apply to function parameters.
-const Attributes ParameterOnly = ByVal | Nest | StructRet;
+const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture;
/// @brief Attributes that only apply to function.
const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly |
@@ -64,7 +67,7 @@ const Attributes VarArgsIncompatible = StructRet;
/// @brief Attributes that are mutually incompatible.
const Attributes MutuallyIncompatible[4] = {
- ByVal | InReg | Nest | StructRet,
+ ByVal | InReg | Nest | StructRet,
ZExt | SExt,
ReadNone | ReadOnly,
NoInline | AlwaysInline
@@ -76,7 +79,13 @@ Attributes typeIncompatible(const Type *Ty);
/// This turns an int alignment (a power of 2, normally) into the
/// form used internally in Attributes.
inline Attributes constructAlignmentFromInt(unsigned i) {
- return (i << 16);
+ // Default alignment, allow the target to define how to align it.
+ if (i == 0)
+ return 0;
+
+ assert(isPowerOf2_32(i) && "Alignment must be a power of two.");
+ assert(i <= 0x40000000 && "Alignment too large.");
+ return (Log2_32(i)+1) << 16;
}
/// The set of Attributes set in Attributes is converted to a
@@ -175,7 +184,11 @@ public:
/// getParamAlignment - Return the alignment for the specified function
/// parameter.
unsigned getParamAlignment(unsigned Idx) const {
- return (getAttributes(Idx) & Attribute::Alignment) >> 16;
+ Attributes Align = getAttributes(Idx) & Attribute::Alignment;
+ if (Align == 0)
+ return 0;
+
+ return 1ull << ((Align >> 16) - 1);
}
/// hasAttrSomewhere - Return true if the specified attribute is set for at
OpenPOWER on IntegriCloud