Compare commits

...

3 Commits

Author SHA1 Message Date
rherilier
fc5da9796f
Merge 84b3c69ff5 into 3799e38920 2025-06-28 14:38:46 +07:00
Fangrui Song
3799e38920 Adapt llvmorg-21 changes: clang::CompilerInstance and llvm::PointerUnion 2025-05-11 23:37:30 -07:00
Rémi Hérilier
84b3c69ff5 cmake: Make sure to get the resource directory from the right clang compiler
The resource directory was always retrieved from the system's default clang
compiler instead of the targeted one.
2024-12-06 17:08:30 +01:00
3 changed files with 52 additions and 3 deletions

View File

@ -132,11 +132,30 @@ endif()
# Find Clang resource directory with Clang executable. # Find Clang resource directory with Clang executable.
if(NOT CLANG_RESOURCE_DIR) if(NOT CLANG_RESOURCE_DIR)
find_program(CLANG_EXECUTABLE clang) find_program(CLANG_EXECUTABLE clang-${Clang_VERSION_MAJOR} NAMES clang)
if(NOT CLANG_EXECUTABLE) if(NOT CLANG_EXECUTABLE)
message(FATAL_ERROR "clang executable not found.") message(FATAL_ERROR "clang executable not found.")
endif() endif()
execute_process(
COMMAND ${CLANG_EXECUTABLE} -dumpversion
RESULT_VARIABLE CLANG_DUMP_VERSION_RESULT
OUTPUT_VARIABLE CLANG_DUMP_VERSION
ERROR_VARIABLE CLANG_DUMP_VERSION_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(CLANG_DUMP_VERSION_RESULT)
message(FATAL_ERROR "Error retrieving Clang executable version. \
Output:\n${CLANG_DUMP_VERSION_ERROR}")
endif()
if (NOT ${CLANG_DUMP_VERSION} STREQUAL ${Clang_VERSION})
message(FATAL_ERROR "Clang libraries and executable versions differs:\n\
librairies have version ${Clang_VERSION} and executable has version \
${CLANG_DUMP_VERSION}.")
endif()
execute_process( execute_process(
COMMAND ${CLANG_EXECUTABLE} -print-resource-dir COMMAND ${CLANG_EXECUTABLE} -print-resource-dir
RESULT_VARIABLE CLANG_FIND_RESOURCE_DIR_RESULT RESULT_VARIABLE CLANG_FIND_RESOURCE_DIR_RESULT

View File

@ -377,10 +377,17 @@ const Decl *getAdjustedDecl(const Decl *d) {
if (!s->isExplicitSpecialization()) { if (!s->isExplicitSpecialization()) {
llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result = llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result =
s->getSpecializedTemplateOrPartial(); s->getSpecializedTemplateOrPartial();
if (result.is<ClassTemplateDecl *>()) #if LLVM_VERSION_MAJOR >= 21
if (auto *ctd = dyn_cast<ClassTemplateDecl *>(result))
d = ctd;
else
d = cast<ClassTemplatePartialSpecializationDecl *>(result);
#else
if (isa<ClassTemplateDecl *>(result))
d = result.get<ClassTemplateDecl *>(); d = result.get<ClassTemplateDecl *>();
else else
d = result.get<ClassTemplatePartialSpecializationDecl *>(); d = result.get<ClassTemplatePartialSpecializationDecl *>();
#endif
continue; continue;
} }
} else if (auto *d1 = r->getInstantiatedFromMemberClass()) { } else if (auto *d1 = r->getInstantiatedFromMemberClass()) {
@ -964,10 +971,17 @@ public:
else if (auto *sd = dyn_cast<ClassTemplateSpecializationDecl>(rd)) { else if (auto *sd = dyn_cast<ClassTemplateSpecializationDecl>(rd)) {
llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result = llvm::PointerUnion<ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl *> result =
sd->getSpecializedTemplateOrPartial(); sd->getSpecializedTemplateOrPartial();
#if LLVM_VERSION_MAJOR >= 21
if (auto *ctd = dyn_cast<ClassTemplateDecl *>(result))
d1 = ctd;
else
d1 = cast<ClassTemplatePartialSpecializationDecl *>(result);
#else
if (result.is<ClassTemplateDecl *>()) if (result.is<ClassTemplateDecl *>())
d1 = result.get<ClassTemplateDecl *>(); d1 = result.get<ClassTemplateDecl *>();
else else
d1 = result.get<ClassTemplatePartialSpecializationDecl *>(); d1 = result.get<ClassTemplatePartialSpecializationDecl *>();
#endif
} else } else
d1 = rd->getInstantiatedFromMemberClass(); d1 = rd->getInstantiatedFromMemberClass();
@ -1241,15 +1255,23 @@ IndexResult index(SemaManager *manager, WorkingFiles *wfiles, VFS *vfs, const st
} }
IndexDiags dc; IndexDiags dc;
#if LLVM_VERSION_MAJOR >= 21
auto clang = std::make_unique<CompilerInstance>(std::move(ci), pch);
#else
auto clang = std::make_unique<CompilerInstance>(pch); auto clang = std::make_unique<CompilerInstance>(pch);
clang->setInvocation(std::move(ci)); clang->setInvocation(std::move(ci));
#endif
clang->createDiagnostics( clang->createDiagnostics(
#if LLVM_VERSION_MAJOR >= 20 #if LLVM_VERSION_MAJOR >= 20
*fs, *fs,
#endif #endif
&dc, false); &dc, false);
clang->getDiagnostics().setIgnoreAllWarnings(true); clang->getDiagnostics().setIgnoreAllWarnings(true);
#if LLVM_VERSION_MAJOR >= 21
clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getTargetOpts()));
#else
clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts)); clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts));
#endif
if (!clang->hasTarget()) if (!clang->hasTarget())
return {}; return {};
clang->getPreprocessorOpts().RetainRemappedFileBuffers = true; clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;

View File

@ -261,14 +261,22 @@ std::unique_ptr<CompilerInstance> buildCompilerInstance(Session &session, std::u
else else
ci->getPreprocessorOpts().addRemappedFile(main, buf.get()); ci->getPreprocessorOpts().addRemappedFile(main, buf.get());
#if LLVM_VERSION_MAJOR >= 21
auto clang = std::make_unique<CompilerInstance>(std::move(ci), session.pch);
#else
auto clang = std::make_unique<CompilerInstance>(session.pch); auto clang = std::make_unique<CompilerInstance>(session.pch);
clang->setInvocation(std::move(ci)); clang->setInvocation(std::move(ci));
#endif
clang->createDiagnostics( clang->createDiagnostics(
#if LLVM_VERSION_MAJOR >= 20 #if LLVM_VERSION_MAJOR >= 20
*fs, *fs,
#endif #endif
&dc, false); &dc, false);
#if LLVM_VERSION_MAJOR >= 21
clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getTargetOpts()));
#else
clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts)); clang->setTarget(TargetInfo::CreateTargetInfo(clang->getDiagnostics(), clang->getInvocation().TargetOpts));
#endif
if (!clang->hasTarget()) if (!clang->hasTarget())
return nullptr; return nullptr;
clang->getPreprocessorOpts().RetainRemappedFileBuffers = true; clang->getPreprocessorOpts().RetainRemappedFileBuffers = true;