diff options
Diffstat (limited to 'clang/tools')
-rwxr-xr-x | clang/tools/clang-format/git-clang-format | 2 | ||||
-rw-r--r-- | clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp | 216 | ||||
-rw-r--r-- | clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp | 20 | ||||
-rw-r--r-- | clang/tools/diagtool/ListWarnings.cpp | 3 | ||||
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 183 | ||||
-rw-r--r-- | clang/tools/libclang/CIndexCodeCompletion.cpp | 4 | ||||
-rw-r--r-- | clang/tools/libclang/CMakeLists.txt | 6 | ||||
-rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 8 | ||||
-rw-r--r-- | clang/tools/libclang/CXIndexDataConsumer.cpp | 26 | ||||
-rw-r--r-- | clang/tools/libclang/CXType.cpp | 36 | ||||
-rw-r--r-- | clang/tools/libclang/CursorVisitor.h | 4 |
11 files changed, 156 insertions, 352 deletions
diff --git a/clang/tools/clang-format/git-clang-format b/clang/tools/clang-format/git-clang-format index e709803..fe2dd28 100755 --- a/clang/tools/clang-format/git-clang-format +++ b/clang/tools/clang-format/git-clang-format @@ -419,7 +419,7 @@ def compute_diff(commits, files, staged, diff_common_commit): if len(commits) == 2: git_tool = "diff-tree" if diff_common_commit: - commits = [f"{commits[0]}...{commits[1]}"] + extra_args += ["--merge-base"] elif staged: extra_args += ["--cached"] diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 1d91f5f2..a56e758 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -911,9 +911,9 @@ Error handleOverrideImages( /// Transforms all the extracted offloading input files into an image that can /// be registered by the runtime. -Expected<SmallVector<StringRef>> linkAndWrapDeviceFiles( - SmallVectorImpl<SmallVector<OffloadFile>> &LinkerInputFiles, - const InputArgList &Args, char **Argv, int Argc) { +Expected<SmallVector<StringRef>> +linkAndWrapDeviceFiles(ArrayRef<SmallVector<OffloadFile>> LinkerInputFiles, + const InputArgList &Args, char **Argv, int Argc) { llvm::TimeTraceScope TimeScope("Handle all device input"); std::mutex ImageMtx; @@ -1069,147 +1069,6 @@ std::optional<std::string> searchLibrary(StringRef Input, StringRef Root, return searchLibraryBaseName(Input, Root, SearchPaths); } -/// Common redeclaration of needed symbol flags. -enum Symbol : uint32_t { - Sym_None = 0, - Sym_Undefined = 1U << 1, - Sym_Weak = 1U << 2, -}; - -/// Scan the symbols from a BitcodeFile \p Buffer and record if we need to -/// extract any symbols from it. -Expected<bool> getSymbolsFromBitcode(MemoryBufferRef Buffer, OffloadKind Kind, - bool IsArchive, StringSaver &Saver, - DenseMap<StringRef, Symbol> &Syms) { - Expected<IRSymtabFile> IRSymtabOrErr = readIRSymtab(Buffer); - if (!IRSymtabOrErr) - return IRSymtabOrErr.takeError(); - - bool ShouldExtract = !IsArchive; - DenseMap<StringRef, Symbol> TmpSyms; - for (unsigned I = 0; I != IRSymtabOrErr->Mods.size(); ++I) { - for (const auto &Sym : IRSymtabOrErr->TheReader.module_symbols(I)) { - if (Sym.isFormatSpecific() || !Sym.isGlobal()) - continue; - - auto It = Syms.find(Sym.getName()); - bool NewSymbol = It == Syms.end(); - auto OldSym = NewSymbol ? Sym_None : It->second; - - // We will extract if it defines a currenlty undefined non-weak - // symbol. - bool ResolvesStrongReference = - ((OldSym & Sym_Undefined && !(OldSym & Sym_Weak)) && - !Sym.isUndefined()); - // We will extract if it defines a new global symbol visible to the - // host. This is only necessary for code targeting an offloading - // language. - bool NewGlobalSymbol = - ((NewSymbol || (OldSym & Sym_Undefined)) && !Sym.isUndefined() && - !Sym.canBeOmittedFromSymbolTable() && Kind != object::OFK_None && - (Sym.getVisibility() != GlobalValue::HiddenVisibility)); - ShouldExtract |= ResolvesStrongReference | NewGlobalSymbol; - - // Update this symbol in the "table" with the new information. - if (OldSym & Sym_Undefined && !Sym.isUndefined()) - TmpSyms[Saver.save(Sym.getName())] = - static_cast<Symbol>(OldSym & ~Sym_Undefined); - if (Sym.isUndefined() && NewSymbol) - TmpSyms[Saver.save(Sym.getName())] = - static_cast<Symbol>(OldSym | Sym_Undefined); - if (Sym.isWeak()) - TmpSyms[Saver.save(Sym.getName())] = - static_cast<Symbol>(OldSym | Sym_Weak); - } - } - - // If the file gets extracted we update the table with the new symbols. - if (ShouldExtract) - Syms.insert_range(TmpSyms); - - return ShouldExtract; -} - -/// Scan the symbols from an ObjectFile \p Obj and record if we need to extract -/// any symbols from it. -Expected<bool> getSymbolsFromObject(const ObjectFile &Obj, OffloadKind Kind, - bool IsArchive, StringSaver &Saver, - DenseMap<StringRef, Symbol> &Syms) { - bool ShouldExtract = !IsArchive; - DenseMap<StringRef, Symbol> TmpSyms; - for (SymbolRef Sym : Obj.symbols()) { - auto FlagsOrErr = Sym.getFlags(); - if (!FlagsOrErr) - return FlagsOrErr.takeError(); - - if (!(*FlagsOrErr & SymbolRef::SF_Global) || - (*FlagsOrErr & SymbolRef::SF_FormatSpecific)) - continue; - - auto NameOrErr = Sym.getName(); - if (!NameOrErr) - return NameOrErr.takeError(); - - bool NewSymbol = Syms.count(*NameOrErr) == 0; - auto OldSym = NewSymbol ? Sym_None : Syms[*NameOrErr]; - - // We will extract if it defines a currenlty undefined non-weak symbol. - bool ResolvesStrongReference = (OldSym & Sym_Undefined) && - !(OldSym & Sym_Weak) && - !(*FlagsOrErr & SymbolRef::SF_Undefined); - - // We will extract if it defines a new global symbol visible to the - // host. This is only necessary for code targeting an offloading - // language. - bool NewGlobalSymbol = - ((NewSymbol || (OldSym & Sym_Undefined)) && - !(*FlagsOrErr & SymbolRef::SF_Undefined) && Kind != object::OFK_None && - !(*FlagsOrErr & SymbolRef::SF_Hidden)); - ShouldExtract |= ResolvesStrongReference | NewGlobalSymbol; - - // Update this symbol in the "table" with the new information. - if (OldSym & Sym_Undefined && !(*FlagsOrErr & SymbolRef::SF_Undefined)) - TmpSyms[Saver.save(*NameOrErr)] = - static_cast<Symbol>(OldSym & ~Sym_Undefined); - if (*FlagsOrErr & SymbolRef::SF_Undefined && NewSymbol) - TmpSyms[Saver.save(*NameOrErr)] = - static_cast<Symbol>(OldSym | Sym_Undefined); - if (*FlagsOrErr & SymbolRef::SF_Weak) - TmpSyms[Saver.save(*NameOrErr)] = static_cast<Symbol>(OldSym | Sym_Weak); - } - - // If the file gets extracted we update the table with the new symbols. - if (ShouldExtract) - Syms.insert_range(TmpSyms); - - return ShouldExtract; -} - -/// Attempt to 'resolve' symbols found in input files. We use this to -/// determine if an archive member needs to be extracted. An archive member -/// will be extracted if any of the following is true. -/// 1) It defines an undefined symbol in a regular object filie. -/// 2) It defines a global symbol without hidden visibility that has not -/// yet been defined. -Expected<bool> getSymbols(StringRef Image, OffloadKind Kind, bool IsArchive, - StringSaver &Saver, - DenseMap<StringRef, Symbol> &Syms) { - MemoryBufferRef Buffer = MemoryBufferRef(Image, ""); - switch (identify_magic(Image)) { - case file_magic::bitcode: - return getSymbolsFromBitcode(Buffer, Kind, IsArchive, Saver, Syms); - case file_magic::elf_relocatable: { - Expected<std::unique_ptr<ObjectFile>> ObjFile = - ObjectFile::createObjectFile(Buffer); - if (!ObjFile) - return ObjFile.takeError(); - return getSymbolsFromObject(**ObjFile, Kind, IsArchive, Saver, Syms); - } - default: - return false; - } -} - /// Search the input files and libraries for embedded device offloading code /// and add it to the list of files to be linked. Files coming from static /// libraries are only added to the input if they are used by an existing @@ -1279,7 +1138,6 @@ getDeviceInput(const ArgList &Args) { // Link all standard input files and update the list of symbols. MapVector<OffloadFile::TargetID, SmallVector<OffloadFile, 0>> InputFiles; - DenseMap<OffloadFile::TargetID, DenseMap<StringRef, Symbol>> Syms; for (OffloadFile &Binary : ObjectFilesToExtract) { if (!Binary.getBinary()) continue; @@ -1290,12 +1148,6 @@ getDeviceInput(const ArgList &Args) { CompatibleTargets.emplace_back(ID); for (const auto &[Index, ID] : llvm::enumerate(CompatibleTargets)) { - Expected<bool> ExtractOrErr = getSymbols( - Binary.getBinary()->getImage(), Binary.getBinary()->getOffloadKind(), - /*IsArchive=*/false, Saver, Syms[ID]); - if (!ExtractOrErr) - return ExtractOrErr.takeError(); - // If another target needs this binary it must be copied instead. if (Index == CompatibleTargets.size() - 1) InputFiles[ID].emplace_back(std::move(Binary)); @@ -1304,55 +1156,33 @@ getDeviceInput(const ArgList &Args) { } } - // Archive members only extract if they define needed symbols. We do this - // after every regular input file so that libraries may be included out of - // order. This follows 'ld.lld' semantics which are more lenient. - bool Extracted = true; llvm::DenseSet<StringRef> ShouldExtract; for (auto &Arg : Args.getAllArgValues(OPT_should_extract)) ShouldExtract.insert(Arg); - while (Extracted) { - Extracted = false; - for (OffloadFile &Binary : ArchiveFilesToExtract) { - // If the binary was previously extracted it will be set to null. - if (!Binary.getBinary()) - continue; - - SmallVector<OffloadFile::TargetID> CompatibleTargets = {Binary}; - for (const auto &[ID, Input] : InputFiles) - if (object::areTargetsCompatible(Binary, ID)) - CompatibleTargets.emplace_back(ID); - - for (const auto &[Index, ID] : llvm::enumerate(CompatibleTargets)) { - // Only extract an if we have an an object matching this target or it - // was specifically requested. - if (!InputFiles.count(ID) && !ShouldExtract.contains(ID.second)) - continue; - - Expected<bool> ExtractOrErr = - getSymbols(Binary.getBinary()->getImage(), - Binary.getBinary()->getOffloadKind(), - /*IsArchive=*/true, Saver, Syms[ID]); - if (!ExtractOrErr) - return ExtractOrErr.takeError(); - Extracted = *ExtractOrErr; + // We only extract archive members from the fat binary if we find a used or + // requested target. Unlike normal static archive handling, we just extract + // every object file contained in the archive. + for (OffloadFile &Binary : ArchiveFilesToExtract) { + if (!Binary.getBinary()) + continue; - // Skip including the file if it is an archive that does not resolve - // any symbols. - if (!Extracted && !ShouldExtract.contains(ID.second)) - continue; + SmallVector<OffloadFile::TargetID> CompatibleTargets = {Binary}; + for (const auto &[ID, Input] : InputFiles) + if (object::areTargetsCompatible(Binary, ID)) + CompatibleTargets.emplace_back(ID); - // If another target needs this binary it must be copied instead. - if (Index == CompatibleTargets.size() - 1) - InputFiles[ID].emplace_back(std::move(Binary)); - else - InputFiles[ID].emplace_back(Binary.copy()); - } + for (const auto &[Index, ID] : llvm::enumerate(CompatibleTargets)) { + // Only extract an if we have an an object matching this target or it + // was specifically requested. + if (!InputFiles.count(ID) && !ShouldExtract.contains(ID.second)) + continue; - // If we extracted any files we need to check all the symbols again. - if (Extracted) - break; + // If another target needs this binary it must be copied instead. + if (Index == CompatibleTargets.size() - 1) + InputFiles[ID].emplace_back(std::move(Binary)); + else + InputFiles[ID].emplace_back(Binary.copy()); } } diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index 4b639712..58eb671 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -286,12 +286,16 @@ struct Symbol { }; Expected<StringRef> runPTXAs(StringRef File, const ArgList &Args) { - std::string CudaPath = Args.getLastArgValue(OPT_cuda_path_EQ).str(); - std::string GivenPath = Args.getLastArgValue(OPT_ptxas_path_EQ).str(); - Expected<std::string> PTXAsPath = - findProgram(Args, "ptxas", {CudaPath + "/bin", GivenPath}); + SmallVector<StringRef, 1> SearchPaths; + if (Arg *A = Args.getLastArg(OPT_cuda_path_EQ)) + SearchPaths.push_back(Args.MakeArgString(A->getValue() + Twine("/bin"))); + if (Arg *A = Args.getLastArg(OPT_ptxas_path_EQ)) + SearchPaths.push_back(Args.MakeArgString(A->getValue())); + + Expected<std::string> PTXAsPath = findProgram(Args, "ptxas", SearchPaths); if (!PTXAsPath) return PTXAsPath.takeError(); + if (!Args.hasArg(OPT_arch)) return createStringError( "must pass in an explicit nvptx64 gpu architecture to 'ptxas'"); @@ -691,9 +695,11 @@ Error runNVLink(ArrayRef<StringRef> Files, const ArgList &Args) { if (Args.hasArg(OPT_lto_emit_asm) || Args.hasArg(OPT_lto_emit_llvm)) return Error::success(); - std::string CudaPath = Args.getLastArgValue(OPT_cuda_path_EQ).str(); - Expected<std::string> NVLinkPath = - findProgram(Args, "nvlink", {CudaPath + "/bin"}); + SmallVector<StringRef, 1> SearchPaths; + if (Arg *A = Args.getLastArg(OPT_cuda_path_EQ)) + SearchPaths.push_back(Args.MakeArgString(A->getValue() + Twine("/bin"))); + + Expected<std::string> NVLinkPath = findProgram(Args, "nvlink", SearchPaths); if (!NVLinkPath) return NVLinkPath.takeError(); diff --git a/clang/tools/diagtool/ListWarnings.cpp b/clang/tools/diagtool/ListWarnings.cpp index 9f96471..ce24f11 100644 --- a/clang/tools/diagtool/ListWarnings.cpp +++ b/clang/tools/diagtool/ListWarnings.cpp @@ -56,6 +56,9 @@ int ListWarnings::run(unsigned int argc, char **argv, llvm::raw_ostream &out) { if (DiagnosticIDs{}.isNote(diagID)) continue; + if (DiagnosticIDs{}.isTrapDiag(diagID)) + continue; + if (!DiagnosticIDs{}.isWarningOrExtension(diagID)) continue; diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 8b3d70b..858423a 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -1420,79 +1420,25 @@ bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) { llvm_unreachable("Invalid DeclarationName::Kind!"); } -bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS, - SourceRange Range) { - // FIXME: This whole routine is a hack to work around the lack of proper - // source information in nested-name-specifiers (PR5791). Since we do have - // a beginning source location, we can visit the first component of the - // nested-name-specifier, if it's a single-token component. - if (!NNS) - return false; - - // Get the first component in the nested-name-specifier. - while (NestedNameSpecifier *Prefix = NNS->getPrefix()) - NNS = Prefix; - - switch (NNS->getKind()) { - case NestedNameSpecifier::Namespace: - return Visit( - MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(), TU)); - - case NestedNameSpecifier::TypeSpec: { - // If the type has a form where we know that the beginning of the source - // range matches up with a reference cursor. Visit the appropriate reference - // cursor. - const Type *T = NNS->getAsType(); - if (const TypedefType *Typedef = dyn_cast<TypedefType>(T)) - return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU)); - if (const TagType *Tag = dyn_cast<TagType>(T)) - return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU)); - if (const TemplateSpecializationType *TST = - dyn_cast<TemplateSpecializationType>(T)) - return VisitTemplateName(TST->getTemplateName(), Range.getBegin()); - break; - } - - case NestedNameSpecifier::Global: - case NestedNameSpecifier::Identifier: - case NestedNameSpecifier::Super: - break; - } - - return false; -} - bool CursorVisitor::VisitNestedNameSpecifierLoc( NestedNameSpecifierLoc Qualifier) { - SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; - for (; Qualifier; Qualifier = Qualifier.getPrefix()) - Qualifiers.push_back(Qualifier); - - while (!Qualifiers.empty()) { - NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); - NestedNameSpecifier *NNS = Q.getNestedNameSpecifier(); - switch (NNS->getKind()) { - case NestedNameSpecifier::Namespace: - if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), - Q.getLocalBeginLoc(), TU))) - return true; - - break; - - case NestedNameSpecifier::TypeSpec: - if (Visit(Q.getTypeLoc())) - return true; - - break; - - case NestedNameSpecifier::Global: - case NestedNameSpecifier::Identifier: - case NestedNameSpecifier::Super: - break; - } + NestedNameSpecifier NNS = Qualifier.getNestedNameSpecifier(); + switch (NNS.getKind()) { + case NestedNameSpecifier::Kind::Namespace: { + auto [Namespace, Prefix] = Qualifier.castAsNamespaceAndPrefix(); + if (VisitNestedNameSpecifierLoc(Prefix)) + return true; + return Visit( + MakeCursorNamespaceRef(Namespace, Qualifier.getLocalBeginLoc(), TU)); } - - return false; + case NestedNameSpecifier::Kind::Type: + return Visit(Qualifier.castAsTypeLoc()); + case NestedNameSpecifier::Kind::Null: + case NestedNameSpecifier::Kind::Global: + case NestedNameSpecifier::Kind::MicrosoftSuper: + return false; + } + llvm_unreachable("unexpected nested name specifier kind"); } bool CursorVisitor::VisitTemplateParameters( @@ -1515,16 +1461,23 @@ bool CursorVisitor::VisitTemplateParameters( return false; } -bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) { +bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation NameLoc, + NestedNameSpecifierLoc NNS) { switch (Name.getKind()) { + case TemplateName::QualifiedTemplate: { + const QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName(); + assert(QTN->getQualifier() == NNS.getNestedNameSpecifier()); + if (VisitNestedNameSpecifierLoc(NNS)) + return true; + return VisitTemplateName(QTN->getUnderlyingTemplate(), NameLoc, /*NNS=*/{}); + } case TemplateName::Template: case TemplateName::UsingTemplate: - case TemplateName::QualifiedTemplate: // FIXME: Visit nested-name-specifier. - return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU)); + return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), NameLoc, TU)); case TemplateName::OverloadedTemplate: // Visit the overloaded template set. - if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU))) + if (Visit(MakeCursorOverloadedDeclRef(Name, NameLoc, TU))) return true; return false; @@ -1533,17 +1486,19 @@ bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) { // FIXME: Visit DeclarationName? return false; - case TemplateName::DependentTemplate: - // FIXME: Visit nested-name-specifier. - return false; + case TemplateName::DependentTemplate: { + assert(Name.getAsDependentTemplateName()->getQualifier() == + NNS.getNestedNameSpecifier()); + return VisitNestedNameSpecifierLoc(NNS); + } case TemplateName::SubstTemplateTemplateParm: return Visit(MakeCursorTemplateRef( - Name.getAsSubstTemplateTemplateParm()->getParameter(), Loc, TU)); + Name.getAsSubstTemplateTemplateParm()->getParameter(), NameLoc, TU)); case TemplateName::SubstTemplateTemplateParmPack: return Visit(MakeCursorTemplateRef( - Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(), Loc, + Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(), NameLoc, TU)); case TemplateName::DeducedTemplate: @@ -1587,11 +1542,9 @@ bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) { case TemplateArgument::Template: case TemplateArgument::TemplateExpansion: - if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc())) - return true; - return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(), - TAL.getTemplateNameLoc()); + TAL.getTemplateNameLoc(), + TAL.getTemplateQualifierLoc()); } llvm_unreachable("Invalid TemplateArgument::Kind!"); @@ -1669,7 +1622,10 @@ bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { } bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) { - return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU)); + if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) + return true; + + return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); } bool CursorVisitor::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) { @@ -1677,14 +1633,20 @@ bool CursorVisitor::VisitPredefinedSugarTypeLoc(PredefinedSugarTypeLoc TL) { } bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { + if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) + return true; + return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); } bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) { + if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) + return true; + if (TL.isDefinition()) - return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest)); + return Visit(MakeCXCursor(TL.getOriginalDecl(), TU, RegionOfInterest)); - return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); + return Visit(MakeCursorTypeRef(TL.getOriginalDecl(), TL.getNameLoc(), TU)); } bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { @@ -1763,7 +1725,10 @@ bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { } bool CursorVisitor::VisitUsingTypeLoc(UsingTypeLoc TL) { - auto *underlyingDecl = TL.getUnderlyingType()->getAsTagDecl(); + if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) + return true; + + auto *underlyingDecl = TL.getTypePtr()->getAsTagDecl(); if (underlyingDecl) { return Visit(MakeCursorTypeRef(underlyingDecl, TL.getNameLoc(), TU)); } @@ -1826,7 +1791,7 @@ bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { bool CursorVisitor::VisitDeducedTemplateSpecializationTypeLoc( DeducedTemplateSpecializationTypeLoc TL) { if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), - TL.getTemplateNameLoc())) + TL.getTemplateNameLoc(), TL.getQualifierLoc())) return true; return false; @@ -1836,7 +1801,7 @@ bool CursorVisitor::VisitTemplateSpecializationTypeLoc( TemplateSpecializationTypeLoc TL) { // Visit the template name. if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), - TL.getTemplateNameLoc())) + TL.getTemplateNameLoc(), TL.getQualifierLoc())) return true; // Visit the template arguments. @@ -1871,8 +1836,7 @@ bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( DependentTemplateSpecializationTypeLoc TL) { - // Visit the nested-name-specifier, if there is one. - if (TL.getQualifierLoc() && VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) + if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) return true; // Visit the template arguments. @@ -1883,13 +1847,6 @@ bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( return false; } -bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { - if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) - return true; - - return Visit(TL.getNamedTypeLoc()); -} - bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { return Visit(TL.getPatternLoc()); } @@ -1908,7 +1865,7 @@ bool CursorVisitor::VisitPackIndexingTypeLoc(PackIndexingTypeLoc TL) { } bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { - return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); + return Visit(MakeCursorTypeRef(TL.getOriginalDecl(), TL.getNameLoc(), TU)); } bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) { @@ -1943,6 +1900,7 @@ DEFAULT_TYPELOC_IMPL(Record, TagType) DEFAULT_TYPELOC_IMPL(Enum, TagType) DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type) DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type) +DEFAULT_TYPELOC_IMPL(SubstBuiltinTemplatePack, Type) DEFAULT_TYPELOC_IMPL(Auto, Type) DEFAULT_TYPELOC_IMPL(BitInt, Type) DEFAULT_TYPELOC_IMPL(DependentBitInt, Type) @@ -2065,7 +2023,7 @@ class NestedNameSpecifierLocVisit : public VisitorJob { public: NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent) : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind, - Qualifier.getNestedNameSpecifier(), + Qualifier.getNestedNameSpecifier().getAsVoidPointer(), Qualifier.getOpaqueData()) {} static bool classof(const VisitorJob *VJ) { @@ -2074,8 +2032,7 @@ public: NestedNameSpecifierLoc get() const { return NestedNameSpecifierLoc( - const_cast<NestedNameSpecifier *>( - static_cast<const NestedNameSpecifier *>(data[0])), + NestedNameSpecifier::getFromVoidPointer(data[0]), const_cast<void *>(data[1])); } }; @@ -2895,8 +2852,10 @@ void OpenACCClauseEnqueue::VisitDeviceClause(const OpenACCDeviceClause &C) { void OpenACCClauseEnqueue::VisitFirstPrivateClause( const OpenACCFirstPrivateClause &C) { VisitVarList(C); - for (VarDecl *V : C.getInitRecipes()) - Visitor.AddDecl(V); + for (const OpenACCFirstPrivateRecipe &R : C.getInitRecipes()) { + Visitor.AddDecl(R.RecipeDecl); + Visitor.AddDecl(R.InitFromTemporary); + } } void OpenACCClauseEnqueue::VisitPresentClause(const OpenACCPresentClause &C) { @@ -2970,15 +2929,17 @@ void OpenACCClauseEnqueue::VisitDeviceTypeClause( void OpenACCClauseEnqueue::VisitReductionClause( const OpenACCReductionClause &C) { VisitVarList(C); + for (const OpenACCReductionRecipe &R : C.getRecipes()) { + static_assert(sizeof(OpenACCReductionRecipe) == sizeof(int *)); + Visitor.AddDecl(R.RecipeDecl); + } } void OpenACCClauseEnqueue::VisitAutoClause(const OpenACCAutoClause &C) {} void OpenACCClauseEnqueue::VisitIndependentClause( const OpenACCIndependentClause &C) {} void OpenACCClauseEnqueue::VisitSeqClause(const OpenACCSeqClause &C) {} void OpenACCClauseEnqueue::VisitNoHostClause(const OpenACCNoHostClause &C) {} -void OpenACCClauseEnqueue::VisitBindClause(const OpenACCBindClause &C) { - assert(false && "TODO ERICH"); -} +void OpenACCClauseEnqueue::VisitBindClause(const OpenACCBindClause &C) { } void OpenACCClauseEnqueue::VisitFinalizeClause(const OpenACCFinalizeClause &C) { } void OpenACCClauseEnqueue::VisitIfPresentClause( @@ -5363,9 +5324,13 @@ CXString clang_getCursorSpelling(CXCursor C) { case CXCursor_TypeRef: { const TypeDecl *Type = getCursorTypeRef(C).first; assert(Type && "Missing type decl"); + const ASTContext &Ctx = getCursorContext(C); + QualType T = Ctx.getTypeDeclType(Type); - return cxstring::createDup( - getCursorContext(C).getTypeDeclType(Type).getAsString()); + PrintingPolicy Policy = Ctx.getPrintingPolicy(); + Policy.FullyQualifiedName = true; + Policy.SuppressTagKeyword = false; + return cxstring::createDup(T.getAsString(Policy)); } case CXCursor_TemplateRef: { const TemplateDecl *Template = getCursorTemplateRef(C).first; diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 81448b4..6d14f28 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -617,7 +617,7 @@ namespace { if (!baseType.isNull()) { // Get the declaration for a class/struct/union/enum type if (const TagType *Tag = baseType->getAs<TagType>()) - D = Tag->getDecl(); + D = Tag->getOriginalDecl(); // Get the @interface declaration for a (possibly-qualified) Objective-C // object pointer type, e.g., NSString* else if (const ObjCObjectPointerType *ObjPtr = @@ -629,7 +629,7 @@ namespace { // Get the class for a C++ injected-class-name else if (const InjectedClassNameType *Injected = baseType->getAs<InjectedClassNameType>()) - D = Injected->getDecl(); + D = Injected->getOriginalDecl(); } if (D != nullptr) { diff --git a/clang/tools/libclang/CMakeLists.txt b/clang/tools/libclang/CMakeLists.txt index 2b1e266..e0ff760 100644 --- a/clang/tools/libclang/CMakeLists.txt +++ b/clang/tools/libclang/CMakeLists.txt @@ -93,7 +93,7 @@ if(MSVC) set(LLVM_EXPORTED_SYMBOL_FILE) endif() -if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND NOT CYGWIN) +if (UNIX AND NOT APPLE AND NOT "${CMAKE_SYSTEM_NAME}" MATCHES "AIX" AND NOT CYGWIN) set(LLVM_EXPORTED_SYMBOL_FILE) set(USE_VERSION_SCRIPT ${LLVM_HAVE_LINK_VERSION_SCRIPT}) endif() @@ -125,7 +125,7 @@ else() set(output_name "clang") endif() -if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") +if (UNIX AND "${CMAKE_SYSTEM_NAME}" MATCHES "AIX") set(CMAKE_AIX_EXPORT_ALL_SYMBOLS OFF) # libclang requires headers which need _ALL_SOURCE to build on AIX remove_definitions("-D_XOPEN_SOURCE=700") @@ -186,7 +186,7 @@ if(ENABLE_SHARED) endif() endif() if (USE_VERSION_SCRIPT) - if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + if ("${CMAKE_SYSTEM_NAME}" MATCHES "SunOS") include(CheckLinkerFlag) # The Solaris 11.4 linker supports a subset of GNU ld version scripts, # but requires a special option to enable it. diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index a6301da..3c40624 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -1332,16 +1332,10 @@ CXCursor cxcursor::getTypeRefCursor(CXCursor cursor) { TypeLoc TL = Type->getTypeLoc(); SourceLocation Loc = TL.getBeginLoc(); - if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) { - Ty = ElabT->getNamedType(); - ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>(); - Loc = ElabTL.getNamedTypeLoc().getBeginLoc(); - } - if (const TypedefType *Typedef = Ty->getAs<TypedefType>()) return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU); if (const TagType *Tag = Ty->getAs<TagType>()) - return MakeCursorTypeRef(Tag->getDecl(), Loc, TU); + return MakeCursorTypeRef(Tag->getOriginalDecl(), Loc, TU); if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>()) return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU); diff --git a/clang/tools/libclang/CXIndexDataConsumer.cpp b/clang/tools/libclang/CXIndexDataConsumer.cpp index 73d04b8..423dd1b 100644 --- a/clang/tools/libclang/CXIndexDataConsumer.cpp +++ b/clang/tools/libclang/CXIndexDataConsumer.cpp @@ -357,7 +357,7 @@ CXIndexDataConsumer::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D, TST = T->getAs<TemplateSpecializationType>()) { BaseD = TST->getTemplateName().getAsTemplateDecl(); } else if (const RecordType *RT = T->getAs<RecordType>()) { - BaseD = RT->getDecl(); + BaseD = RT->getOriginalDecl(); } if (BaseD) @@ -389,13 +389,22 @@ SourceLocation CXIndexDataConsumer::CXXBasesListInfo::getBaseLoc( if (QualifiedTypeLoc QL = TL.getAs<QualifiedTypeLoc>()) TL = QL.getUnqualifiedLoc(); - if (ElaboratedTypeLoc EL = TL.getAs<ElaboratedTypeLoc>()) - return EL.getNamedTypeLoc().getBeginLoc(); - if (DependentNameTypeLoc DL = TL.getAs<DependentNameTypeLoc>()) - return DL.getNameLoc(); - if (DependentTemplateSpecializationTypeLoc DTL = - TL.getAs<DependentTemplateSpecializationTypeLoc>()) - return DTL.getTemplateNameLoc(); + // FIXME: Factor this out, a lot of TypeLoc users seem to need a generic + // TypeLoc::getNameLoc() + if (auto TTL = TL.getAs<DependentNameTypeLoc>()) + return TTL.getNameLoc(); + if (auto TTL = TL.getAs<DependentTemplateSpecializationTypeLoc>()) + return TTL.getTemplateNameLoc(); + if (auto TTL = TL.getAs<TemplateSpecializationTypeLoc>()) + return TTL.getTemplateNameLoc(); + if (auto TTL = TL.getAs<TagTypeLoc>()) + return TTL.getNameLoc(); + if (auto TTL = TL.getAs<TypedefTypeLoc>()) + return TTL.getNameLoc(); + if (auto TTL = TL.getAs<UnresolvedUsingTypeLoc>()) + return TTL.getNameLoc(); + if (auto TTL = TL.getAs<UsingTypeLoc>()) + return TTL.getNameLoc(); return Loc; } @@ -1232,6 +1241,7 @@ static CXIdxEntityKind getEntityKindFromSymbolKind(SymbolKind K, SymbolLanguage case SymbolKind::TemplateTypeParm: case SymbolKind::TemplateTemplateParm: case SymbolKind::NonTypeTemplateParm: + case SymbolKind::IncludeDirective: return CXIdxEntity_Unexposed; case SymbolKind::Enum: return CXIdxEntity_Enum; diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index e7864e6..d21ac7c 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/tools/libclang/CXType.cpp @@ -118,7 +118,6 @@ static CXTypeKind GetTypeKind(QualType T) { TKCASE(ExtVector); TKCASE(MemberPointer); TKCASE(Auto); - TKCASE(Elaborated); TKCASE(Pipe); TKCASE(Attributed); TKCASE(BTFTagAttributed); @@ -225,6 +224,11 @@ FindTemplateArgumentTypeAt(ArrayRef<TemplateArgument> TA, unsigned index) { return std::nullopt; } +static CXType getTypeDeclType(const ASTContext &Context, CXTranslationUnit TU, + const TypeDecl *TD) { + return MakeCXType(Context.getTypeDeclType(TD), TU); +} + CXType clang_getCursorType(CXCursor C) { using namespace cxcursor; @@ -244,7 +248,7 @@ CXType clang_getCursorType(CXCursor C) { return MakeCXType(QualType(), TU); if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) - return MakeCXType(Context.getTypeDeclType(TD), TU); + return getTypeDeclType(Context, TU, TD); if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) return MakeCXType(Context.getObjCInterfaceType(ID), TU); if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) @@ -271,11 +275,8 @@ CXType clang_getCursorType(CXCursor C) { return MakeCXType(T, TU); } - case CXCursor_TypeRef: { - QualType T = Context.getTypeDeclType(getCursorTypeRef(C).first); - return MakeCXType(T, TU); - - } + case CXCursor_TypeRef: + return getTypeDeclType(Context, TU, getCursorTypeRef(C).first); case CXCursor_CXXBaseSpecifier: return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU); @@ -545,11 +546,11 @@ try_again: break; case Type::Record: case Type::Enum: - D = cast<TagType>(TP)->getDecl(); + D = cast<TagType>(TP)->getOriginalDecl(); break; case Type::TemplateSpecialization: if (const RecordType *Record = TP->getAs<RecordType>()) - D = Record->getDecl(); + D = Record->getOriginalDecl(); else D = cast<TemplateSpecializationType>(TP)->getTemplateName() .getAsTemplateDecl(); @@ -563,14 +564,10 @@ try_again: break; case Type::InjectedClassName: - D = cast<InjectedClassNameType>(TP)->getDecl(); + D = cast<InjectedClassNameType>(TP)->getOriginalDecl(); break; - // FIXME: Template type parameters! - - case Type::Elaborated: - TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull(); - goto try_again; + // FIXME: Template type parameters! default: break; @@ -990,7 +987,7 @@ CXType clang_Type_getClassType(CXType CT) { const Type *TP = T.getTypePtrOrNull(); if (TP && TP->getTypeClass() == Type::MemberPointer) { - ET = Ctx.getTypeDeclType( + ET = Ctx.getCanonicalTagType( cast<MemberPointerType>(TP)->getMostRecentCXXRecordDecl()); } return MakeCXType(ET, GetTU(CT)); @@ -1040,7 +1037,7 @@ static long long visitRecordForValidation(const RecordDecl *RD) { return CXTypeLayoutError_Dependent; // recurse if (const RecordType *ChildType = I->getType()->getAs<RecordType>()) { - if (const RecordDecl *Child = ChildType->getDecl()) { + if (const RecordDecl *Child = ChildType->getOriginalDecl()) { long long ret = visitRecordForValidation(Child); if (ret < 0) return ret; @@ -1390,10 +1387,9 @@ unsigned clang_Cursor_isInlineNamespace(CXCursor C) { CXType clang_Type_getNamedType(CXType CT){ QualType T = GetQualType(CT); - const Type *TP = T.getTypePtrOrNull(); - if (TP && TP->getTypeClass() == Type::Elaborated) - return MakeCXType(cast<ElaboratedType>(TP)->getNamedType(), GetTU(CT)); + if (!T.isNull() && !T.isCanonical()) + return MakeCXType(T, GetTU(CT)); return MakeCXType(QualType(), GetTU(CT)); } diff --git a/clang/tools/libclang/CursorVisitor.h b/clang/tools/libclang/CursorVisitor.h index 949b739..d5ab699 100644 --- a/clang/tools/libclang/CursorVisitor.h +++ b/clang/tools/libclang/CursorVisitor.h @@ -255,12 +255,12 @@ public: // Name visitor bool VisitDeclarationNameInfo(DeclarationNameInfo Name); - bool VisitNestedNameSpecifier(NestedNameSpecifier *NNS, SourceRange Range); bool VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS); // Template visitors bool VisitTemplateParameters(const TemplateParameterList *Params); - bool VisitTemplateName(TemplateName Name, SourceLocation Loc); + bool VisitTemplateName(TemplateName Name, SourceLocation NameLoc, + NestedNameSpecifierLoc NNS); bool VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL); // Type visitors |