[cfe-commits] r47191 - in /cfe/trunk: AST/Decl.cpp include/clang/AST/Attr.h include/clang/AST/Decl.h
Ted Kremenek
kremenek at apple.com
Fri Feb 15 15:41:38 PST 2008
Hi Anders,
I think such a map should go in ASTContext, rather than be a global
variable. It would be nice to invoke a parser and reclaim all
associated state (including attributes) when we are done with a
translation unit. In general, we should avoid global variables of any
kind.
Ted
On Feb 15, 2008, at 3:30 PM, Anders Carlsson wrote:
> Author: andersca
> Date: Fri Feb 15 17:30:50 2008
> New Revision: 47191
>
> URL: http://llvm.org/viewvc/llvm-project?rev=47191&view=rev
> Log:
> Store attributes in a global hash map instead.
>
> Modified:
> cfe/trunk/AST/Decl.cpp
> cfe/trunk/include/clang/AST/Attr.h
> cfe/trunk/include/clang/AST/Decl.h
>
> Modified: cfe/trunk/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/Decl.cpp?rev=47191&r1=47190&r2=47191&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/AST/Decl.cpp (original)
> +++ cfe/trunk/AST/Decl.cpp Fri Feb 15 17:30:50 2008
> @@ -15,6 +15,8 @@
> #include "clang/AST/DeclObjC.h"
> #include "clang/AST/Attr.h"
> #include "clang/Basic/IdentifierTable.h"
> +#include "llvm/ADT/DenseMap.h"
> +
> using namespace clang;
>
> // temporary statistics gathering
> @@ -43,6 +45,12 @@
>
> static bool StatSwitch = false;
>
> +// This keeps track of all decl attributes. Since so few decls have
> attrs, we
> +// keep them in a hash map instead of wasting space in the Decl
> class.
> +typedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy;
> +
> +static DeclAttrMapTy *DeclAttrs = 0;
> +
> const char *Decl::getDeclKindName() const {
> switch (DeclKind) {
> default: assert(0 && "Unknown decl kind!");
> @@ -251,6 +259,39 @@
>
> // Out-of-line virtual method providing a home for Decl.
> Decl::~Decl() {
> + if (!DeclAttrs)
> + return;
> +
> + DeclAttrMapTy::iterator it = DeclAttrs->find(this);
> + if (it != DeclAttrs->end()) {
> + delete it->second;
> + DeclAttrs->erase(it);
> + if (DeclAttrs->empty()) {
> + delete DeclAttrs;
> + DeclAttrs = 0;
> + }
> + }
> +}
> +
> +void Decl::addAttr(Attr *newattr)
> +{
> + if (!DeclAttrs)
> + DeclAttrs = new llvm::DenseMap<const Decl*, Attr*>;
> +
> + Attr *&attr = DeclAttrs->FindAndConstruct(this).second;
> +
> + newattr->setNext(attr);
> + attr = newattr;
> +
> + HasAttrs = true;
> +}
> +
> +const Attr *Decl::getAttrs() const
> +{
> + if (!HasAttrs || !DeclAttrs)
> + return 0;
> +
> + return DeclAttrs->find(this)->second;
> }
>
> const char *NamedDecl::getName() const {
> @@ -259,12 +300,6 @@
> return "";
> }
>
> -void ValueDecl::addAttr(Attr *attr)
> -{
> - attr->setNext(Attrs);
> - Attrs = attr;
> -}
> -
> FunctionDecl::~FunctionDecl() {
> delete[] ParamInfo;
> }
>
> Modified: cfe/trunk/include/clang/AST/Attr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Attr.h?rev=47191&r1=47190&r2=47191&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/AST/Attr.h (original)
> +++ cfe/trunk/include/clang/AST/Attr.h Fri Feb 15 17:30:50 2008
> @@ -30,11 +30,11 @@
>
> protected:
> Attr(Kind AK) : Next(0), AttrKind(AK) {}
> +public:
> virtual ~Attr() {
> delete Next;
> }
> -
> -public:
> +
> Kind getKind() const { return AttrKind; }
>
> Attr *getNext() { return Next; }
>
> Modified: cfe/trunk/include/clang/AST/Decl.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=47191&r1=47190&r2=47191&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/AST/Decl.h (original)
> +++ cfe/trunk/include/clang/AST/Decl.h Fri Feb 15 17:30:50 2008
> @@ -118,8 +118,11 @@
> /// InvalidDecl - This indicates a semantic error occurred.
> unsigned int InvalidDecl : 1;
>
> + /// HasAttrs - This indicates whether the decl has attributes or
> not.
> + unsigned int HasAttrs : 1;
> protected:
> - Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK),
> InvalidDecl(0) {
> + Decl(Kind DK, SourceLocation L) : Loc(L), DeclKind(DK),
> InvalidDecl(0),
> + HasAttrs(false) {
> if (Decl::CollectingStats()) addDeclKind(DK);
> }
>
> @@ -132,6 +135,9 @@
> Kind getKind() const { return DeclKind; }
> const char *getDeclKindName() const;
>
> + void addAttr(Attr *attr);
> + const Attr *getAttrs() const;
> +
> /// setInvalidDecl - Indicates the Decl had a semantic error. This
> /// allows for graceful error recovery.
> void setInvalidDecl() { InvalidDecl = 1; }
> @@ -253,9 +259,6 @@
> class ValueDecl : public ScopedDecl {
> QualType DeclType;
>
> - /// Attrs - Linked list of attributes that are attached to this
> - /// function.
> - Attr *Attrs;
> protected:
> ValueDecl(Kind DK, SourceLocation L, IdentifierInfo *Id, QualType T,
> ScopedDecl *PrevDecl)
> @@ -265,9 +268,6 @@
> void setType(QualType newType) { DeclType = newType; }
> QualType getCanonicalType() const { return
> DeclType.getCanonicalType(); }
>
> - void addAttr(Attr *attr);
> - const Attr *getAttrs() const { return Attrs; }
> -
> // Implement isa/cast/dyncast/etc.
> static bool classof(const Decl *D) {
> return D->getKind() >= ValueFirst && D->getKind() <= ValueLast;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list