mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[tsan/msan] adding thread_safety and uninitialized_checks attributes
llvm-svn: 174864
This commit is contained in:
parent
3fa3bbfe65
commit
8e2f1fbfb7
@ -909,6 +909,12 @@ example:
|
||||
If a function that has an ``sspstrong`` attribute is inlined into a
|
||||
function that doesn't have an ``sspstrong`` attribute, then the
|
||||
resulting function will have an ``sspstrong`` attribute.
|
||||
``thread_safety``
|
||||
This attribute indicates that the thread safety analysis is enabled
|
||||
for this function.
|
||||
``uninitialized_checks``
|
||||
This attribute indicates that the checks for uses of uninitialized
|
||||
memory are enabled.
|
||||
``uwtable``
|
||||
This attribute indicates that the ABI being targeted requires that
|
||||
an unwind table entry be produce for this function even if we can
|
||||
|
@ -95,6 +95,8 @@ public:
|
||||
StackProtectReq, ///< Stack protection required.
|
||||
StackProtectStrong, ///< Strong Stack protection.
|
||||
StructRet, ///< Hidden pointer to structure to return
|
||||
ThreadSafety, ///< Thread safety checking is on.
|
||||
UninitializedChecks, ///< Checking for uses of uninitialized memory is on.
|
||||
UWTable, ///< Function must be in a unwind table
|
||||
ZExt, ///< Zero extended before/after call
|
||||
|
||||
@ -507,6 +509,8 @@ public:
|
||||
.removeAttribute(Attribute::NonLazyBind)
|
||||
.removeAttribute(Attribute::ReturnsTwice)
|
||||
.removeAttribute(Attribute::AddressSafety)
|
||||
.removeAttribute(Attribute::ThreadSafety)
|
||||
.removeAttribute(Attribute::UninitializedChecks)
|
||||
.removeAttribute(Attribute::MinSize)
|
||||
.removeAttribute(Attribute::NoDuplicate);
|
||||
}
|
||||
|
@ -578,6 +578,8 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(ssp);
|
||||
KEYWORD(sspreq);
|
||||
KEYWORD(sspstrong);
|
||||
KEYWORD(thread_safety);
|
||||
KEYWORD(uninitialized_checks);
|
||||
KEYWORD(uwtable);
|
||||
KEYWORD(zeroext);
|
||||
|
||||
|
@ -922,6 +922,8 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B,
|
||||
case lltok::kw_ssp: B.addAttribute(Attribute::StackProtect); break;
|
||||
case lltok::kw_sspreq: B.addAttribute(Attribute::StackProtectReq); break;
|
||||
case lltok::kw_sspstrong: B.addAttribute(Attribute::StackProtectStrong); break;
|
||||
case lltok::kw_thread_safety: B.addAttribute(Attribute::ThreadSafety); break;
|
||||
case lltok::kw_uninitialized_checks: B.addAttribute(Attribute::UninitializedChecks); break;
|
||||
case lltok::kw_uwtable: B.addAttribute(Attribute::UWTable); break;
|
||||
|
||||
// Error handling.
|
||||
@ -1161,7 +1163,8 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
|
||||
case lltok::kw_noredzone: case lltok::kw_noimplicitfloat:
|
||||
case lltok::kw_naked: case lltok::kw_nonlazybind:
|
||||
case lltok::kw_address_safety: case lltok::kw_minsize:
|
||||
case lltok::kw_alignstack:
|
||||
case lltok::kw_alignstack: case lltok::kw_thread_safety:
|
||||
case lltok::kw_uninitialized_checks:
|
||||
HaveError |= Error(Lex.getLoc(), "invalid use of function-only attribute");
|
||||
break;
|
||||
}
|
||||
@ -1203,6 +1206,7 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
|
||||
case lltok::kw_nonlazybind: case lltok::kw_address_safety:
|
||||
case lltok::kw_minsize: case lltok::kw_alignstack:
|
||||
case lltok::kw_align: case lltok::kw_noduplicate:
|
||||
case lltok::kw_thread_safety: case lltok::kw_uninitialized_checks:
|
||||
HaveError |= Error(Lex.getLoc(), "invalid use of function-only attribute");
|
||||
break;
|
||||
}
|
||||
|
@ -119,6 +119,8 @@ namespace lltok {
|
||||
kw_sspreq,
|
||||
kw_sspstrong,
|
||||
kw_sret,
|
||||
kw_thread_safety,
|
||||
kw_uninitialized_checks,
|
||||
kw_uwtable,
|
||||
kw_zeroext,
|
||||
|
||||
|
@ -444,7 +444,7 @@ static void decodeLLVMAttributesForBitcode(AttrBuilder &B,
|
||||
|
||||
if (Alignment)
|
||||
B.addAlignmentAttr(Alignment);
|
||||
B.addRawValue(((EncodedAttrs & (0xffffULL << 32)) >> 11) |
|
||||
B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
|
||||
(EncodedAttrs & 0xffff));
|
||||
}
|
||||
|
||||
|
@ -181,7 +181,7 @@ static uint64_t encodeLLVMAttributesForBitcode(AttributeSet Attrs,
|
||||
uint64_t EncodedAttrs = Attrs.Raw(Index) & 0xffff;
|
||||
if (Attrs.hasAttribute(Index, Attribute::Alignment))
|
||||
EncodedAttrs |= Attrs.getParamAlignment(Index) << 16;
|
||||
EncodedAttrs |= (Attrs.Raw(Index) & (0xffffULL << 21)) << 11;
|
||||
EncodedAttrs |= (Attrs.Raw(Index) & (0xfffffULL << 21)) << 11;
|
||||
return EncodedAttrs;
|
||||
}
|
||||
|
||||
|
@ -205,6 +205,10 @@ std::string Attribute::getAsString() const {
|
||||
return "sspstrong";
|
||||
if (hasAttribute(Attribute::StructRet))
|
||||
return "sret";
|
||||
if (hasAttribute(Attribute::ThreadSafety))
|
||||
return "thread_safety";
|
||||
if (hasAttribute(Attribute::UninitializedChecks))
|
||||
return "uninitialized_checks";
|
||||
if (hasAttribute(Attribute::UWTable))
|
||||
return "uwtable";
|
||||
if (hasAttribute(Attribute::ZExt))
|
||||
@ -382,6 +386,8 @@ uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) {
|
||||
case Attribute::MinSize: return 1ULL << 33;
|
||||
case Attribute::NoDuplicate: return 1ULL << 34;
|
||||
case Attribute::StackProtectStrong: return 1ULL << 35;
|
||||
case Attribute::ThreadSafety: return 1ULL << 36;
|
||||
case Attribute::UninitializedChecks: return 1ULL << 37;
|
||||
}
|
||||
llvm_unreachable("Unsupported attribute type");
|
||||
}
|
||||
|
@ -651,6 +651,8 @@ void Verifier::VerifyParameterAttrs(AttributeSet Attrs, uint64_t Idx, Type *Ty,
|
||||
!Attrs.hasAttribute(Idx, Attribute::NonLazyBind) &&
|
||||
!Attrs.hasAttribute(Idx, Attribute::ReturnsTwice) &&
|
||||
!Attrs.hasAttribute(Idx, Attribute::AddressSafety) &&
|
||||
!Attrs.hasAttribute(Idx, Attribute::ThreadSafety) &&
|
||||
!Attrs.hasAttribute(Idx, Attribute::UninitializedChecks) &&
|
||||
!Attrs.hasAttribute(Idx, Attribute::MinSize),
|
||||
"Some attributes in '" + Attrs.getAsString(Idx) +
|
||||
"' only apply to functions!", V);
|
||||
|
@ -162,3 +162,13 @@ define void @f27() address_safety
|
||||
{
|
||||
ret void;
|
||||
}
|
||||
define void @f28() thread_safety
|
||||
; CHECK: define void @f28() thread_safety
|
||||
{
|
||||
ret void;
|
||||
}
|
||||
define void @f29() uninitialized_checks
|
||||
; CHECK: define void @f29() uninitialized_checks
|
||||
{
|
||||
ret void;
|
||||
}
|
||||
|
@ -175,6 +175,8 @@ FuncAttr ::= noreturn
|
||||
| returns_twice
|
||||
| nonlazybind
|
||||
| address_safety
|
||||
| thread_safety
|
||||
| uninitialized_checks
|
||||
;
|
||||
|
||||
OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;
|
||||
|
@ -55,6 +55,7 @@ syn keyword llvmKeyword singlethread spir_func spir_kernel sret ssp sspreq
|
||||
syn keyword llvmKeyword sspstrong tail target thread_local to triple
|
||||
syn keyword llvmKeyword unnamed_addr unordered uwtable volatile weak weak_odr
|
||||
syn keyword llvmKeyword x86_fastcallcc x86_stdcallcc x86_thiscallcc zeroext
|
||||
syn keyword llvmKeyword thread_safety uninitialized_checks
|
||||
|
||||
" Obsolete keywords.
|
||||
syn keyword llvmError getresult begin end
|
||||
|
Loading…
x
Reference in New Issue
Block a user