diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/ASTContext.cpp | 9 | ||||
-rw-r--r-- | lib/AST/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/AST/Decl.cpp | 44 | ||||
-rw-r--r-- | lib/AST/DeclCXX.cpp | 62 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 4 | ||||
-rw-r--r-- | lib/AST/DeclSerialization.cpp | 54 | ||||
-rw-r--r-- | lib/AST/DeclarationName.cpp | 166 | ||||
-rw-r--r-- | lib/AST/StmtDumper.cpp | 16 | ||||
-rw-r--r-- | lib/Basic/IdentifierTable.cpp | 22 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 11 | ||||
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 10 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 6 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 20 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 18 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 2 |
18 files changed, 354 insertions, 102 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index e84cc4b307..ee57816da3 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -33,7 +33,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM, unsigned size_reserve) : CFConstantStringTypeDecl(0), ObjCFastEnumerationStateTypeDecl(0), SourceMgr(SM), LangOpts(LOpts), Target(t), - Idents(idents), Selectors(sels) + Idents(idents), Selectors(sels) { if (size_reserve > 0) Types.reserve(size_reserve); InitBuiltinTypes(); @@ -996,7 +996,7 @@ QualType ASTContext::getObjCInterfaceType(ObjCInterfaceDecl *Decl) { /// alphabetically. static bool CmpProtocolNames(const ObjCProtocolDecl *LHS, const ObjCProtocolDecl *RHS) { - return strcmp(LHS->getName(), RHS->getName()) < 0; + return LHS->getDeclName() < RHS->getDeclName(); } static void SortAndUniqueProtocols(ObjCProtocolDecl **&Protocols, @@ -1449,7 +1449,7 @@ QualType ASTContext::getObjCFastEnumerationStateType() // typedef <type> BOOL; static bool isTypeTypedefedAsBOOL(QualType T) { if (const TypedefType *TT = dyn_cast<TypedefType>(T)) - return !strcmp(TT->getDecl()->getName(), "BOOL"); + return !strcmp(TT->getDecl()->getIdentifierName(), "BOOL"); return false; } @@ -2260,7 +2260,8 @@ ASTContext* ASTContext::Create(llvm::Deserializer& D) { unsigned size_reserve = D.ReadInt(); - ASTContext* A = new ASTContext(LOpts, SM, t, idents, sels, size_reserve); + ASTContext* A = new ASTContext(LOpts, SM, t, idents, sels, + size_reserve); for (unsigned i = 0; i < size_reserve; ++i) Type::Create(*A,i,D); diff --git a/lib/AST/CMakeLists.txt b/lib/AST/CMakeLists.txt index a58b3b162f..4ac6a6e98e 100644 --- a/lib/AST/CMakeLists.txt +++ b/lib/AST/CMakeLists.txt @@ -5,6 +5,7 @@ add_clang_library(clangAST ASTContext.cpp Builtins.cpp CFG.cpp + DeclarationName.cpp DeclBase.cpp Decl.cpp DeclCXX.cpp diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index fa5e9ce36e..dc4d6027ee 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -133,9 +133,47 @@ FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, // NamedDecl Implementation //===----------------------------------------------------------------------===// -const char *NamedDecl::getName() const { - if (const IdentifierInfo *II = getIdentifier()) - return II->getName(); +std::string NamedDecl::getName() const { + switch (Name.getNameKind()) { + case DeclarationName::Identifier: + if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) + return II->getName(); + return ""; + + case DeclarationName::ObjCZeroArgSelector: + case DeclarationName::ObjCOneArgSelector: + case DeclarationName::ObjCMultiArgSelector: + return Name.getObjCSelector().getName(); + + case DeclarationName::CXXConstructorName: { + QualType ClassType = Name.getCXXNameType(); + if (const RecordType *ClassRec = ClassType->getAsRecordType()) + return ClassRec->getDecl()->getName(); + return ClassType.getAsString(); + } + + case DeclarationName::CXXDestructorName: { + std::string Result = "~"; + QualType Type = Name.getCXXNameType(); + if (const RecordType *Rec = Type->getAsRecordType()) + Result += Rec->getDecl()->getName(); + else + Result += Type.getAsString(); + return Result; + } + + case DeclarationName::CXXConversionFunctionName: { + std::string Result = "operator "; + QualType Type = Name.getCXXNameType(); + if (const RecordType *Rec = Type->getAsRecordType()) + Result += Rec->getDecl()->getName(); + else + Result += Type.getAsString(); + return Result; + } + } + + assert(false && "Unexpected declaration name kind"); return ""; } diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 1de640743d..8855e99a26 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -27,20 +27,20 @@ CXXFieldDecl *CXXFieldDecl::Create(ASTContext &C, CXXRecordDecl *RD, return new (Mem) CXXFieldDecl(RD, L, Id, T, BW); } -CXXRecordDecl::CXXRecordDecl(ASTContext &C, TagKind TK, DeclContext *DC, +CXXRecordDecl::CXXRecordDecl(TagKind TK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) : RecordDecl(CXXRecord, TK, DC, L, Id), DeclContext(CXXRecord), UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false), Aggregate(true), Polymorphic(false), Bases(0), NumBases(0), - Constructors(DC, &C.Idents.getConstructorId()), + Constructors(DC, DeclarationName()), Destructor(0), - Conversions(DC, &C.Idents.getConversionFunctionId()) { } + Conversions(DC, DeclarationName()) { } CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, CXXRecordDecl* PrevDecl) { void *Mem = C.getAllocator().Allocate<CXXRecordDecl>(); - CXXRecordDecl* R = new (Mem) CXXRecordDecl(C, TK, DC, L, Id); + CXXRecordDecl* R = new (Mem) CXXRecordDecl(TK, DC, L, Id); C.getTypeDeclType(R, PrevDecl); return R; } @@ -178,11 +178,13 @@ CXXBaseOrMemberInitializer::~CXXBaseOrMemberInitializer() { CXXConstructorDecl * CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, - SourceLocation L, IdentifierInfo *Id, + SourceLocation L, DeclarationName N, QualType T, bool isExplicit, bool isInline, bool isImplicitlyDeclared) { + assert(N.getNameKind() == DeclarationName::CXXConstructorName && + "Name must refer to a constructor"); void *Mem = C.getAllocator().Allocate<CXXConstructorDecl>(); - return new (Mem) CXXConstructorDecl(RD, L, Id, T, isExplicit, isInline, + return new (Mem) CXXConstructorDecl(RD, L, N, T, isExplicit, isInline, isImplicitlyDeclared); } @@ -242,54 +244,26 @@ bool CXXConstructorDecl::isConvertingConstructor() const { (getNumParams() > 1 && getParamDecl(1)->getDefaultArg() != 0); } -const char *CXXConstructorDecl::getName() const { - return getParent()->getName(); -} - CXXDestructorDecl * CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, - SourceLocation L, IdentifierInfo *Id, + SourceLocation L, DeclarationName N, QualType T, bool isInline, bool isImplicitlyDeclared) { + assert(N.getNameKind() == DeclarationName::CXXDestructorName && + "Name must refer to a destructor"); void *Mem = C.getAllocator().Allocate<CXXDestructorDecl>(); - return new (Mem) CXXDestructorDecl(RD, L, Id, T, isInline, + return new (Mem) CXXDestructorDecl(RD, L, N, T, isInline, isImplicitlyDeclared); } -CXXDestructorDecl::~CXXDestructorDecl() { - delete [] Name; -} - -const char *CXXDestructorDecl::getName() const { - if (!Name) { - std::string Builder = "~"; - Builder += getParent()->getName(); - Name = new char[Builder.size()+1]; - strcpy(Name, Builder.c_str()); - } - return Name; -} - -CXXConversionDecl::~CXXConversionDecl() { - delete [] Name; -} - -const char *CXXConversionDecl::getName() const { - if (!Name) { - std::string Builder = "operator "; - Builder += getConversionType().getAsString(); - Name = new char[Builder.size()+1]; - strcpy(Name, Builder.c_str()); - } - return Name; -} - CXXConversionDecl * CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, - SourceLocation L, IdentifierInfo *Id, + SourceLocation L, DeclarationName N, QualType T, bool isInline, bool isExplicit) { + assert(N.getNameKind() == DeclarationName::CXXConversionFunctionName && + "Name must refer to a conversion function"); void *Mem = C.getAllocator().Allocate<CXXConversionDecl>(); - return new (Mem) CXXConversionDecl(RD, L, Id, T, isInline, isExplicit); + return new (Mem) CXXConversionDecl(RD, L, N, T, isInline, isExplicit); } CXXClassVarDecl *CXXClassVarDecl::Create(ASTContext &C, CXXRecordDecl *RD, @@ -301,9 +275,9 @@ CXXClassVarDecl *CXXClassVarDecl::Create(ASTContext &C, CXXRecordDecl *RD, OverloadedFunctionDecl * OverloadedFunctionDecl::Create(ASTContext &C, DeclContext *DC, - IdentifierInfo *Id) { + DeclarationName N) { void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>(); - return new (Mem) OverloadedFunctionDecl(DC, Id); + return new (Mem) OverloadedFunctionDecl(DC, N); } LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 0d006d676d..558156c4a0 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -758,11 +758,11 @@ unsigned ObjCMethodDecl::getSynthesizedMethodSize() const { // syntesized method name is a concatenation of -/+[class-name selector] // Get length of this name. unsigned length = 3; // _I_ or _C_ - length += strlen(getClassInterface()->getName()) +1; // extra for _ + length += strlen(getClassInterface()->getIdentifierName()) +1; // extra for _ NamedDecl *MethodContext = getMethodContext(); if (ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(MethodContext)) - length += strlen(CID->getName()) +1; + length += strlen(CID->getIdentifierName()) +1; length += getSelector().getName().size(); // selector name return length; } diff --git a/lib/AST/DeclSerialization.cpp b/lib/AST/DeclSerialization.cpp index 3df942e8f1..5137b720c5 100644 --- a/lib/AST/DeclSerialization.cpp +++ b/lib/AST/DeclSerialization.cpp @@ -129,12 +129,58 @@ void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) { void NamedDecl::EmitInRec(Serializer& S) const { Decl::EmitInRec(S); - S.EmitPtr(getIdentifier()); // From NamedDecl. + S.EmitInt(Name.getNameKind()); + + switch (Name.getNameKind()) { + case DeclarationName::Identifier: + S.EmitPtr(Name.getAsIdentifierInfo()); + break; + + case DeclarationName::ObjCZeroArgSelector: + case DeclarationName::ObjCOneArgSelector: + case DeclarationName::ObjCMultiArgSelector: + Name.getObjCSelector().Emit(S); + break; + + case DeclarationName::CXXConstructorName: + case DeclarationName::CXXDestructorName: + case DeclarationName::CXXConversionFunctionName: + Name.getCXXNameType().Emit(S); + break; + } } void NamedDecl::ReadInRec(Deserializer& D, ASTContext& C) { Decl::ReadInRec(D, C); - D.ReadPtr(Identifier); // From NamedDecl. + + DeclarationName::NameKind Kind + = static_cast<DeclarationName::NameKind>(D.ReadInt()); + switch (Kind) { + case DeclarationName::Identifier: { + IdentifierInfo *Identifier; + D.ReadPtr(Identifier); + Name = Identifier; + break; + } + + case DeclarationName::ObjCZeroArgSelector: + case DeclarationName::ObjCOneArgSelector: + case DeclarationName::ObjCMultiArgSelector: + Name = Selector::ReadVal(D); + break; + + case DeclarationName::CXXConstructorName: + Name = C.DeclarationNames.getCXXConstructorName(QualType::ReadVal(D)); + break; + + case DeclarationName::CXXDestructorName: + Name = C.DeclarationNames.getCXXDestructorName(QualType::ReadVal(D)); + break; + + case DeclarationName::CXXConversionFunctionName: + Name = C.DeclarationNames.getCXXConversionFunctionName(QualType::ReadVal(D)); + break; + } } //===----------------------------------------------------------------------===// @@ -434,7 +480,7 @@ FunctionDecl* FunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) { void *Mem = C.getAllocator().Allocate<FunctionDecl>(); FunctionDecl* decl = new (Mem) - FunctionDecl(Function, 0, SourceLocation(), NULL, + FunctionDecl(Function, 0, SourceLocation(), DeclarationName(), QualType(), SClass, IsInline, 0); decl->ValueDecl::ReadInRec(D, C); @@ -495,7 +541,7 @@ OverloadedFunctionDecl * OverloadedFunctionDecl::CreateImpl(Deserializer& D, ASTContext& C) { void *Mem = C.getAllocator().Allocate<OverloadedFunctionDecl>(); OverloadedFunctionDecl* decl = new (Mem) - OverloadedFunctionDecl(0, NULL); + OverloadedFunctionDecl(0, DeclarationName()); decl->NamedDecl::ReadInRec(D, C); diff --git a/lib/AST/DeclarationName.cpp b/lib/AST/DeclarationName.cpp new file mode 100644 index 0000000000..96e194be8c --- /dev/null +++ b/lib/AST/DeclarationName.cpp @@ -0,0 +1,166 @@ +//===-- DeclarationName.cpp - Declaration names implementation --*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the DeclarationName and DeclarationNameTable +// classes. +// +//===----------------------------------------------------------------------===// +#include "clang/AST/DeclarationName.h" +#include "clang/Basic/IdentifierTable.h" +#include "llvm/ADT/FoldingSet.h" +#include "llvm/Bitcode/Serialize.h" +#include "llvm/Bitcode/Deserialize.h" +using namespace clang; + +namespace clang { +/// CXXSpecialName - Records the type associated with one of the +/// "special" kinds of declaration names in C++, e.g., constructors, +/// destructors, and conversion functions. +class CXXSpecialName + : public DeclarationNameExtra, public llvm::FoldingSetNode { +public: + QualType Type; + + void Profile(llvm::FoldingSetNodeID &ID) { + ID.AddInteger(ExtraKindOrNumArgs); + ID.AddPointer(Type.getAsOpaquePtr()); + } +}; + +bool operator<(DeclarationName LHS, DeclarationName RHS) { + if (IdentifierInfo *LhsId = LHS.getAsIdentifierInfo()) + if (IdentifierInfo *RhsId = RHS.getAsIdentifierInfo()) + return strcmp(LhsId->getName(), RhsId->getName()) < 0; + + return LHS.getAsOpaqueInteger() < RHS.getAsOpaqueInteger(); +} + +} // end namespace clang + +DeclarationName::DeclarationName(Selector Sel) { + switch (Sel.getNumArgs()) { + case 0: + Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); + Ptr |= StoredObjCZeroArgSelector; + break; + + case 1: + Ptr = reinterpret_cast<uintptr_t>(Sel.getAsIdentifierInfo()); + Ptr |= StoredObjCOneArgSelector; + break; + + default: + Ptr = Sel.InfoPtr & ~Selector::ArgFlags; + Ptr |= StoredObjCMultiArgSelectorOrCXXName; + break; + } +} + +DeclarationName::NameKind DeclarationName::getNameKind() const { + switch (getStoredNameKind()) { + case StoredIdentifier: return Identifier; + case StoredObjCZeroArgSelector: return ObjCZeroArgSelector; + case StoredObjCOneArgSelector: return ObjCOneArgSelector; + + case StoredObjCMultiArgSelectorOrCXXName: + switch (getExtra()->ExtraKindOrNumArgs) { + case DeclarationNameExtra::CXXConstructor: + return CXXConstructorName; + + case DeclarationNameExtra::CXXDestructor: + return CXXDestructorName; + + case DeclarationNameExtra::CXXConversionFunction: + return CXXConversionFunctionName; + + default: + return ObjCMultiArgSelector; + } + break; + } + + // Can't actually get here. + return Identifier; +} + +QualType DeclarationName::getCXXNameType() const { + if (CXXSpecialName *CXXName = getAsCXXSpecialName()) + return CXXName->Type; + else + return QualType(); +} + +Selector DeclarationName::getObjCSelector() const { + switch (getNameKind()) { + case ObjCZeroArgSelector: + return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 0); + + case ObjCOneArgSelector: + return Selector(reinterpret_cast<IdentifierInfo *>(Ptr & ~PtrMask), 1); + + case ObjCMultiArgSelector: + return Selector(reinterpret_cast<MultiKeywordSelector *>(Ptr & ~PtrMask)); + + default: + break; + } + + return Selector(); +} + +DeclarationNameTable::DeclarationNameTable() { + CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>; +} + +DeclarationNameTable::~DeclarationNameTable() { + delete static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); +} + +DeclarationName +DeclarationNameTable::getCXXSpecialName(DeclarationName::NameKind Kind, + QualType Ty) { + assert(Kind >= DeclarationName::CXXConstructorName && + Kind <= DeclarationName::CXXConversionFunctionName && + "Kind must be a C++ special name kind"); + + llvm::FoldingSet<CXXSpecialName> *SpecialNames + = static_cast<llvm::FoldingSet<CXXSpecialName>*>(CXXSpecialNamesImpl); + + DeclarationNameExtra::ExtraKind EKind; + switch (Kind) { + case DeclarationName::CXXConstructorName: + EKind = DeclarationNameExtra::CXXConstructor; + break; + case DeclarationName::CXXDestructorName: + EKind = DeclarationNameExtra::CXXDestructor; + break; + case DeclarationName::CXXConversionFunctionName: + EKind = DeclarationNameExtra::CXXConversionFunction; + break; + default: + return DeclarationName(); + } + + // Unique selector, to guarantee there is one per name. + llvm::FoldingSetNodeID ID; + ID.AddInteger(EKind); + ID.AddPointer(Ty.getAsOpaquePtr()); + + void *InsertPos = 0; + if (CXXSpecialName *Name = SpecialNames->FindNodeOrInsertPos(ID, InsertPos)) + return DeclarationName(Name); + + CXXSpecialName *SpecialName = new CXXSpecialName; + SpecialName->ExtraKindOrNumArgs = EKind; + SpecialName->Type = Ty; + + SpecialNames->InsertNode(SpecialName, InsertPos); + return DeclarationName(SpecialName); +} + diff --git a/lib/AST/StmtDumper.cpp b/lib/AST/StmtDumper.cpp index 0b9e62d2c5..a992efba50 100644 --- a/lib/AST/StmtDumper.cpp +++ b/lib/AST/StmtDumper.cpp @@ -202,7 +202,7 @@ void StmtDumper::DumpDeclarator(Decl *D) { if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { fprintf(F, "\"typedef %s %s\"", localType->getUnderlyingType().getAsString().c_str(), - localType->getName()); + localType->getIdentifierName()); } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { fprintf(F, "\""); // Emit storage class for vardecls. @@ -295,14 +295,16 @@ void StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) { default: fprintf(F,"Decl"); break; } - fprintf(F, "='%s' %p", Node->getDecl()->getName(), (void*)Node->getDecl()); + fprintf(F, "='%s' %p", Node->getDecl()->getName().c_str(), + (void*)Node->getDecl()); } void StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { DumpExpr(Node); fprintf(F, " %sDecl='%s' %p", Node->getDecl()->getDeclKindName(), - Node->getDecl()->getName(), (void*)Node->getDecl()); + Node->getDecl()->getIdentifierName(), + (void*)Node->getDecl()); if (Node->isFreeIvar()) fprintf(F, " isFreeIvar"); } @@ -373,7 +375,8 @@ void StmtDumper::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) { void StmtDumper::VisitMemberExpr(MemberExpr *Node) { DumpExpr(Node); fprintf(F, " %s%s %p", Node->isArrow() ? "->" : ".", - Node->getMemberDecl()->getName(), (void*)Node->getMemberDecl()); + Node->getMemberDecl()->getName().c_str(), + (void*)Node->getMemberDecl()); } void StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { DumpExpr(Node); @@ -461,7 +464,7 @@ void StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { DumpExpr(Node); fprintf(F, " "); - fprintf(F, "%s", Node->getProtocol()->getName()); + fprintf(F, "%s", Node->getProtocol()->getIdentifierName()); } void StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { @@ -474,7 +477,8 @@ void StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { Getter->getSelector().getName().c_str(), Setter ? Setter->getSelector().getName().c_str() : "(null)"); } else { - fprintf(F, " Kind=PropertyRef Property=\"%s\"", Node->getProperty()->getName()); + fprintf(F, " Kind=PropertyRef Property=\"%s\"", + Node->getProperty()->getIdentifierName()); } } diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp index 4d737c50bc..b83266d1ff 100644 --- a/lib/Basic/IdentifierTable.cpp +++ b/lib/Basic/IdentifierTable.cpp @@ -297,22 +297,22 @@ unsigned llvm::DenseMapInfo<clang::Selector>::getHashValue(clang::Selector S) { return DenseMapInfo<void*>::getHashValue(S.getAsOpaquePtr()); } - +namespace clang { /// MultiKeywordSelector - One of these variable length records is kept for each /// selector containing more than one keyword. We use a folding set /// to unique aggregate names (keyword selectors in ObjC parlance). Access to /// this class is provided strictly through Selector. -namespace clang { -class MultiKeywordSelector : public llvm::FoldingSetNode { +class MultiKeywordSelector + : public DeclarationNameExtra, public llvm::FoldingSetNode { friend SelectorTable* SelectorTable::CreateAndRegister(llvm::Deserializer&); - MultiKeywordSelector(unsigned nKeys) : NumArgs(nKeys) {} + MultiKeywordSelector(unsigned nKeys) { + ExtraKindOrNumArgs = NUM_EXTRA_KINDS + nKeys; + } public: - unsigned NumArgs; - // Constructor for keyword selectors. MultiKeywordSelector(unsigned nKeys, IdentifierInfo **IIV) { assert((nKeys > 1) && "not a multi-keyword selector"); - NumArgs = nKeys; + ExtraKindOrNumArgs = NUM_EXTRA_KINDS + nKeys; // Fill in the trailing keyword array. IdentifierInfo **KeyInfo = reinterpret_cast<IdentifierInfo **>(this+1); @@ -323,17 +323,17 @@ public: // getName - Derive the full selector name and return it. std::string getName() const; - unsigned getNumArgs() const { return NumArgs; } + unsigned getNumArgs() const { return ExtraKindOrNumArgs - NUM_EXTRA_KINDS; } typedef IdentifierInfo *const *keyword_iterator; keyword_iterator keyword_begin() const { return reinterpret_cast<keyword_iterator>(this+1); } keyword_iterator keyword_end() const { - return keyword_begin()+NumArgs; + return keyword_begin()+getNumArgs(); } IdentifierInfo *getIdentifierInfoForSlot(unsigned i) const { - assert(i < NumArgs && "getIdentifierInfoForSlot(): illegal index"); + assert(i < getNumArgs() && "getIdentifierInfoForSlot(): illegal index"); return keyword_begin()[i]; } static void Profile(llvm::FoldingSetNodeID &ID, @@ -343,7 +343,7 @@ public: ID.AddPointer(ArgTys[i]); } void Profile(llvm::FoldingSetNodeID &ID) { - Profile(ID, keyword_begin(), NumArgs); + Profile(ID, keyword_begin(), getNumArgs()); } }; } // end namespace clang. diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 9a04a83d6e..55ce237e14 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -152,7 +152,7 @@ llvm::DIType CGDebugInfo::CreateType(const TypedefType *Ty, // We don't set size information, but do specify where the typedef was // declared. - const char *TyName = Ty->getDecl()->getName(); + const char *TyName = Ty->getDecl()->getIdentifierName(); SourceLocation DefLoc = Ty->getDecl()->getLocation(); llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(DefLoc); @@ -206,7 +206,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, SourceManager &SM = M->getContext().getSourceManager(); // Get overall information about the record type for the debug info. - const char *Name = Decl->getName(); + const char *Name = Decl->getIdentifierName(); if (Name == 0) Name = ""; llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(Decl->getLocation()); @@ -242,7 +242,7 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty, FieldDecl *Field = *I; llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit); - const char *FieldName = Field->getName(); + const char *FieldName = Field->getIdentifierName(); if (FieldName == 0) FieldName = ""; // Get the location for the field. @@ -301,7 +301,8 @@ llvm::DIType CGDebugInfo::CreateType(const EnumType *Ty, llvm::DIArray EltArray = DebugFactory.GetOrCreateArray(&Enumerators[0], Enumerators.size()); - const char *EnumName = Decl->getName() ? Decl->getName() : ""; + const char *EnumName + = Decl->getIdentifierName() ? Decl->getIdentifierName() : ""; SourceLocation DefLoc = Decl->getLocation(); llvm::DICompileUnit DefUnit = getOrCreateCompileUnit(DefLoc); SourceManager &SM = M->getContext().getSourceManager(); @@ -515,7 +516,7 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, llvm::DICompileUnit Unit = getOrCreateCompileUnit(Decl->getLocation()); SourceManager &SM = M->getContext().getSourceManager(); uint64_t LineNo = SM.getLogicalLineNumber(Decl->getLocation()); - const char *Name = Decl->getName(); + const char *Name = Decl->getIdentifierName(); DebugFactory.CreateGlobalVariable(Unit, Name, Name, "", Unit, LineNo, getOrCreateType(Decl->getType(), Unit), diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index e54c4b386d..7a86d24801 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -146,7 +146,7 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) { if (!Target.useGlobalsForAutomaticVariables()) { // A normal fixed sized variable becomes an alloca in the entry block. const llvm::Type *LTy = ConvertType(Ty); - llvm::AllocaInst * Alloc = CreateTempAlloca(LTy, D.getName()); + llvm::AllocaInst * Alloc = CreateTempAlloca(LTy, D.getIdentifierName()); unsigned align = getContext().getTypeAlign(Ty); if (const AlignedAttr* AA = D.getAttr<AlignedAttr>()) align = std::max(align, AA->getAlignment()); @@ -164,7 +164,7 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) { // FIXME: VLA: Add VLA support. For now just make up enough to let // the compile go through. const llvm::Type *LTy = ConvertType(Ty); - llvm::AllocaInst * Alloc = CreateTempAlloca(LTy, D.getName()); + llvm::AllocaInst * Alloc = CreateTempAlloca(LTy, D.getIdentifierName()); DeclPtr = Alloc; } diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 4726be2115..0833b0832d 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -561,7 +561,7 @@ llvm::Value *CGObjCGNU::GenerateProtocolRef(CGBuilderTy &Builder, void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { ASTContext &Context = CGM.getContext(); - const char *ProtocolName = PD->getName(); + const char *ProtocolName = PD->getIdentifierName(); llvm::SmallVector<std::string, 16> Protocols; for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(), E = PD->protocol_end(); PI != E; ++PI) @@ -616,8 +616,8 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { } void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) { - const char *ClassName = OCD->getClassInterface()->getName(); - const char *CategoryName = OCD->getName(); + const char *ClassName = OCD->getClassInterface()->getIdentifierName(); + const char *CategoryName = OCD->getIdentifierName(); // Collect information about instance methods llvm::SmallVector<Selector, 16> InstanceMethodSels; llvm::SmallVector<llvm::Constant*, 16> InstanceMethodTypes; @@ -675,12 +675,12 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { OID->getClassInterface()->getSuperClass(); const char * SuperClassName = NULL; if (SuperClassDecl) { - SuperClassName = SuperClassDecl->getName(); + SuperClassName = SuperClassDecl->getIdentifierName(); } // Get the class name ObjCInterfaceDecl * ClassDecl = (ObjCInterfaceDecl*)OID->getClassInterface(); - const char * ClassName = ClassDecl->getName(); + const char * ClassName = ClassDecl->getIdentifierName(); // Get the size of instances. For runtimes that support late-bound instances // this should probably be something different (size just of instance diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 296b1af551..a8f6bbab9b 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -638,7 +638,7 @@ llvm::Constant *CGObjCMac::GetOrEmitProtocol(const ObjCProtocolDecl *PD) { // over. LazySymbols.insert(&CGM.getContext().Idents.get("Protocol")); - const char *ProtocolName = PD->getName(); + const char *ProtocolName = PD->getIdentifierName(); // Construct method lists. std::vector<llvm::Constant*> InstanceMethods, ClassMethods; @@ -1050,7 +1050,7 @@ static bool IsClassHidden(const ObjCInterfaceDecl *ID) { void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) { DefinedSymbols.insert(ID->getIdentifier()); - const char *ClassName = ID->getName(); + const char *ClassName = ID->getIdentifierName(); // FIXME: Gross ObjCInterfaceDecl *Interface = const_cast<ObjCInterfaceDecl*>(ID->getClassInterface()); @@ -1143,7 +1143,7 @@ llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID, llvm::Constant *Protocols, const llvm::Type *InterfaceTy, const ConstantVector &Methods) { - const char *ClassName = ID->getName(); + const char *ClassName = ID->getIdentifierName(); unsigned Flags = eClassFlags_Meta; unsigned Size = CGM.getTargetData().getABITypeSize(ObjCTypes.ClassTy); diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index ff05f6e585..b358993665 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -121,7 +121,7 @@ void CodeGenFunction::StartFunction(const Decl *D, QualType RetTy, if (CGDebugInfo *DI = CGM.getDebugInfo()) { DI->setLocation(StartLoc); if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { - DI->EmitFunctionStart(FD->getName(), RetTy, CurFn, Builder); + DI->EmitFunctionStart(FD->getIdentifierName(), RetTy, CurFn, Builder); } else { // Just use LLVM function name. DI->EmitFunctionStart(Fn->getName().c_str(), diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 1ecaaa370a..48073694a3 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -877,9 +877,13 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { bool isInvalidDecl = CheckConstructorDeclarator(D, R, SC); // Create the new declaration + QualType ClassType = Context.getTypeDeclType(cast<CXXRecordDecl>(DC)); + ClassType = Context.getCanonicalType(ClassType); + DeclarationName ConName + = Context.DeclarationNames.getCXXConstructorName(ClassType); NewFD = CXXConstructorDecl::Create(Context, cast<CXXRecordDecl>(DC), - D.getIdentifierLoc(), II, R, + D.getIdentifierLoc(), ConName, R, isExplicit, isInline, /*isImplicitlyDeclared=*/false); @@ -890,9 +894,14 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { if (DC->isCXXRecord()) { bool isInvalidDecl = CheckDestructorDeclarator(D, R, SC); + QualType ClassType = Context.getTypeDeclType(cast<CXXRecordDecl>(DC)); + ClassType = Context.getCanonicalType(ClassType); + DeclarationName DesName + = Context.DeclarationNames.getCXXDestructorName(ClassType); + NewFD = CXXDestructorDecl::Create(Context, cast<CXXRecordDecl>(DC), - D.getIdentifierLoc(), II, R, + |