csmith-project / creduce

C-Reduce, a C and C++ program reducer
Other
1.31k stars 123 forks source link

Support LLVM 19 #276

Open lazka opened 1 week ago

lazka commented 1 week ago

Current master doesn't build with LLVM 19. I've tried to track down some of the API changes in LLVM and adjusted the code so it builds again, but there are more warnings (unhandled switch case values.. maybe that was there before), and I don't know anything about all of this, so I hope this can be a starting point for someone more knowledgeable:

Relevant upstream API changes:

Here is a minimal patch to get it to build:

```patch --- creduce/clang_delta/ExpressionDetector.cpp 2024-11-13 22:04:35.755591600 +0100 +++ creduce/clang_delta/ExpressionDetector.cpp 2024-11-13 22:01:03.336578100 +0100 @@ -64,7 +64,8 @@ StringRef FileName, bool IsAngled, CharSourceRange FilenameRange, OptionalFileEntryRef File, StringRef SearchPath, StringRef RelativePath, - const Module *Imported, + const Module *SuggestedModule, + bool ModuleImported, SrcMgr::CharacteristicKind FileType) override; private: @@ -85,7 +86,8 @@ OptionalFileEntryRef /*File*/, StringRef /*SearchPath*/, StringRef /*RelativePath*/, - const Module * /*Imported*/, + const Module * /*SuggestedModule*/, + bool /*ModuleImported*/, SrcMgr::CharacteristicKind /*FileType*/) { if (!SrcManager.isInMainFile(HashLoc)) @@ -118,7 +120,7 @@ const VarDecl *VD = dyn_cast(DRE->getDecl()); if (!VD) return true; - if (VD->getName().startswith(Prefix)) + if (VD->getName().starts_with(Prefix)) TmpVars.push_back(VD); return true; } @@ -363,7 +365,7 @@ { if (!VD) return; - if (!VD->getName().startswith(TmpVarNamePrefix)) + if (!VD->getName().starts_with(TmpVarNamePrefix)) return; if (const Expr *E = VD->getInit()) ProcessedExprs[VD] = E->IgnoreParenImpCasts(); @@ -374,9 +376,9 @@ StringRef Name = ND->getName(); // We don't want to repeatly replace temporary variables // __creduce_expr_tmp_xxx, __creduce_printed_yy and __creduce_checked_zzz. - return Name.startswith(TmpVarNamePrefix) || - Name.startswith(PrintedVarNamePrefix) || - Name.startswith(CheckedVarNamePrefix); + return Name.starts_with(TmpVarNamePrefix) || + Name.starts_with(PrintedVarNamePrefix) || + Name.starts_with(CheckedVarNamePrefix); } // Reference: IdenticalExprChecker.cpp from Clang @@ -524,8 +526,8 @@ if (const DeclRefExpr *SubE = dyn_cast(UO->getSubExpr()->IgnoreParenCasts())) { StringRef SubEName = SubE->getDecl()->getName(); - if (SubEName.startswith(PrintedVarNamePrefix) || - SubEName.startswith(CheckedVarNamePrefix)) + if (SubEName.starts_with(PrintedVarNamePrefix) || + SubEName.starts_with(CheckedVarNamePrefix)) return false; } } @@ -541,7 +543,7 @@ bool IsLit = SC == Stmt::IntegerLiteralClass || SC == Stmt::FloatingLiteralClass; if (IsLit && DRE && - DRE->getDecl()->getName().startswith(TmpVarNamePrefix) && + DRE->getDecl()->getName().starts_with(TmpVarNamePrefix) && S->getStmtClass() == Stmt::IfStmtClass) { return false; } diff -Nur creduce/clang_delta/RemoveNamespace.cpp creduce/clang_delta/RemoveNamespace.cpp --- creduce/clang_delta/RemoveNamespace.cpp 2024-11-13 22:04:35.771339900 +0100 +++ creduce/clang_delta/RemoveNamespace.cpp 2024-11-13 21:55:02.235178400 +0100 @@ -944,7 +944,7 @@ TransAssert(IdInfo && "Invalid IdentifierInfo!"); NewName += IdInfo->getName(); // Make sure we have valid suffix for user literals - if (IsUserLiteral && IdInfo->getName().startswith("_")) { + if (IsUserLiteral && IdInfo->getName().starts_with("_")) { NewName = "_" + NewName; } NamedDeclToNewName[ND] = NewName; diff -Nur creduce/clang_delta/RenameCXXMethod.cpp creduce/clang_delta/RenameCXXMethod.cpp --- creduce/clang_delta/RenameCXXMethod.cpp 2024-11-13 22:04:35.787084600 +0100 +++ creduce/clang_delta/RenameCXXMethod.cpp 2024-11-13 22:03:22.949186100 +0100 @@ -426,7 +426,7 @@ { size_t PrefixLen = MethodNamePrefix.length(); StringRef NamePrefix = Name.substr(0, PrefixLen); - if (!NamePrefix.equals(MethodNamePrefix)) + if (NamePrefix != MethodNamePrefix) return false; llvm::APInt Num; return !Name.drop_front(PrefixLen).getAsInteger(10, Num); ```