USRGeneration.cpp revision c568f1e98938584c0ef0b12ae5018ff7d90a4072
112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===- USRGeneration.cpp - Routines for USR generation --------------------===// 212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// 812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 102845a6746f6320994675a9a413ecbe5252d4dc02Argyrios Kyrtzidis#include "clang/Index/USRGeneration.h" 1112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/ASTContext.h" 1212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/DeclTemplate.h" 1312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/DeclVisitor.h" 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Lex/PreprocessingRecord.h" 1512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/ADT/SmallString.h" 1612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/Path.h" 1712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "llvm/Support/raw_ostream.h" 1812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 1912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisusing namespace clang; 20e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisusing namespace clang::index; 2112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 2212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation. 2412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \returns true on error. 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool printLoc(llvm::raw_ostream &OS, SourceLocation Loc, 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM, bool IncludeOffset) { 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Loc.isInvalid()) { 30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Loc = SM.getExpansionLoc(Loc); 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::pair<FileID, unsigned> &Decomposed = SM.getDecomposedLoc(Loc); 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FileEntry *FE = SM.getFileEntryForID(Decomposed.first); 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (FE) { 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << llvm::sys::path::filename(FE->getName()); 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This case really isn't interesting. 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (IncludeOffset) { 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Use the offest into the FileID to represent the location. Using 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // a line/column can cause us to look back at the original source file, 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // which is expensive. 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << '@' << Decomposed.second; 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisnamespace { 5112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisclass USRGenerator : public ConstDeclVisitor<USRGenerator> { 5212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SmallVectorImpl<char> &Buf; 5312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::raw_svector_ostream Out; 5412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool IgnoreResults; 5512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext *Context; 5612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool generatedLoc; 5712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 5812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned> TypeSubstitutions; 5912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 6012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidispublic: 6112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis explicit USRGenerator(ASTContext *Ctx, SmallVectorImpl<char> &Buf) 6212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis : Buf(Buf), 6312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out(Buf), 6412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults(false), 6512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Context(Ctx), 6612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc(false) 6712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis { 6812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the USR space prefix. 69e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis Out << getUSRSpacePrefix(); 7012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 7112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 7212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool ignoreResults() const { return IgnoreResults; } 7312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 7412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Visitation methods from generating USRs from AST elements. 7512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitDeclContext(const DeclContext *D); 7612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFieldDecl(const FieldDecl *D); 7712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionDecl(const FunctionDecl *D); 7812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamedDecl(const NamedDecl *D); 7912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceDecl(const NamespaceDecl *D); 8012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D); 8112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D); 8212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitClassTemplateDecl(const ClassTemplateDecl *D); 8312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCContainerDecl(const ObjCContainerDecl *CD); 8412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCMethodDecl(const ObjCMethodDecl *MD); 8512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyDecl(const ObjCPropertyDecl *D); 8612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D); 8712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTagDecl(const TagDecl *D); 8812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTypedefDecl(const TypedefDecl *D); 8912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D); 9012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitVarDecl(const VarDecl *D); 9112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D); 9212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D); 9312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitLinkageSpecDecl(const LinkageSpecDecl *D) { 9412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 9512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 9612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) { 9712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 9812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 9912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUsingDecl(const UsingDecl *D) { 10012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 10212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) { 10312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 10512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D) { 10612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 10712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ShouldGenerateLocation(const NamedDecl *D); 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool isLocal(const NamedDecl *D) { 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return D->getParentFunctionOrMethod() != nullptr; 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 11512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate the string component containing the location of the 11612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// declaration. 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool GenLoc(const Decl *D, bool IncludeOffset); 11812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 11912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// String generation methods used both by the visitation methods 12012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// and from other clients that want to directly generate USRs. These 12112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// methods do not construct complete USRs (which incorporate the parents 12212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// of an AST element), but only the fragments concerning the AST element 12312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// itself. 12412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 12512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class. 12612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCClass(StringRef cls) { 127e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCClass(cls, Out); 12812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 12912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C class category. 13012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCCategory(StringRef cls, StringRef cat) { 131e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCCategory(cls, cat, Out); 13212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 13312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR fragment for an Objective-C property. 13412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProperty(StringRef prop) { 135e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProperty(prop, Out); 13612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 13712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Generate a USR for an Objective-C protocol. 13812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void GenObjCProtocol(StringRef prot) { 139e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis generateUSRForObjCProtocol(prot, Out); 14012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 14112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 14212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitType(QualType T); 14312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateParameterList(const TemplateParameterList *Params); 14412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateName(TemplateName Name); 14512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis void VisitTemplateArgument(const TemplateArgument &Arg); 14612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 14712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// Emit a Decl's name using NamedDecl::printName() and return true if 14812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis /// the decl had no name. 14912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool EmitDeclName(const NamedDecl *D); 15012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis}; 15112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} // end anonymous namespace 15312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 15512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// Generating USRs from ASTS. 15612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 15712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 15812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisbool USRGenerator::EmitDeclName(const NamedDecl *D) { 15912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 16012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned startSize = Buf.size(); 16112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D->printName(Out); 16212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 16312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned endSize = Buf.size(); 16412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return startSize == endSize; 16512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 16612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) { 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->isExternallyVisible()) 169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 170651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (D->getParentFunctionOrMethod()) 171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM = Context->getSourceManager(); 173651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !SM.isInSystemHeader(D->getLocation()); 17412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 17512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 17612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitDeclContext(const DeclContext *DC) { 17712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *D = dyn_cast<NamedDecl>(DC)) 17812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(D); 17912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 18012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 18112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFieldDecl(const FieldDecl *D) { 18212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for an ivar declared in a class extension is based on the 18312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // ObjCInterfaceDecl, not the ObjCCategoryDecl. 18412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 18512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 18612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 18712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 18812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (isa<ObjCIvarDecl>(D) ? "@" : "@FI@"); 18912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 19012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Bit fields can be anonymous. 19112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 19212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 19312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 19412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 19512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 19612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionDecl(const FunctionDecl *D) { 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 19812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 19912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 20012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 20112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FunctionTemplateDecl *FunTmpl = D->getDescribedFunctionTemplate()) { 20212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@FT@"; 20312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(FunTmpl->getTemplateParameters()); 20412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else 20512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@F@"; 20612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D->printName(Out); 20712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 20812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 20912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!Ctx.getLangOpts().CPlusPlus || D->isExternC()) 21012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 21112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 21212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateArgumentList * 21312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis SpecArgs = D->getTemplateSpecializationArgs()) { 21412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 21512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = SpecArgs->size(); I != N; ++I) { 21612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 21712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(SpecArgs->get(I)); 21812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 21912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 22012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 22112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 22212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in type information for the arguments. 223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto PD : D->params()) { 22412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(PD->getType()); 22612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 22712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isVariadic()) 22812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 22912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 23012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) { 23112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (MD->isStatic()) 23212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S'; 23312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (unsigned quals = MD->getTypeQualifiers()) 23412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (char)('0' + quals); 23512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 23612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 23712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 23812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamedDecl(const NamedDecl *D) { 23912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 24012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@"; 24112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 24212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 24312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 24412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, 24512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // e.g.: void (*f)(void *); 24612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 24712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 24812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 24912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 25012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 25112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitVarDecl(const VarDecl *D) { 25212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // VarDecls can be declared 'extern' within a function or method body, 25312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // but their enclosing DeclContext is the function, not the TU. We need 25412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // to check the storage class to correctly generate the USR. 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 25612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 25712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 25812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 25912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Variables always have simple names. 26112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis StringRef s = D->getName(); 26212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 26312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The string can be empty if the declaration has no name; e.g., it is 26412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ParmDecl with no name for declaration of a function pointer type, e.g.: 26512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // void (*f)(void *); 26612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // In this case, don't generate a USR. 26712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (s.empty()) 26812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 26912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 27012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << s; 27112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 27212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 27312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNonTypeTemplateParmDecl( 27412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const NonTypeTemplateParmDecl *D) { 275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 27612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 27712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 27812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 27912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTemplateParmDecl( 28012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateTemplateParmDecl *D) { 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 28212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 28312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 28412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 28512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceDecl(const NamespaceDecl *D) { 28612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (D->isAnonymousNamespace()) { 28712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@aN"; 28812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 28912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 29012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 29112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 29212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 29312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@N@" << D->getName(); 29412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 29512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 29612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) { 29712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitFunctionDecl(D->getTemplatedDecl()); 29812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 29912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 30012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitClassTemplateDecl(const ClassTemplateDecl *D) { 30112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(D->getTemplatedDecl()); 30212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 30312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 30412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) { 30512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 30612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!IgnoreResults) 30712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@NA@" << D->getName(); 30812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 30912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 31012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCMethodDecl(const ObjCMethodDecl *D) { 31112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *container = D->getDeclContext(); 31212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) { 31312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(pd); 31412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 31512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else { 31612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a method declared in a class extension or category is based on 31712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // the ObjCInterfaceDecl, not the ObjCCategoryDecl. 31812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = D->getClassInterface(); 31912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 32012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 32112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 32212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 32312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 32412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 32512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Ideally we would use 'GenObjCMethod', but this is such a hot path 32612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // for Objective-C code that we don't want to use 32712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // DeclarationName::getAsString(). 32812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << (D->isInstanceMethod() ? "(im)" : "(cm)") 32912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis << DeclarationName(D->getSelector()); 33012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 33112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 33212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) { 33312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getKind()) { 33412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis default: 33512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm_unreachable("Invalid ObjC container."); 33612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCInterface: 33712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCImplementation: 33812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCClass(D->getName()); 33912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 34012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategory: { 34112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D); 34212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 34312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 34412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 34512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 34612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 34712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 34812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 34912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 35012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Specially handle class extensions, which are anonymous categories. 35212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // We want to mangle in the location to uniquely distinguish them. 35312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (CD->IsClassExtension()) { 35412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "objc(ext)" << ID->getName() << '@'; 355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(CD, /*IncludeOffset=*/true); 35612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 35712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 35812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 35912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 36012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 36112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 36212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCCategoryImpl: { 36312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D); 36412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const ObjCInterfaceDecl *ID = CD->getClassInterface(); 36512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!ID) { 36612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Handle invalid code where the @interface might not 36712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // have been specified. 36812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: We should be able to generate this USR even if the 36912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // @interface isn't available. 37012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 37112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 37212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 37312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCCategory(ID->getName(), CD->getName()); 37412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 37512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 37612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case Decl::ObjCProtocol: 37712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProtocol(cast<ObjCProtocolDecl>(D)->getName()); 37812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 37912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 38012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 38112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 38212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) { 38312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // The USR for a property declared in a class extension or category is based 38412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // on the ObjCInterfaceDecl, not the ObjCCategoryDecl. 38512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = Context->getObjContainingInterface(D)) 38612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(ID); 38712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 38812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(cast<Decl>(D->getDeclContext())); 38912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis GenObjCProperty(D->getName()); 39012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 39112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 39212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { 39312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ObjCPropertyDecl *PD = D->getPropertyDecl()) { 39412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitObjCPropertyDecl(PD); 39512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 39612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 39712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 39812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 39912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 40012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 40112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTagDecl(const TagDecl *D) { 40212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Add the location of the tag decl to handle resolution across 40312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // translation units. 404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 40512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 40612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 40712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 40812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitDeclContext(D->getDeclContext()); 40912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 41012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis bool AlreadyStarted = false; 41112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) { 41212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) { 41312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 41412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 41512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 41612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 41712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@ST"; break; 41812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@CT"; break; 41912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UT"; break; 42012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum template"); 42112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 42212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(ClassTmpl->getTemplateParameters()); 42312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else if (const ClassTemplatePartialSpecializationDecl *PartialSpec 42412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) { 42512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis AlreadyStarted = true; 42612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 42712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 42812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 42912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@SP"; break; 43012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@CP"; break; 43112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@UP"; break; 43212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: llvm_unreachable("enum partial specialization"); 43312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 43412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(PartialSpec->getTemplateParameters()); 43512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 43612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 43712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 43812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!AlreadyStarted) { 43912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (D->getTagKind()) { 44012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Interface: 44112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Struct: Out << "@S"; break; 44212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Class: Out << "@C"; break; 44312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Union: Out << "@U"; break; 44412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TTK_Enum: Out << "@E"; break; 44512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 44612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 44712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 44812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@'; 44912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out.flush(); 45012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis assert(Buf.size() > 0); 45112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const unsigned off = Buf.size() - 1; 45212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 45312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (EmitDeclName(D)) { 45412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TypedefNameDecl *TD = D->getTypedefNameForAnonDecl()) { 45512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'A'; 45612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '@' << *TD; 45712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 45812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis else 45912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Buf[off] = 'a'; 46012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 46112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 46212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // For a class template specialization, mangle the template arguments. 46312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ClassTemplateSpecializationDecl *Spec 46412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 46512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateArgumentList &Args = Spec->getTemplateInstantiationArgs(); 46612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 46712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Args.size(); I != N; ++I) { 46812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 46912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Args.get(I)); 47012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 47112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 47212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 47312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 47412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) 47612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 47712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const DeclContext *DC = D->getDeclContext(); 47812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) 47912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(DCN); 48012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << "@T@"; 48112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << D->getName(); 48212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 48312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 48412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GenLoc(D, /*IncludeOffset=*/true); 48612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 48712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 48812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool USRGenerator::GenLoc(const Decl *D, bool IncludeOffset) { 49012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (generatedLoc) 49112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 49212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis generatedLoc = true; 493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 49412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Guard against null declarations in invalid code. 49512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D) { 49612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 49712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 49812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 49912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 50012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Use the location of canonical decl. 50112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis D = D->getCanonicalDecl(); 50212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IgnoreResults = 504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IgnoreResults || printLoc(Out, D->getLocStart(), 505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Context->getSourceManager(), IncludeOffset); 506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 50712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return IgnoreResults; 50812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 50912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 51012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitType(QualType T) { 51112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // This method mangles in USR information for types. It can possibly 51212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // just reuse the naming-mangling logic used by codegen, although the 51312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // requirements for USRs might not be the same. 51412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis ASTContext &Ctx = *Context; 51512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 51612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis do { 51712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Ctx.getCanonicalType(T); 51812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Qualifiers Q = T.getQualifiers(); 51912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned qVal = 0; 52012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasConst()) 52112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x1; 52212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasVolatile()) 52312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x2; 52412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Q.hasRestrict()) 52512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis qVal |= 0x4; 52612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if(qVal) 52712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ((char) ('0' + qVal)); 52812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 52912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Mangle in ObjC GC qualifiers? 53012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 53112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PackExpansionType *Expansion = T->getAs<PackExpansionType>()) { 53212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; 53312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = Expansion->getPattern(); 53412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 53512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 53612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BuiltinType *BT = T->getAs<BuiltinType>()) { 53712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned char c = '\0'; 53812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (BT->getKind()) { 53912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Void: 54012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'v'; break; 54112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Bool: 54212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'b'; break; 54312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char_U: 54412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UChar: 54512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'c'; break; 54612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char16: 54712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'q'; break; 54812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char32: 54912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'w'; break; 55012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UShort: 55112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 's'; break; 55212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt: 55312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'i'; break; 55412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULong: 55512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'l'; break; 55612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ULongLong: 55712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'k'; break; 55812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::UInt128: 55912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'j'; break; 56012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Char_S: 56112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::SChar: 56212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'C'; break; 56312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_S: 56412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::WChar_U: 56512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'W'; break; 56612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Short: 56712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'S'; break; 56812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int: 56912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'I'; break; 57012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Long: 57112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'L'; break; 57212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongLong: 57312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'K'; break; 57412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Int128: 57512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'J'; break; 57612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Half: 57712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'h'; break; 57812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Float: 57912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'f'; break; 58012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Double: 58112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'd'; break; 58212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::LongDouble: 58312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'D'; break; 58412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::NullPtr: 58512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'n'; break; 58612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define BUILTIN_TYPE(Id, SingletonId) 58712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 58812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis#include "clang/AST/BuiltinTypes.def" 58912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::Dependent: 59012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1d: 59112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1dArray: 59212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage1dBuffer: 59312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage2d: 59412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage2dArray: 59512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLImage3d: 59612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLEvent: 59712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::OCLSampler: 59812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis IgnoreResults = true; 59912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 60012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCId: 60112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'o'; break; 60212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCClass: 60312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'O'; break; 60412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case BuiltinType::ObjCSel: 60512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis c = 'e'; break; 60612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 60712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << c; 60812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 60912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 61012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 61112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // If we have already seen this (non-built-in) type, use a substitution 61212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // encoding. 61312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis llvm::DenseMap<const Type *, unsigned>::iterator Substitution 61412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = TypeSubstitutions.find(T.getTypePtr()); 61512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (Substitution != TypeSubstitutions.end()) { 61612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'S' << Substitution->second << '_'; 61712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 61812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } else { 61912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Record this as a substitution. 62012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis unsigned Number = TypeSubstitutions.size(); 62112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TypeSubstitutions[T.getTypePtr()] = Number; 62212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 62312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 62412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const PointerType *PT = T->getAs<PointerType>()) { 62512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '*'; 62612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = PT->getPointeeType(); 62712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 62812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 62912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ReferenceType *RT = T->getAs<ReferenceType>()) { 63012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '&'; 63112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = RT->getPointeeType(); 63212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 63312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 63412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const FunctionProtoType *FT = T->getAs<FunctionProtoType>()) { 63512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'F'; 636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(FT->getReturnType()); 637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : FT->param_types()) 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitType(I); 63912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (FT->isVariadic()) 64012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '.'; 64112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 64212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 64312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const BlockPointerType *BT = T->getAs<BlockPointerType>()) { 64412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'B'; 64512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = BT->getPointeeType(); 64612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 64712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 64812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const ComplexType *CT = T->getAs<ComplexType>()) { 64912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '<'; 65012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis T = CT->getElementType(); 65112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 65212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 65312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TagType *TT = T->getAs<TagType>()) { 65412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '$'; 65512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTagDecl(TT->getDecl()); 65612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 65712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 65812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateTypeParmType *TTP = T->getAs<TemplateTypeParmType>()) { 65912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 66012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 66112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 66212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (const TemplateSpecializationType *Spec 66312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = T->getAs<TemplateSpecializationType>()) { 66412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>'; 66512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Spec->getTemplateName()); 66612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Spec->getNumArgs(); 66712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I) 66812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(Spec->getArg(I)); 66912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 67012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 67112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 67212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Unhandled type. 67312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << ' '; 67412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 67512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } while (true); 67612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 67712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 67812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateParameterList( 67912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis const TemplateParameterList *Params) { 68012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!Params) 68112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 68212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '>' << Params->size(); 68312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (TemplateParameterList::const_iterator P = Params->begin(), 68412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis PEnd = Params->end(); 68512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis P != PEnd; ++P) { 68612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << '#'; 68712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (isa<TemplateTypeParmDecl>(*P)) { 68812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (cast<TemplateTypeParmDecl>(*P)->isParameterPack()) 68912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out<< 'p'; 69012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'T'; 69112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 69212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 69312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 69412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 69512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (NTTP->isParameterPack()) 69612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 69712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'N'; 69812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(NTTP->getType()); 69912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis continue; 70012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 70112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 70212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 70312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TTP->isParameterPack()) 70412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p'; 70512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't'; 70612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateParameterList(TTP->getTemplateParameters()); 70712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 70812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 70912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 71012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateName(TemplateName Name) { 71112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 71212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (TemplateTemplateParmDecl *TTP 71312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis = dyn_cast<TemplateTemplateParmDecl>(Template)) { 71412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 't' << TTP->getDepth() << '.' << TTP->getIndex(); 71512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 71612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 71712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 71812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Template); 71912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return; 72012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 72112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 72212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit dependent template names. 72312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 72412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 72512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidisvoid USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) { 72612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis switch (Arg.getKind()) { 72712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Null: 72812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 72912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 73012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Declaration: 73112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Visit(Arg.getAsDecl()); 73212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 73312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 73412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::NullPtr: 73512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 73612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 73712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::TemplateExpansion: 73812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'P'; // pack expansion of... 73912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Fall through 74012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Template: 74112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); 74212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 74312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 74412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Expression: 74512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // FIXME: Visit expressions. 74612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 74712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 74812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Pack: 74912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'p' << Arg.pack_size(); 75012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis for (TemplateArgument::pack_iterator P = Arg.pack_begin(), PEnd = Arg.pack_end(); 75112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis P != PEnd; ++P) 75212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitTemplateArgument(*P); 75312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 75412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Type: 75612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getAsType()); 75712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 75812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 75912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis case TemplateArgument::Integral: 76012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << 'V'; 76112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis VisitType(Arg.getIntegralType()); 76212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis Out << Arg.getAsIntegral(); 76312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis break; 76412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis } 76512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 76612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 76712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 76812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis// USR generation functions. 76912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 77012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 771e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCClass(StringRef Cls, raw_ostream &OS) { 77212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cs)" << Cls; 77312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 77412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 775e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCCategory(StringRef Cls, StringRef Cat, 776e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 77712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(cy)" << Cls << '@' << Cat; 77812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 77912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 780e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCIvar(StringRef Ivar, raw_ostream &OS) { 78112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << '@' << Ivar; 78212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 78312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 784e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCMethod(StringRef Sel, 785e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis bool IsInstanceMethod, 786e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis raw_ostream &OS) { 78712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << (IsInstanceMethod ? "(im)" : "(cm)") << Sel; 78812161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 78912161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 790e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProperty(StringRef Prop, raw_ostream &OS) { 79112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "(py)" << Prop; 79212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 79312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 794e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisvoid clang::index::generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS) { 79512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis OS << "objc(pl)" << Prot; 79612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 79712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 798e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidisbool clang::index::generateUSRForDecl(const Decl *D, 799e8458342d936c55b69806ea58d4a28bcb7c53d1aArgyrios Kyrtzidis SmallVectorImpl<char> &Buf) { 80012161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis // Don't generate USRs for things with invalid locations. 80112161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis if (!D || D->getLocStart().isInvalid()) 80212161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return true; 80312161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis 80412161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis USRGenerator UG(&D->getASTContext(), Buf); 80512161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis UG.Visit(D); 80612161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis return UG.ignoreResults(); 80712161968f3bcb7bb1053d2da36ac066d795ba7ddArgyrios Kyrtzidis} 808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool clang::index::generateUSRForMacro(const MacroDefinition *MD, 810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceManager &SM, 811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVectorImpl<char> &Buf) { 812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Don't generate USRs for things with invalid locations. 813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!MD || MD->getLocation().isInvalid()) 814651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 816651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_svector_ostream Out(Buf); 817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Assume that system headers are sane. Don't put source location 819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // information into the USR if the macro comes from a system header. 820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceLocation Loc = MD->getLocation(); 821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ShouldGenerateLocation = !SM.isInSystemHeader(Loc); 822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Out << getUSRSpacePrefix(); 824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ShouldGenerateLocation) 825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines printLoc(Out, Loc, SM, /*IncludeOffset=*/true); 826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Out << "@macro@"; 827c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines Out << MD->getName()->getName(); 828651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 830651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 831