Author: Evgeny Shulgin Date: 2022-10-23T23:17:56Z New Revision: 2bb50a55b0f5a88bd432ad2691060d82748b5bc0
URL: https://github.com/llvm/llvm-project/commit/2bb50a55b0f5a88bd432ad2691060d82748b5bc0 DIFF: https://github.com/llvm/llvm-project/commit/2bb50a55b0f5a88bd432ad2691060d82748b5bc0.diff LOG: [clang] Fix time profile in "isIntegerConstantExpr" The time profiler in `Expr::isIntegerConstantExpr` used to call `Loc->printToString`, it was inconsistent with other time profiles in the file and caused segfaults if `Loc` was `nullptr`. Fixes https://github.com/llvm/llvm-project/issues/58551 Reviewed By: dyung, jloser Differential Revision: https://reviews.llvm.org/D136549 Added: Modified: clang/lib/AST/ExprConstant.cpp clang/unittests/Support/TimeProfilerTest.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 4160aa6458c87..80541e077d4e5 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -15905,9 +15905,7 @@ bool Expr::isIntegerConstantExpr(const ASTContext &Ctx, assert(!isValueDependent() && "Expression evaluator can't be called on a dependent expression."); - llvm::TimeTraceScope TimeScope("isIntegerConstantExpr", [&] { - return Loc->printToString(Ctx.getSourceManager()); - }); + ExprTimeTraceScope TimeScope(this, Ctx, "isIntegerConstantExpr"); if (Ctx.getLangOpts().CPlusPlus11) return EvaluateCPlusPlus11IntegralConstantExpr(Ctx, this, nullptr, Loc); diff --git a/clang/unittests/Support/TimeProfilerTest.cpp b/clang/unittests/Support/TimeProfilerTest.cpp index a1b855493ab55..566cc6786461f 100644 --- a/clang/unittests/Support/TimeProfilerTest.cpp +++ b/clang/unittests/Support/TimeProfilerTest.cpp @@ -37,14 +37,14 @@ std::string teardownProfiler() { // Returns true if code compiles successfully. // We only parse AST here. This is enough for constexpr evaluation. -bool compileFromString(StringRef Code) { +bool compileFromString(StringRef Code, StringRef Standard, StringRef FileName) { CompilerInstance Compiler; Compiler.createDiagnostics(); auto Invocation = std::make_shared<CompilerInvocation>(); Invocation->getPreprocessorOpts().addRemappedFile( - "test.cc", MemoryBuffer::getMemBuffer(Code).release()); - const char *Args[] = {"-std=c++20", "test.cc"}; + FileName, MemoryBuffer::getMemBuffer(Code).release()); + const char *Args[] = {Standard.data(), FileName.data()}; CompilerInvocation::CreateFromArgs(*Invocation, Args, Compiler.getDiagnostics()); Compiler.setInvocation(std::move(Invocation)); @@ -143,7 +143,7 @@ std::string buildTraceGraph(StringRef Json) { } // namespace -TEST(TimeProfilerTest, ConstantEvaluation) { +TEST(TimeProfilerTest, ConstantEvaluationCxx20) { constexpr StringRef Code = R"( void print(double value); @@ -172,7 +172,7 @@ constexpr int slow_init_list[] = {1, 1, 2, 3, 5, 8, 13, 21}; // 25th line )"; setupProfiler(); - ASSERT_TRUE(compileFromString(Code)); + ASSERT_TRUE(compileFromString(Code, "-std=c++20", "test.cc")); std::string Json = teardownProfiler(); std::string TraceGraph = buildTraceGraph(Json); ASSERT_TRUE(TraceGraph == R"( @@ -197,3 +197,25 @@ Frontend // NOTE: If this test is failing, run this test with // `llvm::errs() << TraceGraph;` and change the assert above. } + +TEST(TimeProfilerTest, ConstantEvaluationC99) { + constexpr StringRef Code = R"( +struct { + short quantval[4]; // 3rd line +} value; + )"; + + setupProfiler(); + ASSERT_TRUE(compileFromString(Code, "-std=c99", "test.c")); + std::string Json = teardownProfiler(); + std::string TraceGraph = buildTraceGraph(Json); + ASSERT_TRUE(TraceGraph == R"( +Frontend +| isIntegerConstantExpr (<test.c:3:18>) +| EvaluateKnownConstIntCheckOverflow (<test.c:3:18>) +| PerformPendingInstantiations +)"); + + // NOTE: If this test is failing, run this test with + // `llvm::errs() << TraceGraph;` and change the assert above. +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits