mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 06:06:34 +08:00
fix decl attributes cleaning
this plugs the leak of attributes and also fixes a crash in the test llvm-svn: 51862
This commit is contained in:
@@ -136,6 +136,7 @@ public:
|
||||
void addAttr(Attr *attr);
|
||||
const Attr *getAttrs() const;
|
||||
void swapAttrs(Decl *D);
|
||||
void invalidateAttrs();
|
||||
|
||||
template<typename T> const T *getAttr() const {
|
||||
for (const Attr *attr = getAttrs(); attr; attr = attr->getNext())
|
||||
|
||||
@@ -336,14 +336,9 @@ Decl::~Decl() {
|
||||
DeclAttrMapTy::iterator it = DeclAttrs->find(this);
|
||||
assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
|
||||
|
||||
// FIXME: Properly release attributes.
|
||||
// delete it->second;
|
||||
DeclAttrs->erase(it);
|
||||
|
||||
if (DeclAttrs->empty()) {
|
||||
delete DeclAttrs;
|
||||
DeclAttrs = 0;
|
||||
}
|
||||
// release attributes.
|
||||
delete it->second;
|
||||
invalidateAttrs();
|
||||
}
|
||||
|
||||
void Decl::addAttr(Attr *NewAttr) {
|
||||
@@ -358,6 +353,19 @@ void Decl::addAttr(Attr *NewAttr) {
|
||||
HasAttrs = true;
|
||||
}
|
||||
|
||||
void Decl::invalidateAttrs() {
|
||||
if (!HasAttrs) return;
|
||||
|
||||
HasAttrs = false;
|
||||
(*DeclAttrs)[this] = 0;
|
||||
DeclAttrs->erase(this);
|
||||
|
||||
if (DeclAttrs->empty()) {
|
||||
delete DeclAttrs;
|
||||
DeclAttrs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
const Attr *Decl::getAttrs() const {
|
||||
if (!HasAttrs)
|
||||
return 0;
|
||||
|
||||
@@ -276,7 +276,6 @@ static bool DeclHasAttr(const Decl *decl, const Attr *target) {
|
||||
static void MergeAttributes(Decl *New, Decl *Old) {
|
||||
Attr *attr = const_cast<Attr*>(Old->getAttrs()), *tmp;
|
||||
|
||||
// FIXME: fix this code to cleanup the Old attrs correctly
|
||||
while (attr) {
|
||||
tmp = attr;
|
||||
attr = attr->getNext();
|
||||
@@ -288,6 +287,8 @@ static void MergeAttributes(Decl *New, Decl *Old) {
|
||||
delete(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
Old->invalidateAttrs();
|
||||
}
|
||||
|
||||
/// MergeFunctionDecl - We just parsed a function 'New' from
|
||||
|
||||
13
clang/test/CodeGen/merge-attrs.c
Normal file
13
clang/test/CodeGen/merge-attrs.c
Normal file
@@ -0,0 +1,13 @@
|
||||
// RUN: clang %s -emit-llvm
|
||||
|
||||
void *malloc(int size) __attribute__ ((__nothrow__));
|
||||
|
||||
inline static void __zend_malloc() {
|
||||
malloc(1);
|
||||
}
|
||||
|
||||
void *malloc(int size) __attribute__ ((__nothrow__));
|
||||
|
||||
void fontFetch() {
|
||||
__zend_malloc(1);
|
||||
}
|
||||
Reference in New Issue
Block a user