elsteveogrande updated this revision to Diff 73720. elsteveogrande marked an inline comment as done. elsteveogrande added a comment.
Using `consume_front(sequence)`, cleaner escaping code. https://reviews.llvm.org/D25153 Files: include/clang/Driver/Options.td include/clang/Frontend/PreprocessorOutputOptions.h lib/Frontend/CompilerInvocation.cpp lib/Frontend/PrintPreprocessedOutput.cpp test/Preprocessor/dump_import.h test/Preprocessor/dump_import.m test/Preprocessor/dump_include.c test/Preprocessor/dump_include.h
Index: test/Preprocessor/dump_include.h =================================================================== --- /dev/null +++ test/Preprocessor/dump_include.h @@ -0,0 +1,2 @@ +#pragma once +#define DUMP_INCLUDE_TESTVAL 1 Index: test/Preprocessor/dump_include.c =================================================================== --- /dev/null +++ test/Preprocessor/dump_include.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -w -E -dI -isystem %S %s -o - | grep '^#include *<dump_' +// RUN: %clang_cc1 -w -E -dI -isystem %S %s -o - | grep '^#include *"dump_' +// RUN: %clang_cc1 -w -E -dI -isystem %S %s -o - | grep '^#include_next *"dump_' +// RUN: %clang_cc1 -w -E -dI -isystem %S -imacros %S/dump_include.h %s -o - | grep '^#__include_macros "/.*/dump_' + +// See also `dump_import.m` which tests the `#import` directive with `-dI`. + +#include <dump_include.h> +#include "dump_include.h" +#include_next "dump_include.h" Index: test/Preprocessor/dump_import.m =================================================================== --- /dev/null +++ test/Preprocessor/dump_import.m @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -E -dI %s -o - | grep '^#import' + +// See also `dump_include.c` which tests other inclusion cases with `-dI`. + +#import "dump_import.h" Index: test/Preprocessor/dump_import.h =================================================================== --- /dev/null +++ test/Preprocessor/dump_import.h @@ -0,0 +1 @@ +#define DUMP_IMPORT_TESTVAL 1 Index: lib/Frontend/PrintPreprocessedOutput.cpp =================================================================== --- lib/Frontend/PrintPreprocessedOutput.cpp +++ lib/Frontend/PrintPreprocessedOutput.cpp @@ -28,6 +28,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include <cstdio> + using namespace clang; /// PrintMacroDefinition - Print a macro definition in a form that will be @@ -93,13 +94,16 @@ bool Initialized; bool DisableLineMarkers; bool DumpDefines; + bool DumpIncludeDirectives; bool UseLineDirectives; bool IsFirstFileEntered; public: PrintPPOutputPPCallbacks(Preprocessor &pp, raw_ostream &os, bool lineMarkers, - bool defines, bool UseLineDirectives) + bool defines, bool DumpIncludeDirectives, + bool UseLineDirectives) : PP(pp), SM(PP.getSourceManager()), ConcatInfo(PP), OS(os), DisableLineMarkers(lineMarkers), DumpDefines(defines), + DumpIncludeDirectives(DumpIncludeDirectives), UseLineDirectives(UseLineDirectives) { CurLine = 0; CurFilename += "<uninit>"; @@ -311,6 +315,34 @@ } } +/// Escape a pathname appropriate for use in preprocessed output, e.g. if using +/// '-dI' to print info about inclusions of a header within the given \p Path. +/// +/// This escapes certain characters unsafe for strings within double-quotes, in +/// turn within a block comment, using a backslash. Thus the double-quote and +/// backslash chars are escaped with `\`. A `*/` (end-of-block-comment) +/// sequence will become `*\/`. +/// +/// \param Path path name. +/// \returns escaped string represented the given path. +static std::string sanitizePath(StringRef Path) { + std::string Result; + Result.reserve(Path.size() * 2); + while (!Path.empty()) { + if (Path.consume_front("\\")) { + Result += "\\\\"; + } else if (Path.consume_front("*/")) { + Result += "*\\/"; + } else if (Path.consume_front("\"")) { + Result += "\\\""; + } else { + Result += Path.front(); + Path = Path.drop_front(); + } + } + return Result; +} + void PrintPPOutputPPCallbacks::InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok, StringRef FileName, @@ -320,20 +352,20 @@ StringRef SearchPath, StringRef RelativePath, const Module *Imported) { - // When preprocessing, turn implicit imports into @imports. - // FIXME: This is a stop-gap until a more comprehensive "preprocessing with - // modules" solution is introduced. if (Imported) { + // When preprocessing, turn implicit imports into @imports. + // FIXME: This is a stop-gap until a more comprehensive "preprocessing with + // modules" solution is introduced. startNewLineIfNeeded(); MoveToLine(HashLoc); if (PP.getLangOpts().ObjC2) { OS << "@import " << Imported->getFullModuleName() << ";" << " /* clang -E: implicit import for \"" << File->getName() << "\" */"; } else { - // FIXME: Preseve whether this was a - // #include/#include_next/#include_macros/#import. - OS << "#include " + const std::string TokenText = PP.getSpelling(IncludeTok); + assert(!TokenText.empty()); + OS << "#" << TokenText << " " << (IsAngled ? '<' : '"') << FileName << (IsAngled ? '>' : '"') @@ -344,6 +376,27 @@ // line immediately. EmittedTokensOnThisLine = true; startNewLineIfNeeded(); + } else { + // Not a module import; it's a more vanilla inclusion of some file using one + // of: #include, #import, #include_next, #include_macros. + if (DumpIncludeDirectives) { + const std::string TokenText = PP.getSpelling(IncludeTok); + assert(!TokenText.empty()); + OS << "#" << TokenText << " " + << (IsAngled ? '<' : '"') << FileName << (IsAngled ? '>' : '"') + << " /* clang -E -dI:"; + if (SearchPath.size() > 0) { + // Print out info about the search path within this comment. We need + // to escape it because we're printing a quoted string within the + // comment block. + OS << " path=\"" << sanitizePath(SearchPath) << "\""; + } else { + OS << " absolute"; + } + OS << " */"; + setEmittedDirectiveOnThisLine(); + startNewLineIfNeeded(); + } } } @@ -751,7 +804,8 @@ PP.SetCommentRetentionState(Opts.ShowComments, Opts.ShowMacroComments); PrintPPOutputPPCallbacks *Callbacks = new PrintPPOutputPPCallbacks( - PP, *OS, !Opts.ShowLineMarkers, Opts.ShowMacros, Opts.UseLineDirectives); + PP, *OS, !Opts.ShowLineMarkers, Opts.ShowMacros, + Opts.ShowIncludeDirectives, Opts.UseLineDirectives); // Expand macros in pragmas with -fms-extensions. The assumption is that // the majority of pragmas in such a file will be Microsoft pragmas. Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -2332,6 +2332,7 @@ Opts.ShowLineMarkers = !Args.hasArg(OPT_P); Opts.ShowMacroComments = Args.hasArg(OPT_CC); Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); + Opts.ShowIncludeDirectives = Args.hasArg(OPT_dI); Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes); Opts.UseLineDirectives = Args.hasArg(OPT_fuse_line_directives); } Index: include/clang/Frontend/PreprocessorOutputOptions.h =================================================================== --- include/clang/Frontend/PreprocessorOutputOptions.h +++ include/clang/Frontend/PreprocessorOutputOptions.h @@ -22,6 +22,7 @@ unsigned UseLineDirectives : 1; ///< Use \#line instead of GCC-style \# N. unsigned ShowMacroComments : 1; ///< Show comments, even in macros. unsigned ShowMacros : 1; ///< Print macro definitions. + unsigned ShowIncludeDirectives : 1; ///< Print includes, imports etc. within preprocessed output. unsigned RewriteIncludes : 1; ///< Preprocess include directives only. public: @@ -32,6 +33,7 @@ UseLineDirectives = 0; ShowMacroComments = 0; ShowMacros = 0; + ShowIncludeDirectives = 0; RewriteIncludes = 0; } }; Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -429,6 +429,8 @@ def dA : Flag<["-"], "dA">, Group<d_Group>; def dD : Flag<["-"], "dD">, Group<d_Group>, Flags<[CC1Option]>, HelpText<"Print macro definitions in -E mode in addition to normal output">; +def dI : Flag<["-"], "dI">, Group<d_Group>, Flags<[CC1Option]>, + HelpText<"Print include directives in -E mode in addition to normal output">; def dM : Flag<["-"], "dM">, Group<d_Group>, Flags<[CC1Option]>, HelpText<"Print macro definitions in -E mode instead of normal output">; def dead__strip : Flag<["-"], "dead_strip">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits