1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[tsan/msan] adding thread_safety and uninitialized_checks attributes

llvm-svn: 174864
This commit is contained in:
Kostya Serebryany 2013-02-11 08:13:54 +00:00
parent 3fa3bbfe65
commit 8e2f1fbfb7
12 changed files with 42 additions and 3 deletions

View File

@ -909,6 +909,12 @@ example:
If a function that has an ``sspstrong`` attribute is inlined into a If a function that has an ``sspstrong`` attribute is inlined into a
function that doesn't have an ``sspstrong`` attribute, then the function that doesn't have an ``sspstrong`` attribute, then the
resulting function will have an ``sspstrong`` attribute. 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`` ``uwtable``
This attribute indicates that the ABI being targeted requires that This attribute indicates that the ABI being targeted requires that
an unwind table entry be produce for this function even if we can an unwind table entry be produce for this function even if we can

View File

@ -95,6 +95,8 @@ public:
StackProtectReq, ///< Stack protection required. StackProtectReq, ///< Stack protection required.
StackProtectStrong, ///< Strong Stack protection. StackProtectStrong, ///< Strong Stack protection.
StructRet, ///< Hidden pointer to structure to return 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 UWTable, ///< Function must be in a unwind table
ZExt, ///< Zero extended before/after call ZExt, ///< Zero extended before/after call
@ -507,6 +509,8 @@ public:
.removeAttribute(Attribute::NonLazyBind) .removeAttribute(Attribute::NonLazyBind)
.removeAttribute(Attribute::ReturnsTwice) .removeAttribute(Attribute::ReturnsTwice)
.removeAttribute(Attribute::AddressSafety) .removeAttribute(Attribute::AddressSafety)
.removeAttribute(Attribute::ThreadSafety)
.removeAttribute(Attribute::UninitializedChecks)
.removeAttribute(Attribute::MinSize) .removeAttribute(Attribute::MinSize)
.removeAttribute(Attribute::NoDuplicate); .removeAttribute(Attribute::NoDuplicate);
} }

View File

@ -578,6 +578,8 @@ lltok::Kind LLLexer::LexIdentifier() {
KEYWORD(ssp); KEYWORD(ssp);
KEYWORD(sspreq); KEYWORD(sspreq);
KEYWORD(sspstrong); KEYWORD(sspstrong);
KEYWORD(thread_safety);
KEYWORD(uninitialized_checks);
KEYWORD(uwtable); KEYWORD(uwtable);
KEYWORD(zeroext); KEYWORD(zeroext);

View File

@ -922,6 +922,8 @@ bool LLParser::ParseFnAttributeValuePairs(AttrBuilder &B,
case lltok::kw_ssp: B.addAttribute(Attribute::StackProtect); break; case lltok::kw_ssp: B.addAttribute(Attribute::StackProtect); break;
case lltok::kw_sspreq: B.addAttribute(Attribute::StackProtectReq); break; case lltok::kw_sspreq: B.addAttribute(Attribute::StackProtectReq); break;
case lltok::kw_sspstrong: B.addAttribute(Attribute::StackProtectStrong); 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; case lltok::kw_uwtable: B.addAttribute(Attribute::UWTable); break;
// Error handling. // Error handling.
@ -1161,7 +1163,8 @@ bool LLParser::ParseOptionalParamAttrs(AttrBuilder &B) {
case lltok::kw_noredzone: case lltok::kw_noimplicitfloat: case lltok::kw_noredzone: case lltok::kw_noimplicitfloat:
case lltok::kw_naked: case lltok::kw_nonlazybind: case lltok::kw_naked: case lltok::kw_nonlazybind:
case lltok::kw_address_safety: case lltok::kw_minsize: 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"); HaveError |= Error(Lex.getLoc(), "invalid use of function-only attribute");
break; break;
} }
@ -1203,6 +1206,7 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
case lltok::kw_nonlazybind: case lltok::kw_address_safety: case lltok::kw_nonlazybind: case lltok::kw_address_safety:
case lltok::kw_minsize: case lltok::kw_alignstack: case lltok::kw_minsize: case lltok::kw_alignstack:
case lltok::kw_align: case lltok::kw_noduplicate: 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"); HaveError |= Error(Lex.getLoc(), "invalid use of function-only attribute");
break; break;
} }

View File

@ -119,6 +119,8 @@ namespace lltok {
kw_sspreq, kw_sspreq,
kw_sspstrong, kw_sspstrong,
kw_sret, kw_sret,
kw_thread_safety,
kw_uninitialized_checks,
kw_uwtable, kw_uwtable,
kw_zeroext, kw_zeroext,

View File

@ -444,7 +444,7 @@ static void decodeLLVMAttributesForBitcode(AttrBuilder &B,
if (Alignment) if (Alignment)
B.addAlignmentAttr(Alignment); B.addAlignmentAttr(Alignment);
B.addRawValue(((EncodedAttrs & (0xffffULL << 32)) >> 11) | B.addRawValue(((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
(EncodedAttrs & 0xffff)); (EncodedAttrs & 0xffff));
} }

View File

@ -181,7 +181,7 @@ static uint64_t encodeLLVMAttributesForBitcode(AttributeSet Attrs,
uint64_t EncodedAttrs = Attrs.Raw(Index) & 0xffff; uint64_t EncodedAttrs = Attrs.Raw(Index) & 0xffff;
if (Attrs.hasAttribute(Index, Attribute::Alignment)) if (Attrs.hasAttribute(Index, Attribute::Alignment))
EncodedAttrs |= Attrs.getParamAlignment(Index) << 16; EncodedAttrs |= Attrs.getParamAlignment(Index) << 16;
EncodedAttrs |= (Attrs.Raw(Index) & (0xffffULL << 21)) << 11; EncodedAttrs |= (Attrs.Raw(Index) & (0xfffffULL << 21)) << 11;
return EncodedAttrs; return EncodedAttrs;
} }

View File

@ -205,6 +205,10 @@ std::string Attribute::getAsString() const {
return "sspstrong"; return "sspstrong";
if (hasAttribute(Attribute::StructRet)) if (hasAttribute(Attribute::StructRet))
return "sret"; return "sret";
if (hasAttribute(Attribute::ThreadSafety))
return "thread_safety";
if (hasAttribute(Attribute::UninitializedChecks))
return "uninitialized_checks";
if (hasAttribute(Attribute::UWTable)) if (hasAttribute(Attribute::UWTable))
return "uwtable"; return "uwtable";
if (hasAttribute(Attribute::ZExt)) if (hasAttribute(Attribute::ZExt))
@ -382,6 +386,8 @@ uint64_t AttributeImpl::getAttrMask(Attribute::AttrKind Val) {
case Attribute::MinSize: return 1ULL << 33; case Attribute::MinSize: return 1ULL << 33;
case Attribute::NoDuplicate: return 1ULL << 34; case Attribute::NoDuplicate: return 1ULL << 34;
case Attribute::StackProtectStrong: return 1ULL << 35; case Attribute::StackProtectStrong: return 1ULL << 35;
case Attribute::ThreadSafety: return 1ULL << 36;
case Attribute::UninitializedChecks: return 1ULL << 37;
} }
llvm_unreachable("Unsupported attribute type"); llvm_unreachable("Unsupported attribute type");
} }

View File

@ -651,6 +651,8 @@ void Verifier::VerifyParameterAttrs(AttributeSet Attrs, uint64_t Idx, Type *Ty,
!Attrs.hasAttribute(Idx, Attribute::NonLazyBind) && !Attrs.hasAttribute(Idx, Attribute::NonLazyBind) &&
!Attrs.hasAttribute(Idx, Attribute::ReturnsTwice) && !Attrs.hasAttribute(Idx, Attribute::ReturnsTwice) &&
!Attrs.hasAttribute(Idx, Attribute::AddressSafety) && !Attrs.hasAttribute(Idx, Attribute::AddressSafety) &&
!Attrs.hasAttribute(Idx, Attribute::ThreadSafety) &&
!Attrs.hasAttribute(Idx, Attribute::UninitializedChecks) &&
!Attrs.hasAttribute(Idx, Attribute::MinSize), !Attrs.hasAttribute(Idx, Attribute::MinSize),
"Some attributes in '" + Attrs.getAsString(Idx) + "Some attributes in '" + Attrs.getAsString(Idx) +
"' only apply to functions!", V); "' only apply to functions!", V);

View File

@ -162,3 +162,13 @@ define void @f27() address_safety
{ {
ret void; 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;
}

View File

@ -175,6 +175,8 @@ FuncAttr ::= noreturn
| returns_twice | returns_twice
| nonlazybind | nonlazybind
| address_safety | address_safety
| thread_safety
| uninitialized_checks
; ;
OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ; OptFuncAttrs ::= + _ | OptFuncAttrs FuncAttr ;

View File

@ -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 sspstrong tail target thread_local to triple
syn keyword llvmKeyword unnamed_addr unordered uwtable volatile weak weak_odr syn keyword llvmKeyword unnamed_addr unordered uwtable volatile weak weak_odr
syn keyword llvmKeyword x86_fastcallcc x86_stdcallcc x86_thiscallcc zeroext syn keyword llvmKeyword x86_fastcallcc x86_stdcallcc x86_thiscallcc zeroext
syn keyword llvmKeyword thread_safety uninitialized_checks
" Obsolete keywords. " Obsolete keywords.
syn keyword llvmError getresult begin end syn keyword llvmError getresult begin end