diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-07-31 01:52:11 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-07-31 01:52:11 +0000 |
commit | d21139a34f5115b8cb95949194cfb40809bd0d17 (patch) | |
tree | 522cfe1ac45702b4cb9b15e8333c70dbe78aa4a6 /clang/lib/AST/AttrImpl.cpp | |
parent | 5300d37aa743418298ebb36c5041b71674d9cb8e (diff) | |
download | bcm5719-llvm-d21139a34f5115b8cb95949194cfb40809bd0d17.tar.gz bcm5719-llvm-d21139a34f5115b8cb95949194cfb40809bd0d17.zip |
After a lengthy design discussion, add support for "ownership attributes" for malloc/free checking. Patch by Andrew McGregor!
llvm-svn: 109939
Diffstat (limited to 'clang/lib/AST/AttrImpl.cpp')
-rw-r--r-- | clang/lib/AST/AttrImpl.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/lib/AST/AttrImpl.cpp b/clang/lib/AST/AttrImpl.cpp index 7277bbce24b..4146248fb03 100644 --- a/clang/lib/AST/AttrImpl.cpp +++ b/clang/lib/AST/AttrImpl.cpp @@ -48,6 +48,43 @@ NonNullAttr::NonNullAttr(ASTContext &C, unsigned* arg_nums, unsigned size) memcpy(ArgNums, arg_nums, sizeof(*ArgNums)*size); } +OwnershipAttr::OwnershipAttr(attr::Kind AK, ASTContext &C, unsigned* arg_nums, + unsigned size, + llvm::StringRef module, + OwnershipKind kind) : + AttrWithString(AK, C, module), ArgNums(0), Size(0), OKind(kind) { + if (size == 0) + return; + assert(arg_nums); + ArgNums = new (C) unsigned[size]; + Size = size; + AKind = AK; + OKind = kind; + memcpy(ArgNums, arg_nums, sizeof(*ArgNums) * size); +} + + +void OwnershipAttr::Destroy(ASTContext &C) { + if (ArgNums) + C.Deallocate(ArgNums); +} + +OwnershipTakesAttr::OwnershipTakesAttr(ASTContext &C, unsigned* arg_nums, + unsigned size, llvm::StringRef module) : + OwnershipAttr(attr::OwnershipTakes, C, arg_nums, size, module, Takes) { +} + +OwnershipHoldsAttr::OwnershipHoldsAttr(ASTContext &C, unsigned* arg_nums, + unsigned size, llvm::StringRef module) : + OwnershipAttr(attr::OwnershipHolds, C, arg_nums, size, module, Holds) { +} + +OwnershipReturnsAttr::OwnershipReturnsAttr(ASTContext &C, unsigned* arg_nums, + unsigned size, + llvm::StringRef module) : + OwnershipAttr(attr::OwnershipReturns, C, arg_nums, size, module, Returns) { +} + #define DEF_SIMPLE_ATTR_CLONE(ATTR) \ Attr *ATTR##Attr::clone(ASTContext &C) const { \ return ::new (C) ATTR##Attr; \ @@ -147,6 +184,22 @@ Attr *NonNullAttr::clone(ASTContext &C) const { return ::new (C) NonNullAttr(C, ArgNums, Size); } +Attr *OwnershipAttr::clone(ASTContext &C) const { + return ::new (C) OwnershipAttr(AKind, C, ArgNums, Size, getModule(), OKind); +} + +Attr *OwnershipReturnsAttr::clone(ASTContext &C) const { + return ::new (C) OwnershipReturnsAttr(C, ArgNums, Size, getModule()); +} + +Attr *OwnershipTakesAttr::clone(ASTContext &C) const { + return ::new (C) OwnershipTakesAttr(C, ArgNums, Size, getModule()); +} + +Attr *OwnershipHoldsAttr::clone(ASTContext &C) const { + return ::new (C) OwnershipHoldsAttr(C, ArgNums, Size, getModule()); +} + Attr *FormatAttr::clone(ASTContext &C) const { return ::new (C) FormatAttr(C, getType(), formatIdx, firstArg); } |