@@ -59,35 +59,37 @@ pub enum Linkage {
59
59
60
60
#[ deriving( Clone ) ]
61
61
pub enum Attribute {
62
- ZExtAttribute = 1 ,
63
- SExtAttribute = 2 ,
64
- NoReturnAttribute = 4 ,
65
- InRegAttribute = 8 ,
66
- StructRetAttribute = 16 ,
67
- NoUnwindAttribute = 32 ,
68
- NoAliasAttribute = 64 ,
69
- ByValAttribute = 128 ,
70
- NestAttribute = 256 ,
71
- ReadNoneAttribute = 512 ,
72
- ReadOnlyAttribute = 1024 ,
73
- NoInlineAttribute = 2048 ,
74
- AlwaysInlineAttribute = 4096 ,
75
- OptimizeForSizeAttribute = 8192 ,
76
- StackProtectAttribute = 16384 ,
77
- StackProtectReqAttribute = 32768 ,
78
- // 31 << 16
79
- AlignmentAttribute = 2031616 ,
80
- NoCaptureAttribute = 2097152 ,
81
- NoRedZoneAttribute = 4194304 ,
82
- NoImplicitFloatAttribute = 8388608 ,
83
- NakedAttribute = 16777216 ,
84
- InlineHintAttribute = 33554432 ,
85
- // 7 << 26
86
- StackAttribute = 469762048 ,
87
- ReturnsTwiceAttribute = 536870912 ,
88
- // 1 << 30
89
- UWTableAttribute = 1073741824 ,
90
- NonLazyBindAttribute = 2147483648 ,
62
+ ZExtAttribute = 1 << 0 ,
63
+ SExtAttribute = 1 << 1 ,
64
+ NoReturnAttribute = 1 << 2 ,
65
+ InRegAttribute = 1 << 3 ,
66
+ StructRetAttribute = 1 << 4 ,
67
+ NoUnwindAttribute = 1 << 5 ,
68
+ NoAliasAttribute = 1 << 6 ,
69
+ ByValAttribute = 1 << 7 ,
70
+ NestAttribute = 1 << 8 ,
71
+ ReadNoneAttribute = 1 << 9 ,
72
+ ReadOnlyAttribute = 1 << 10 ,
73
+ NoInlineAttribute = 1 << 11 ,
74
+ AlwaysInlineAttribute = 1 << 12 ,
75
+ OptimizeForSizeAttribute = 1 << 13 ,
76
+ StackProtectAttribute = 1 << 14 ,
77
+ StackProtectReqAttribute = 1 << 15 ,
78
+ AlignmentAttribute = 31 << 16 ,
79
+ NoCaptureAttribute = 1 << 21 ,
80
+ NoRedZoneAttribute = 1 << 22 ,
81
+ NoImplicitFloatAttribute = 1 << 23 ,
82
+ NakedAttribute = 1 << 24 ,
83
+ InlineHintAttribute = 1 << 25 ,
84
+ StackAttribute = 7 << 26 ,
85
+ ReturnsTwiceAttribute = 1 << 29 ,
86
+ UWTableAttribute = 1 << 30 ,
87
+ NonLazyBindAttribute = 1 << 31 ,
88
+
89
+ // Not added to LLVM yet, so may need to stay updated if LLVM changes.
90
+ // FIXME(#8199): if this changes, be sure to change the relevant constant
91
+ // down below
92
+ // FixedStackSegment = 1 << 41,
91
93
}
92
94
93
95
// enum for the LLVM IntPredicate type
@@ -1541,7 +1543,8 @@ pub mod llvm {
1541
1543
Op : AtomicBinOp ,
1542
1544
LHS : ValueRef ,
1543
1545
RHS : ValueRef ,
1544
- Order : AtomicOrdering )
1546
+ Order : AtomicOrdering ,
1547
+ SingleThreaded : Bool )
1545
1548
-> ValueRef ;
1546
1549
1547
1550
pub fn LLVMBuildAtomicFence ( B : BuilderRef , Order : AtomicOrdering ) ;
@@ -2106,6 +2109,28 @@ pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef {
2106
2109
llvm:: LLVMConstFCmp ( Pred as c_ushort , V1 , V2 )
2107
2110
}
2108
2111
}
2112
+
2113
+ pub fn SetFunctionAttribute ( Fn : ValueRef , attr : Attribute ) {
2114
+ unsafe {
2115
+ let attr = attr as u64 ;
2116
+ let lower = attr & 0xffffffff ;
2117
+ let upper = ( attr >> 32 ) & 0xffffffff ;
2118
+ llvm:: LLVMAddFunctionAttr ( Fn , lower as c_uint , upper as c_uint ) ;
2119
+ }
2120
+ }
2121
+
2122
+ // FIXME(#8199): this shouldn't require this hackery. On i686
2123
+ // (FixedStackSegment as u64) will return 0 instead of 1 << 41.
2124
+ // Furthermore, if we use a match of any sort then an LLVM
2125
+ // assertion is generated!
2126
+ pub fn SetFixedStackSegmentAttribute ( Fn : ValueRef ) {
2127
+ unsafe {
2128
+ let attr = 1u64 << 41 ;
2129
+ let lower = attr & 0xffffffff ;
2130
+ let upper = ( attr >> 32 ) & 0xffffffff ;
2131
+ llvm:: LLVMAddFunctionAttr ( Fn , lower as c_uint , upper as c_uint ) ;
2132
+ }
2133
+ }
2109
2134
/* Memory-managed object interface to type handles. */
2110
2135
2111
2136
pub struct TypeNames {
0 commit comments