https://github.com/seekamoon created https://github.com/llvm/llvm-project/pull/124376
When using `pp-trace` in practice, I noticed that the YAML files it generated could contain grammar errors, leading to failed parsing. Specifically, it is the `Args` of `MacroExpands`. E.g., ```YAML - Callback: MacroExpands MacroNameTok: EXPORT_TEMPLATE_STYLE MacroDefinition: [(local)] Range: [(nonfile), (nonfile)] Args: [, ] - Callback: MacroExpands MacroNameTok: IS_TYPE_FUNCTION_DECL MacroDefinition: [(local)] Range: ["../../src/objects/objects.h:660:1", "../../src/objects/objects.h:660:54"] Args: [NullOrUndefined, , ] - Callback: MacroExpands MacroNameTok: ABSL_INTERNAL_ANY_INVOCABLE_IMPL MacroDefinition: [(local)] Range: ["../../third_party/abseil-cpp/absl/functional/internal/any_invocable.h:868:1", "../../third_party/abseil-cpp/absl/functional/internal/any_invocable.h:868:39"] Args: [, , <amp>] ``` The rootcause is the `PPCallbacksTracker::appendArgument(const char *Name, const MacroArgs *Value)`. When iterating `Value`, sometimes the Token is eof, and the previous implementation did not take it into consideration. I fixed this bug and the output YAML code will be ```YAML - Callback: MacroExpands MacroNameTok: EXPORT_TEMPLATE_STYLE MacroDefinition: [(local)] Range: [(nonfile), (nonfile)] Args: [] - Callback: MacroExpands MacroNameTok: IS_TYPE_FUNCTION_DECL MacroDefinition: [(local)] Range: ["../../src/objects/objects.h:660:1", "../../src/objects/objects.h:660:54"] Args: [NullOrUndefined] - Callback: MacroExpands MacroNameTok: ABSL_INTERNAL_ANY_INVOCABLE_IMPL MacroDefinition: [(local)] Range: ["../../third_party/abseil-cpp/absl/functional/internal/any_invocable.h:868:1", "../../third_party/abseil-cpp/absl/functional/internal/any_invocable.h:868:39"] Args: [<amp>] ``` >From 0e78a2078fb58dabcf4a8acfd2bae868a6db4ca5 Mon Sep 17 00:00:00 2001 From: coolgao <cool...@purdue.edu> Date: Fri, 24 Jan 2025 19:26:28 -0500 Subject: [PATCH] bug fix for pp_trace --- clang-tools-extra/pp-trace/PPCallbacksTracker.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp b/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp index 3bb30fd15b2e1d..9c393ae3227097 100644 --- a/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp +++ b/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp @@ -604,11 +604,15 @@ void PPCallbacksTracker::appendArgument(const char *Name, llvm::raw_string_ostream SS(Str); SS << "["; + // Output ", " before outputing next argument + bool Comma = false; // Each argument is a series of contiguous Tokens, terminated by a eof. // Go through each argument printing tokens until we reach eof. for (unsigned I = 0; I < Value->getNumMacroArguments(); ++I) { const Token *Current = Value->getUnexpArgument(I); - if (I) + if (Current->is(tok::eof)) + continue; + if (Comma) SS << ", "; bool First = true; while (Current->isNot(tok::eof)) { @@ -625,6 +629,7 @@ void PPCallbacksTracker::appendArgument(const char *Name, ++Current; First = false; } + Comma = true; } SS << "]"; appendArgument(Name, SS.str()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits