aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Index/USRGeneration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Index/USRGeneration.cpp')
-rw-r--r--clang/lib/Index/USRGeneration.cpp148
1 files changed, 97 insertions, 51 deletions
diff --git a/clang/lib/Index/USRGeneration.cpp b/clang/lib/Index/USRGeneration.cpp
index c606d8521bee..d41c54348ac8 100644
--- a/clang/lib/Index/USRGeneration.cpp
+++ b/clang/lib/Index/USRGeneration.cpp
@@ -168,6 +168,8 @@ public:
void VisitTemplateName(TemplateName Name);
void VisitTemplateArgument(const TemplateArgument &Arg);
+ void VisitMSGuidDecl(const MSGuidDecl *D);
+
/// Emit a Decl's name using NamedDecl::printName() and return true if
/// the decl had no name.
bool EmitDeclName(const NamedDecl *D);
@@ -179,10 +181,11 @@ public:
//===----------------------------------------------------------------------===//
bool USRGenerator::EmitDeclName(const NamedDecl *D) {
- const unsigned startSize = Buf.size();
- D->printName(Out);
- const unsigned endSize = Buf.size();
- return startSize == endSize;
+ DeclarationName N = D->getDeclName();
+ if (N.isEmpty())
+ return true;
+ Out << N;
+ return false;
}
bool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) {
@@ -258,7 +261,7 @@ void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) {
}
// Mangle in type information for the arguments.
- for (auto PD : D->parameters()) {
+ for (auto *PD : D->parameters()) {
Out << '#';
VisitType(PD->getType());
}
@@ -657,120 +660,157 @@ void USRGenerator::VisitType(QualType T) {
}
if (const BuiltinType *BT = T->getAs<BuiltinType>()) {
- unsigned char c = '\0';
switch (BT->getKind()) {
case BuiltinType::Void:
- c = 'v'; break;
+ Out << 'v'; break;
case BuiltinType::Bool:
- c = 'b'; break;
+ Out << 'b'; break;
case BuiltinType::UChar:
- c = 'c'; break;
+ Out << 'c'; break;
case BuiltinType::Char8:
- c = 'u'; break; // FIXME: Check this doesn't collide
+ Out << 'u'; break;
case BuiltinType::Char16:
- c = 'q'; break;
+ Out << 'q'; break;
case BuiltinType::Char32:
- c = 'w'; break;
+ Out << 'w'; break;
case BuiltinType::UShort:
- c = 's'; break;
+ Out << 's'; break;
case BuiltinType::UInt:
- c = 'i'; break;
+ Out << 'i'; break;
case BuiltinType::ULong:
- c = 'l'; break;
+ Out << 'l'; break;
case BuiltinType::ULongLong:
- c = 'k'; break;
+ Out << 'k'; break;
case BuiltinType::UInt128:
- c = 'j'; break;
+ Out << 'j'; break;
case BuiltinType::Char_U:
case BuiltinType::Char_S:
- c = 'C'; break;
+ Out << 'C'; break;
case BuiltinType::SChar:
- c = 'r'; break;
+ Out << 'r'; break;
case BuiltinType::WChar_S:
case BuiltinType::WChar_U:
- c = 'W'; break;
+ Out << 'W'; break;
case BuiltinType::Short:
- c = 'S'; break;
+ Out << 'S'; break;
case BuiltinType::Int:
- c = 'I'; break;
+ Out << 'I'; break;
case BuiltinType::Long:
- c = 'L'; break;
+ Out << 'L'; break;
case BuiltinType::LongLong:
- c = 'K'; break;
+ Out << 'K'; break;
case BuiltinType::Int128:
- c = 'J'; break;
+ Out << 'J'; break;
case BuiltinType::Float16:
case BuiltinType::Half:
- c = 'h'; break;
+ Out << 'h'; break;
case BuiltinType::Float:
- c = 'f'; break;
+ Out << 'f'; break;
case BuiltinType::Double:
- c = 'd'; break;
- case BuiltinType::Ibm128: // FIXME: Need separate tag
+ Out << 'd'; break;
case BuiltinType::LongDouble:
- c = 'D'; break;
+ Out << 'D'; break;
case BuiltinType::Float128:
- c = 'Q'; break;
+ Out << 'Q'; break;
case BuiltinType::NullPtr:
- c = 'n'; break;
-#define BUILTIN_TYPE(Id, SingletonId)
-#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
-#include "clang/AST/BuiltinTypes.def"
- case BuiltinType::Dependent:
+ Out << 'n'; break;
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
- case BuiltinType::Id:
+ case BuiltinType::Id: \
+ Out << "@BT@" << #Suffix << "_" << #ImgType; break;
#include "clang/Basic/OpenCLImageTypes.def"
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
- case BuiltinType::Id:
+ case BuiltinType::Id: \
+ Out << "@BT@" << #ExtType; break;
#include "clang/Basic/OpenCLExtensionTypes.def"
case BuiltinType::OCLEvent:
+ Out << "@BT@OCLEvent"; break;
case BuiltinType::OCLClkEvent:
+ Out << "@BT@OCLClkEvent"; break;
case BuiltinType::OCLQueue:
+ Out << "@BT@OCLQueue"; break;
case BuiltinType::OCLReserveID:
+ Out << "@BT@OCLReserveID"; break;
case BuiltinType::OCLSampler:
+ Out << "@BT@OCLSampler"; break;
#define SVE_TYPE(Name, Id, SingletonId) \
- case BuiltinType::Id:
+ case BuiltinType::Id: \
+ Out << "@BT@" << Name; break;
#include "clang/Basic/AArch64SVEACLETypes.def"
#define PPC_VECTOR_TYPE(Name, Id, Size) \
- case BuiltinType::Id:
+ case BuiltinType::Id: \
+ Out << "@BT@" << #Name; break;
#include "clang/Basic/PPCTypes.def"
-#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#define RVV_TYPE(Name, Id, SingletonId) \
+ case BuiltinType::Id: \
+ Out << "@BT@" << Name; break;
#include "clang/Basic/RISCVVTypes.def"
case BuiltinType::ShortAccum:
+ Out << "@BT@ShortAccum"; break;
case BuiltinType::Accum:
+ Out << "@BT@Accum"; break;
case BuiltinType::LongAccum:
+ Out << "@BT@LongAccum"; break;
case BuiltinType::UShortAccum:
+ Out << "@BT@UShortAccum"; break;
case BuiltinType::UAccum:
+ Out << "@BT@UAccum"; break;
case BuiltinType::ULongAccum:
+ Out << "@BT@ULongAccum"; break;
case BuiltinType::ShortFract:
+ Out << "@BT@ShortFract"; break;
case BuiltinType::Fract:
+ Out << "@BT@Fract"; break;
case BuiltinType::LongFract:
+ Out << "@BT@LongFract"; break;
case BuiltinType::UShortFract:
+ Out << "@BT@UShortFract"; break;
case BuiltinType::UFract:
+ Out << "@BT@UFract"; break;
case BuiltinType::ULongFract:
+ Out << "@BT@ULongFract"; break;
case BuiltinType::SatShortAccum:
+ Out << "@BT@SatShortAccum"; break;
case BuiltinType::SatAccum:
+ Out << "@BT@SatAccum"; break;
case BuiltinType::SatLongAccum:
+ Out << "@BT@SatLongAccum"; break;
case BuiltinType::SatUShortAccum:
+ Out << "@BT@SatUShortAccum"; break;
case BuiltinType::SatUAccum:
+ Out << "@BT@SatUAccum"; break;
case BuiltinType::SatULongAccum:
+ Out << "@BT@SatULongAccum"; break;
case BuiltinType::SatShortFract:
+ Out << "@BT@SatShortFract"; break;
case BuiltinType::SatFract:
+ Out << "@BT@SatFract"; break;
case BuiltinType::SatLongFract:
+ Out << "@BT@SatLongFract"; break;
case BuiltinType::SatUShortFract:
+ Out << "@BT@SatUShortFract"; break;
case BuiltinType::SatUFract:
+ Out << "@BT@SatUFract"; break;
case BuiltinType::SatULongFract:
+ Out << "@BT@SatULongFract"; break;
case BuiltinType::BFloat16:
- IgnoreResults = true;
- return;
+ Out << "@BT@__bf16"; break;
+ case BuiltinType::Ibm128:
+ Out << "@BT@__ibm128"; break;
case BuiltinType::ObjCId:
- c = 'o'; break;
+ Out << 'o'; break;
case BuiltinType::ObjCClass:
- c = 'O'; break;
+ Out << 'O'; break;
case BuiltinType::ObjCSel:
- c = 'e'; break;
+ Out << 'e'; break;
+#define BUILTIN_TYPE(Id, SingletonId)
+#define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
+#include "clang/AST/BuiltinTypes.def"
+ case BuiltinType::Dependent:
+ // If you're adding a new builtin type, please add its name prefixed
+ // with "@BT@" to `Out` (see cases above).
+ IgnoreResults = true;
+ break;
}
- Out << c;
return;
}
@@ -855,9 +895,9 @@ void USRGenerator::VisitType(QualType T) {
= T->getAs<TemplateSpecializationType>()) {
Out << '>';
VisitTemplateName(Spec->getTemplateName());
- Out << Spec->getNumArgs();
- for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I)
- VisitTemplateArgument(Spec->getArg(I));
+ Out << Spec->template_arguments().size();
+ for (const auto &Arg : Spec->template_arguments())
+ VisitTemplateArgument(Arg);
return;
}
if (const DependentNameType *DNT = T->getAs<DependentNameType>()) {
@@ -963,7 +1003,7 @@ void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) {
case TemplateArgument::TemplateExpansion:
Out << 'P'; // pack expansion of...
- LLVM_FALLTHROUGH;
+ [[fallthrough]];
case TemplateArgument::Template:
VisitTemplateName(Arg.getAsTemplateOrTemplatePattern());
break;
@@ -1016,6 +1056,12 @@ void USRGenerator::VisitConceptDecl(const ConceptDecl *D) {
EmitDeclName(D);
}
+void USRGenerator::VisitMSGuidDecl(const MSGuidDecl *D) {
+ VisitDeclContext(D->getDeclContext());
+ Out << "@MG@";
+ D->NamedDecl::printName(Out);
+}
+
//===----------------------------------------------------------------------===//
// USR generation functions.
//===----------------------------------------------------------------------===//