X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FAttributes.cpp;h=b728b9284b4499fa701d7cc864a8d5584ce40c2d;hb=0e64f810a521806838bf90d77f081d3a1da98b5e;hp=6f5ecd278d880102fab47387b07ce737574a6ba5;hpb=970bfcc7d8b9991430caa7ab33975617f3f4c40d;p=oota-llvm.git diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index 6f5ecd278d8..b728b9284b4 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -15,8 +15,8 @@ #include "llvm/Type.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/FoldingSet.h" -#include "llvm/System/Atomic.h" -#include "llvm/System/Mutex.h" +#include "llvm/Support/Atomic.h" +#include "llvm/Support/Mutex.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" @@ -36,6 +36,8 @@ std::string Attribute::getAsString(Attributes Attrs) { Result += "noreturn "; if (Attrs & Attribute::NoUnwind) Result += "nounwind "; + if (Attrs & Attribute::UWTable) + Result += "uwtable "; if (Attrs & Attribute::InReg) Result += "inreg "; if (Attrs & Attribute::NoAlias) @@ -72,6 +74,8 @@ std::string Attribute::getAsString(Attributes Attrs) { Result += "naked "; if (Attrs & Attribute::Hotpatch) Result += "hotpatch "; + if (Attrs & Attribute::NonLazyBind) + Result += "nonlazybind "; if (Attrs & Attribute::StackAlignment) { Result += "alignstack("; Result += utostr(Attribute::getStackAlignmentFromAttrs(Attrs)); @@ -88,7 +92,7 @@ std::string Attribute::getAsString(Attributes Attrs) { return Result; } -Attributes Attribute::typeIncompatible(const Type *Ty) { +Attributes Attribute::typeIncompatible(Type *Ty) { Attributes Incompatible = None; if (!Ty->isIntegerTy()) @@ -107,6 +111,14 @@ Attributes Attribute::typeIncompatible(const Type *Ty) { //===----------------------------------------------------------------------===// namespace llvm { + class AttributeListImpl; +} + +static ManagedStatic > AttributesLists; + +namespace llvm { +static ManagedStatic > ALMutex; + class AttributeListImpl : public FoldingSetNode { sys::cas_flag RefCount; @@ -122,10 +134,17 @@ public: RefCount = 0; } - void AddRef() { sys::AtomicIncrement(&RefCount); } + void AddRef() { + sys::SmartScopedLock Lock(*ALMutex); + ++RefCount; + } void DropRef() { - sys::cas_flag old = sys::AtomicDecrement(&RefCount); - if (old == 0) delete this; + sys::SmartScopedLock Lock(*ALMutex); + if (!AttributesLists.isConstructed()) + return; + sys::cas_flag new_val = --RefCount; + if (new_val == 0) + delete this; } void Profile(FoldingSetNodeID &ID) const { @@ -139,11 +158,8 @@ public: }; } -static ManagedStatic > ALMutex; -static ManagedStatic > AttributesLists; - AttributeListImpl::~AttributeListImpl() { - sys::SmartScopedLock Lock(*ALMutex); + // NOTE: Lock must be acquired by caller. AttributesLists->RemoveNode(this); }